/usr/share/psychtoolbox-3/PsychTests/DatapixxGPUDitherpatternTest.m is in psychtoolbox-3-common 3.0.14.20170103+git6-g605ff5c.dfsg1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | function DatapixxGPUDitherpatternTest(fullscreen)
% DatapixxGPUDitherpatternTest([fullscreen=1])
%
% Low level diagnostic for GPU dithering via a VPixx
% devices like Datapixx/ViewPixx/Propixx, or a CRS
% device like the Bits# - but *not* the original Bits+.
%
% Steps through all 256 grayscale levels and uses
% Datapixx et al. scanline readback to check what
% the GPU actually outputs. Plots it and prints
% the first 10 pixels of the topmost output scanline.
%
% This is meant to facilitate low-level diagnosis
% of GPU dithering bugs if our regular test script
% BitsPlusIdentityClutTest.m reports dithering trouble
% and can't fix the problem automatically.
%
% 'fullscreen' Defaults to 1 for fullscreen windows.
% 0 = Use a windowed window at top of screen for
% display to also diagnose possible compositor
% interference.
%
% History:
% 13-Aug-2015 mk Wrote it.
% 03-Jul-2016 mk Add support for CRS Bits#.
PsychDefaultSetup(0);
if nargin < 1 || isempty(fullscreen)
fullscreen = 1;
end
screenid = max(Screen('Screens'));
if fullscreen
rect = [];
else
rect = [0, 0, Screen('WindowSize', screenid), 90];
end
if BitsPlusPlus('OpenBits#')
BitsPlusPlus('SwitchToStatusScreen');
WaitSecs(4);
bitssharp = 1;
else
Datapixx('Open');
bitssharp = 0;
end
w = Screen('Openwindow', screenid, 0, rect);
LoadIdentityClut(w);
even = zeros(1,256);
odd = even;
trouble = 0;
fprintf('\n\n\n\n');
for i = 0:255
Screen('FillRect', w, i);
Screen('Flip', w);
if bitssharp
WaitSecs('YieldSecs', 3 * Screen('GetFlipInterval', w));
% Readback 2nd topmost scanline from Bits# :
pixels = BitsPlusPlus('GetVideoLine', 256, 2);
else
Datapixx('RegWrRdVideoSync');
Datapixx('RegWrRdVideoSync');
Datapixx('RegWrRdVideoSync');
pixels = Datapixx('GetVideoLine');
end
pixels = pixels(1,1:10);
fprintf('Ref %i: ', i);
fprintf('%i ', pixels);
if (range(pixels) ~= 0) || (pixels(1,1) ~= i)
fprintf(' --> TROUBLE!');
trouble = trouble + 1;
end
fprintf('\n');
even(i+1) = pixels(1,1);
odd(i+1) = pixels(1, 2);
end
if bitssharp
BitsPlusPlus('SwitchToBits++');
BitsPlusPlus('Close');
else
Datapixx('Close');
end
sca;
if trouble > 0
fprintf('\n\nFAILURE! Many wrong pixels detected! Trouble for %i separate levels!!!\n', trouble);
close all;
plot(0:255, even, 'r', 0:255, odd, 'g');
else
fprintf('\n\nALL GOOD :)\n');
end
return;
|