This file is indexed.

/usr/share/psychtoolbox-3/PsychTests/BeampositionTest.m is in psychtoolbox-3-common 3.0.11.20140816.dfsg1-1.

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
function BeampositionTest(n, screenid, synced)
% BeampositionTest - Test GPU scanout position ("beamposition") queries.
%
% Usage: BeampositionTest([n=10000][, screenid=max][, synced=0])
%
% Opens a onscreen window on screen 'screenid' (default = maximum screenid)
% and runs a sample loop, performing 'n' (default 10000) beamposition
% queries, either as fast as it can if 'synced' == 0, or it performs
% Screen('Flip') and takes one sample after each flip, ie., in sync with
% vertical retrace.
%
% Then it plots its samples in multiple figures:
% Beamposition vs. sample count, Beamposition vs. time, a histogram of all
% sampled beampositions, and the duration of each query in msecs.
%
% Here's what you should see on a properly working system:
%
% Beamposition against time or samplecount should show a periodic sawtooth pattern,
% where scanout starts at zero and increments up to the value VBL Endline,
% as reported by PTB's Matlab output. The histogram should show an even
% distribution (a flat line) across all bins from bin 0 to bin "VBL
% Endline". Query times should be in the low microsecond range, e.g.,
% not much more than 20-30 usecs on a modern machine on average.
%
% Other things you might see:
%
% Periodic spikes in the query times and possibly some gaps, or total loss
% of signal in the histogram at values higher than "VBL Startline" and or a
% spike in the histogram for beamposition bin zero: Your graphics driver or
% hardware has a small bug for which PTB can compensate, at the cost of
% higher query times and thereby slightly degraded realtime behaviour of
% your system. This is usually accompanied by some warnings wrt. slightly
% broken beamposition queries.
%
% No spikes in query times but no values abouve "VBL Startline" at all in
% the histograms and plots: A slightly broken graphics driver, but PTB
% couldn't compensate for the bug because it didn't detect the problem.
% Manual ways to enable the workaround are explained in 'help
% ConserveVRAMSettings', section 'kPsychUseBeampositionQueryWorkaround'.
%
% Beampositions implausibly high or low for your display. PTB may query the
% wrong display on a multi-display setup. See 'help DisplayOutputMappings'
% for remedies.
%
% A flat-line of all-zero beampositions: Beamposition queries are
% unsupported, disabled or broken on your setup. If you know they should
% work, then PTB may query the wrong display on a multi-display setup. See
% 'help DisplayOutputMappings' for remedies. Another possible fix is
% installing and loading the PsychtoolboxKernelDriver on OSX ('help
% PsychtoolboxKernelDriver') or running PsychLinuxConfiguration on Linux
% and rebooting the machine once to enable our own beamposition query
% mechanism. On Linux this is not needed when using the free and
% open-source graphics drivers, as these have a builtin timestamping
% mechanism which is even more robust and precise than beampositionq
% queries. On Linux with NVidia or AMD proprietary binary drivers this is
% always needed once for a given machine. On OSX it is increasingly needed
% due to total lack of OS support on Intel and AMD graphics cards and
% increasingly broken support for NVidia graphics cards. On OSX with NVidia
% graphics cards you additionally need to apply the measures explained in
% 'help ConserveVRAMSettings' - the section about kPsychDontUseNativeBeamposQuery.
%
% A flat-line not at zero, but at some fixed value. See previous paragraph:
% Install the kernel drivers or setup Linux properly, apply the kPsychDontUseNativeBeamposQuery
% fix on OSX, possibly apply measures from 'help DisplayOutputMappings'.
%
% Weird looking non-sawtooth patterns: This is a totally broken graphics
% driver, often to be found on Apple machines running OSX with Apple Retina
% displays or other LCD flat panels. See previous paragraph for fixes.
%
% -> Most fixes involve switching to our own implementation of beamposition
% queries instead of using broken or missing OS implementations, and then
% some fiddling around.
%
% -> On MS-Windows there's usually no way to fix broken queries beyond the
% automatic fixes applied by Screen() if it detects a problem.
%

% History:
% ??/??/????  mk     Written.
% 10.01.2013  iandol Cleanup of code, fixes, beautification of plots.
%

AssertOpenGL;

if nargin < 1 || isempty(n)
    n = 10000;
end

if nargin < 2 || isempty(screenid)
    screenid = max(Screen('Screens'));
end
fprintf('Testing screen #: %g\n',screenid);

if nargin < 3 || isempty(synced)
    synced = 0;
end

w=Screen('OpenWindow', screenid, 0);
Screen('Flip',w);
beampos = zeros(n, 1);
t = zeros(n, 1);
for i=1:n
    if synced
        Screen('Flip', w);
    end
    beampos(i) = Screen('GetWindowInfo', w, 1);
    t(i) = GetSecs;
end

% Extract VBLEndline for number of bins in histogram plot:
winfo = Screen('GetWindowInfo', w);
VBLEndline = winfo.VBLEndline;

% Skip this test if VBLEndline == -1 aka beamposition queries broken or
% disabled. Otherwise we would hang infinitely here:
if VBLEndline > -1
    while Screen('GetWindowInfo', w, 1) < 500; end;
    ta=GetSecs;
    while Screen('GetWindowInfo', w, 1) < 515; end;
    te=GetSecs;
    
    tel = (te - ta) * 1000
else
    fprintf('WARNING: Beamposition queries broken or disabled or unsupported on your setup!\n');
end

Screen('CloseAll');

figure;
subplot(2,2,1)
plot(beampos,'k-');
axis tight
title(['BeamPosition: Screen ' num2str(screenid)]); ylabel('Scanlines'); xlabel('Loop #')
subplot(2,2,2)
plot(diff(t)*1000,'k.');
axis tight
title('TimeStamp Deltas'); ylabel('Time (ms)'); xlabel('Loop #')
subplot(2,2,3)
hist(beampos, VBLEndline + 10);
axis tight
title('Histogram of BeamPosition'); ylabel('Number'); xlabel('Scanline #')
subplot(2,2,4)
plot(t, beampos,'k-');
axis tight
title('BeamPosition against Timestamp'); ylabel('Scanlines'); xlabel('Time (s)')
return;