1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Buffer data upload performance tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3pBufferDataUploadTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsCalibration.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuCPUWarmup.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
39*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
40*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
43*35238bceSAndroid Build Coastguard Worker #include "deThread.h"
44*35238bceSAndroid Build Coastguard Worker #include "deMeta.hpp"
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker #include <algorithm>
47*35238bceSAndroid Build Coastguard Worker #include <iomanip>
48*35238bceSAndroid Build Coastguard Worker #include <limits>
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker namespace deqp
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker namespace gles3
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker namespace Performance
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker namespace
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard Worker using de::meta::EnableIf;
60*35238bceSAndroid Build Coastguard Worker using de::meta::Not;
61*35238bceSAndroid Build Coastguard Worker using gls::LineParametersWithConfidence;
62*35238bceSAndroid Build Coastguard Worker using gls::theilSenSiegelLinearRegression;
63*35238bceSAndroid Build Coastguard Worker
64*35238bceSAndroid Build Coastguard Worker static const char *const s_minimalVertexShader = "#version 300 es\n"
65*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
66*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
67*35238bceSAndroid Build Coastguard Worker "{\n"
68*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
69*35238bceSAndroid Build Coastguard Worker "}\n";
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker static const char *const s_minimalFragnentShader = "#version 300 es\n"
72*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
73*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
74*35238bceSAndroid Build Coastguard Worker "{\n"
75*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
76*35238bceSAndroid Build Coastguard Worker "}\n";
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker static const char *const s_colorVertexShader = "#version 300 es\n"
79*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
80*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_color;\n"
81*35238bceSAndroid Build Coastguard Worker "out highp vec4 v_color;\n"
82*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
83*35238bceSAndroid Build Coastguard Worker "{\n"
84*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
85*35238bceSAndroid Build Coastguard Worker " v_color = a_color;\n"
86*35238bceSAndroid Build Coastguard Worker "}\n";
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker static const char *const s_colorFragmentShader = "#version 300 es\n"
89*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
90*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
91*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
92*35238bceSAndroid Build Coastguard Worker "{\n"
93*35238bceSAndroid Build Coastguard Worker " dEQP_FragColor = v_color;\n"
94*35238bceSAndroid Build Coastguard Worker "}\n";
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker struct SingleOperationDuration
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
99*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration; // used for fitting
100*35238bceSAndroid Build Coastguard Worker };
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker struct MapBufferRangeDuration
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker uint64_t mapDuration;
105*35238bceSAndroid Build Coastguard Worker uint64_t unmapDuration;
106*35238bceSAndroid Build Coastguard Worker uint64_t writeDuration;
107*35238bceSAndroid Build Coastguard Worker uint64_t allocDuration;
108*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
111*35238bceSAndroid Build Coastguard Worker };
112*35238bceSAndroid Build Coastguard Worker
113*35238bceSAndroid Build Coastguard Worker struct MapBufferRangeDurationNoAlloc
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker uint64_t mapDuration;
116*35238bceSAndroid Build Coastguard Worker uint64_t unmapDuration;
117*35238bceSAndroid Build Coastguard Worker uint64_t writeDuration;
118*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
121*35238bceSAndroid Build Coastguard Worker };
122*35238bceSAndroid Build Coastguard Worker
123*35238bceSAndroid Build Coastguard Worker struct MapBufferRangeFlushDuration
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker uint64_t mapDuration;
126*35238bceSAndroid Build Coastguard Worker uint64_t unmapDuration;
127*35238bceSAndroid Build Coastguard Worker uint64_t writeDuration;
128*35238bceSAndroid Build Coastguard Worker uint64_t flushDuration;
129*35238bceSAndroid Build Coastguard Worker uint64_t allocDuration;
130*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
131*35238bceSAndroid Build Coastguard Worker
132*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
133*35238bceSAndroid Build Coastguard Worker };
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker struct MapBufferRangeFlushDurationNoAlloc
136*35238bceSAndroid Build Coastguard Worker {
137*35238bceSAndroid Build Coastguard Worker uint64_t mapDuration;
138*35238bceSAndroid Build Coastguard Worker uint64_t unmapDuration;
139*35238bceSAndroid Build Coastguard Worker uint64_t writeDuration;
140*35238bceSAndroid Build Coastguard Worker uint64_t flushDuration;
141*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
144*35238bceSAndroid Build Coastguard Worker };
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker struct RenderReadDuration
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker uint64_t renderDuration;
149*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
150*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
151*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
154*35238bceSAndroid Build Coastguard Worker };
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker struct UnrelatedUploadRenderReadDuration
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker uint64_t renderDuration;
159*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
160*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
161*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
164*35238bceSAndroid Build Coastguard Worker };
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker struct UploadRenderReadDuration
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker uint64_t uploadDuration;
169*35238bceSAndroid Build Coastguard Worker uint64_t renderDuration;
170*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
171*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
172*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
175*35238bceSAndroid Build Coastguard Worker };
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker struct UploadRenderReadDurationWithUnrelatedUploadSize
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker uint64_t uploadDuration;
180*35238bceSAndroid Build Coastguard Worker uint64_t renderDuration;
181*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
182*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
183*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
184*35238bceSAndroid Build Coastguard Worker
185*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
186*35238bceSAndroid Build Coastguard Worker };
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker struct RenderUploadRenderReadDuration
189*35238bceSAndroid Build Coastguard Worker {
190*35238bceSAndroid Build Coastguard Worker uint64_t firstRenderDuration;
191*35238bceSAndroid Build Coastguard Worker uint64_t uploadDuration;
192*35238bceSAndroid Build Coastguard Worker uint64_t secondRenderDuration;
193*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
194*35238bceSAndroid Build Coastguard Worker uint64_t totalDuration;
195*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker uint64_t fitResponseDuration;
198*35238bceSAndroid Build Coastguard Worker };
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker template <typename SampleT>
201*35238bceSAndroid Build Coastguard Worker struct UploadSampleResult
202*35238bceSAndroid Build Coastguard Worker {
203*35238bceSAndroid Build Coastguard Worker typedef SampleT SampleType;
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker int bufferSize;
206*35238bceSAndroid Build Coastguard Worker int allocatedSize;
207*35238bceSAndroid Build Coastguard Worker int writtenSize;
208*35238bceSAndroid Build Coastguard Worker SampleType duration;
209*35238bceSAndroid Build Coastguard Worker };
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker template <typename SampleT>
212*35238bceSAndroid Build Coastguard Worker struct RenderSampleResult
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker typedef SampleT SampleType;
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker int uploadedDataSize;
217*35238bceSAndroid Build Coastguard Worker int renderDataSize;
218*35238bceSAndroid Build Coastguard Worker int unrelatedDataSize;
219*35238bceSAndroid Build Coastguard Worker int numVertices;
220*35238bceSAndroid Build Coastguard Worker SampleT duration;
221*35238bceSAndroid Build Coastguard Worker };
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker struct SingleOperationStatistics
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker float minTime;
226*35238bceSAndroid Build Coastguard Worker float maxTime;
227*35238bceSAndroid Build Coastguard Worker float medianTime;
228*35238bceSAndroid Build Coastguard Worker float min2DecileTime; // !< minimum value in the 2nd decile
229*35238bceSAndroid Build Coastguard Worker float max9DecileTime; // !< maximum value in the 9th decile
230*35238bceSAndroid Build Coastguard Worker };
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker struct SingleCallStatistics
233*35238bceSAndroid Build Coastguard Worker {
234*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker float medianRate;
237*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
238*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
239*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
242*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
243*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
244*35238bceSAndroid Build Coastguard Worker };
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker struct MapCallStatistics
247*35238bceSAndroid Build Coastguard Worker {
248*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics map;
249*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics unmap;
250*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics write;
251*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics alloc;
252*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker float medianRate;
255*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
256*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
257*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
260*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
261*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
262*35238bceSAndroid Build Coastguard Worker };
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker struct MapFlushCallStatistics
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics map;
267*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics unmap;
268*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics write;
269*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics flush;
270*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics alloc;
271*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker float medianRate;
274*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
275*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
276*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
279*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
280*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
281*35238bceSAndroid Build Coastguard Worker };
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker struct RenderReadStatistics
284*35238bceSAndroid Build Coastguard Worker {
285*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics render;
286*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics read;
287*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
288*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics total;
289*35238bceSAndroid Build Coastguard Worker
290*35238bceSAndroid Build Coastguard Worker float medianRate;
291*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
292*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
293*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
294*35238bceSAndroid Build Coastguard Worker
295*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
296*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
297*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
298*35238bceSAndroid Build Coastguard Worker };
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker struct UploadRenderReadStatistics
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics upload;
303*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics render;
304*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics read;
305*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
306*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics total;
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker float medianRate;
309*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
310*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
311*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
314*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
315*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
316*35238bceSAndroid Build Coastguard Worker };
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker struct RenderUploadRenderReadStatistics
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics firstRender;
321*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics upload;
322*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics secondRender;
323*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics read;
324*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics result;
325*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics total;
326*35238bceSAndroid Build Coastguard Worker
327*35238bceSAndroid Build Coastguard Worker float medianRate;
328*35238bceSAndroid Build Coastguard Worker float maxDiffTime;
329*35238bceSAndroid Build Coastguard Worker float maxDiff9DecileTime;
330*35238bceSAndroid Build Coastguard Worker float medianDiffTime;
331*35238bceSAndroid Build Coastguard Worker
332*35238bceSAndroid Build Coastguard Worker float maxRelDiffTime;
333*35238bceSAndroid Build Coastguard Worker float max9DecileRelDiffTime;
334*35238bceSAndroid Build Coastguard Worker float medianRelDiffTime;
335*35238bceSAndroid Build Coastguard Worker };
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker template <typename T>
338*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker };
341*35238bceSAndroid Build Coastguard Worker
342*35238bceSAndroid Build Coastguard Worker template <>
343*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<SingleOperationDuration>
344*35238bceSAndroid Build Coastguard Worker {
345*35238bceSAndroid Build Coastguard Worker typedef SingleCallStatistics StatsType;
346*35238bceSAndroid Build Coastguard Worker
347*35238bceSAndroid Build Coastguard Worker enum
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker HAS_MAP_STATS = 0
350*35238bceSAndroid Build Coastguard Worker };
351*35238bceSAndroid Build Coastguard Worker enum
352*35238bceSAndroid Build Coastguard Worker {
353*35238bceSAndroid Build Coastguard Worker HAS_UNMAP_STATS = 0
354*35238bceSAndroid Build Coastguard Worker };
355*35238bceSAndroid Build Coastguard Worker enum
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker HAS_WRITE_STATS = 0
358*35238bceSAndroid Build Coastguard Worker };
359*35238bceSAndroid Build Coastguard Worker enum
360*35238bceSAndroid Build Coastguard Worker {
361*35238bceSAndroid Build Coastguard Worker HAS_FLUSH_STATS = 0
362*35238bceSAndroid Build Coastguard Worker };
363*35238bceSAndroid Build Coastguard Worker enum
364*35238bceSAndroid Build Coastguard Worker {
365*35238bceSAndroid Build Coastguard Worker HAS_ALLOC_STATS = 0
366*35238bceSAndroid Build Coastguard Worker };
367*35238bceSAndroid Build Coastguard Worker enum
368*35238bceSAndroid Build Coastguard Worker {
369*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 0
370*35238bceSAndroid Build Coastguard Worker };
371*35238bceSAndroid Build Coastguard Worker };
372*35238bceSAndroid Build Coastguard Worker
373*35238bceSAndroid Build Coastguard Worker template <>
374*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<MapBufferRangeDuration>
375*35238bceSAndroid Build Coastguard Worker {
376*35238bceSAndroid Build Coastguard Worker typedef MapCallStatistics StatsType;
377*35238bceSAndroid Build Coastguard Worker
378*35238bceSAndroid Build Coastguard Worker enum
379*35238bceSAndroid Build Coastguard Worker {
380*35238bceSAndroid Build Coastguard Worker HAS_MAP_STATS = 1
381*35238bceSAndroid Build Coastguard Worker };
382*35238bceSAndroid Build Coastguard Worker enum
383*35238bceSAndroid Build Coastguard Worker {
384*35238bceSAndroid Build Coastguard Worker HAS_UNMAP_STATS = 1
385*35238bceSAndroid Build Coastguard Worker };
386*35238bceSAndroid Build Coastguard Worker enum
387*35238bceSAndroid Build Coastguard Worker {
388*35238bceSAndroid Build Coastguard Worker HAS_WRITE_STATS = 1
389*35238bceSAndroid Build Coastguard Worker };
390*35238bceSAndroid Build Coastguard Worker enum
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker HAS_FLUSH_STATS = 0
393*35238bceSAndroid Build Coastguard Worker };
394*35238bceSAndroid Build Coastguard Worker enum
395*35238bceSAndroid Build Coastguard Worker {
396*35238bceSAndroid Build Coastguard Worker HAS_ALLOC_STATS = 1
397*35238bceSAndroid Build Coastguard Worker };
398*35238bceSAndroid Build Coastguard Worker enum
399*35238bceSAndroid Build Coastguard Worker {
400*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
401*35238bceSAndroid Build Coastguard Worker };
402*35238bceSAndroid Build Coastguard Worker };
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker template <>
405*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<MapBufferRangeDurationNoAlloc>
406*35238bceSAndroid Build Coastguard Worker {
407*35238bceSAndroid Build Coastguard Worker typedef MapCallStatistics StatsType;
408*35238bceSAndroid Build Coastguard Worker
409*35238bceSAndroid Build Coastguard Worker enum
410*35238bceSAndroid Build Coastguard Worker {
411*35238bceSAndroid Build Coastguard Worker HAS_MAP_STATS = 1
412*35238bceSAndroid Build Coastguard Worker };
413*35238bceSAndroid Build Coastguard Worker enum
414*35238bceSAndroid Build Coastguard Worker {
415*35238bceSAndroid Build Coastguard Worker HAS_UNMAP_STATS = 1
416*35238bceSAndroid Build Coastguard Worker };
417*35238bceSAndroid Build Coastguard Worker enum
418*35238bceSAndroid Build Coastguard Worker {
419*35238bceSAndroid Build Coastguard Worker HAS_WRITE_STATS = 1
420*35238bceSAndroid Build Coastguard Worker };
421*35238bceSAndroid Build Coastguard Worker enum
422*35238bceSAndroid Build Coastguard Worker {
423*35238bceSAndroid Build Coastguard Worker HAS_FLUSH_STATS = 0
424*35238bceSAndroid Build Coastguard Worker };
425*35238bceSAndroid Build Coastguard Worker enum
426*35238bceSAndroid Build Coastguard Worker {
427*35238bceSAndroid Build Coastguard Worker HAS_ALLOC_STATS = 0
428*35238bceSAndroid Build Coastguard Worker };
429*35238bceSAndroid Build Coastguard Worker enum
430*35238bceSAndroid Build Coastguard Worker {
431*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
432*35238bceSAndroid Build Coastguard Worker };
433*35238bceSAndroid Build Coastguard Worker };
434*35238bceSAndroid Build Coastguard Worker
435*35238bceSAndroid Build Coastguard Worker template <>
436*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<MapBufferRangeFlushDuration>
437*35238bceSAndroid Build Coastguard Worker {
438*35238bceSAndroid Build Coastguard Worker typedef MapFlushCallStatistics StatsType;
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker enum
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker HAS_MAP_STATS = 1
443*35238bceSAndroid Build Coastguard Worker };
444*35238bceSAndroid Build Coastguard Worker enum
445*35238bceSAndroid Build Coastguard Worker {
446*35238bceSAndroid Build Coastguard Worker HAS_UNMAP_STATS = 1
447*35238bceSAndroid Build Coastguard Worker };
448*35238bceSAndroid Build Coastguard Worker enum
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker HAS_WRITE_STATS = 1
451*35238bceSAndroid Build Coastguard Worker };
452*35238bceSAndroid Build Coastguard Worker enum
453*35238bceSAndroid Build Coastguard Worker {
454*35238bceSAndroid Build Coastguard Worker HAS_FLUSH_STATS = 1
455*35238bceSAndroid Build Coastguard Worker };
456*35238bceSAndroid Build Coastguard Worker enum
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker HAS_ALLOC_STATS = 1
459*35238bceSAndroid Build Coastguard Worker };
460*35238bceSAndroid Build Coastguard Worker enum
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
463*35238bceSAndroid Build Coastguard Worker };
464*35238bceSAndroid Build Coastguard Worker };
465*35238bceSAndroid Build Coastguard Worker
466*35238bceSAndroid Build Coastguard Worker template <>
467*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<MapBufferRangeFlushDurationNoAlloc>
468*35238bceSAndroid Build Coastguard Worker {
469*35238bceSAndroid Build Coastguard Worker typedef MapFlushCallStatistics StatsType;
470*35238bceSAndroid Build Coastguard Worker
471*35238bceSAndroid Build Coastguard Worker enum
472*35238bceSAndroid Build Coastguard Worker {
473*35238bceSAndroid Build Coastguard Worker HAS_MAP_STATS = 1
474*35238bceSAndroid Build Coastguard Worker };
475*35238bceSAndroid Build Coastguard Worker enum
476*35238bceSAndroid Build Coastguard Worker {
477*35238bceSAndroid Build Coastguard Worker HAS_UNMAP_STATS = 1
478*35238bceSAndroid Build Coastguard Worker };
479*35238bceSAndroid Build Coastguard Worker enum
480*35238bceSAndroid Build Coastguard Worker {
481*35238bceSAndroid Build Coastguard Worker HAS_WRITE_STATS = 1
482*35238bceSAndroid Build Coastguard Worker };
483*35238bceSAndroid Build Coastguard Worker enum
484*35238bceSAndroid Build Coastguard Worker {
485*35238bceSAndroid Build Coastguard Worker HAS_FLUSH_STATS = 1
486*35238bceSAndroid Build Coastguard Worker };
487*35238bceSAndroid Build Coastguard Worker enum
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker HAS_ALLOC_STATS = 0
490*35238bceSAndroid Build Coastguard Worker };
491*35238bceSAndroid Build Coastguard Worker enum
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
494*35238bceSAndroid Build Coastguard Worker };
495*35238bceSAndroid Build Coastguard Worker };
496*35238bceSAndroid Build Coastguard Worker
497*35238bceSAndroid Build Coastguard Worker template <>
498*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<RenderReadDuration>
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker typedef RenderReadStatistics StatsType;
501*35238bceSAndroid Build Coastguard Worker
502*35238bceSAndroid Build Coastguard Worker enum
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker HAS_RENDER_STATS = 1
505*35238bceSAndroid Build Coastguard Worker };
506*35238bceSAndroid Build Coastguard Worker enum
507*35238bceSAndroid Build Coastguard Worker {
508*35238bceSAndroid Build Coastguard Worker HAS_READ_STATS = 1
509*35238bceSAndroid Build Coastguard Worker };
510*35238bceSAndroid Build Coastguard Worker enum
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker HAS_UPLOAD_STATS = 0
513*35238bceSAndroid Build Coastguard Worker };
514*35238bceSAndroid Build Coastguard Worker enum
515*35238bceSAndroid Build Coastguard Worker {
516*35238bceSAndroid Build Coastguard Worker HAS_TOTAL_STATS = 1
517*35238bceSAndroid Build Coastguard Worker };
518*35238bceSAndroid Build Coastguard Worker enum
519*35238bceSAndroid Build Coastguard Worker {
520*35238bceSAndroid Build Coastguard Worker HAS_FIRST_RENDER_STATS = 0
521*35238bceSAndroid Build Coastguard Worker };
522*35238bceSAndroid Build Coastguard Worker enum
523*35238bceSAndroid Build Coastguard Worker {
524*35238bceSAndroid Build Coastguard Worker HAS_SECOND_RENDER_STATS = 0
525*35238bceSAndroid Build Coastguard Worker };
526*35238bceSAndroid Build Coastguard Worker
527*35238bceSAndroid Build Coastguard Worker enum
528*35238bceSAndroid Build Coastguard Worker {
529*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
530*35238bceSAndroid Build Coastguard Worker };
531*35238bceSAndroid Build Coastguard Worker };
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Worker template <>
534*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<UnrelatedUploadRenderReadDuration>
535*35238bceSAndroid Build Coastguard Worker {
536*35238bceSAndroid Build Coastguard Worker typedef RenderReadStatistics StatsType;
537*35238bceSAndroid Build Coastguard Worker
538*35238bceSAndroid Build Coastguard Worker enum
539*35238bceSAndroid Build Coastguard Worker {
540*35238bceSAndroid Build Coastguard Worker HAS_RENDER_STATS = 1
541*35238bceSAndroid Build Coastguard Worker };
542*35238bceSAndroid Build Coastguard Worker enum
543*35238bceSAndroid Build Coastguard Worker {
544*35238bceSAndroid Build Coastguard Worker HAS_READ_STATS = 1
545*35238bceSAndroid Build Coastguard Worker };
546*35238bceSAndroid Build Coastguard Worker enum
547*35238bceSAndroid Build Coastguard Worker {
548*35238bceSAndroid Build Coastguard Worker HAS_UPLOAD_STATS = 0
549*35238bceSAndroid Build Coastguard Worker };
550*35238bceSAndroid Build Coastguard Worker enum
551*35238bceSAndroid Build Coastguard Worker {
552*35238bceSAndroid Build Coastguard Worker HAS_TOTAL_STATS = 1
553*35238bceSAndroid Build Coastguard Worker };
554*35238bceSAndroid Build Coastguard Worker enum
555*35238bceSAndroid Build Coastguard Worker {
556*35238bceSAndroid Build Coastguard Worker HAS_FIRST_RENDER_STATS = 0
557*35238bceSAndroid Build Coastguard Worker };
558*35238bceSAndroid Build Coastguard Worker enum
559*35238bceSAndroid Build Coastguard Worker {
560*35238bceSAndroid Build Coastguard Worker HAS_SECOND_RENDER_STATS = 0
561*35238bceSAndroid Build Coastguard Worker };
562*35238bceSAndroid Build Coastguard Worker
563*35238bceSAndroid Build Coastguard Worker enum
564*35238bceSAndroid Build Coastguard Worker {
565*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
566*35238bceSAndroid Build Coastguard Worker };
567*35238bceSAndroid Build Coastguard Worker };
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker template <>
570*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<UploadRenderReadDuration>
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker typedef UploadRenderReadStatistics StatsType;
573*35238bceSAndroid Build Coastguard Worker
574*35238bceSAndroid Build Coastguard Worker enum
575*35238bceSAndroid Build Coastguard Worker {
576*35238bceSAndroid Build Coastguard Worker HAS_RENDER_STATS = 1
577*35238bceSAndroid Build Coastguard Worker };
578*35238bceSAndroid Build Coastguard Worker enum
579*35238bceSAndroid Build Coastguard Worker {
580*35238bceSAndroid Build Coastguard Worker HAS_READ_STATS = 1
581*35238bceSAndroid Build Coastguard Worker };
582*35238bceSAndroid Build Coastguard Worker enum
583*35238bceSAndroid Build Coastguard Worker {
584*35238bceSAndroid Build Coastguard Worker HAS_UPLOAD_STATS = 1
585*35238bceSAndroid Build Coastguard Worker };
586*35238bceSAndroid Build Coastguard Worker enum
587*35238bceSAndroid Build Coastguard Worker {
588*35238bceSAndroid Build Coastguard Worker HAS_TOTAL_STATS = 1
589*35238bceSAndroid Build Coastguard Worker };
590*35238bceSAndroid Build Coastguard Worker enum
591*35238bceSAndroid Build Coastguard Worker {
592*35238bceSAndroid Build Coastguard Worker HAS_FIRST_RENDER_STATS = 0
593*35238bceSAndroid Build Coastguard Worker };
594*35238bceSAndroid Build Coastguard Worker enum
595*35238bceSAndroid Build Coastguard Worker {
596*35238bceSAndroid Build Coastguard Worker HAS_SECOND_RENDER_STATS = 0
597*35238bceSAndroid Build Coastguard Worker };
598*35238bceSAndroid Build Coastguard Worker
599*35238bceSAndroid Build Coastguard Worker enum
600*35238bceSAndroid Build Coastguard Worker {
601*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
602*35238bceSAndroid Build Coastguard Worker };
603*35238bceSAndroid Build Coastguard Worker enum
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker LOG_UNRELATED_UPLOAD_SIZE = 0
606*35238bceSAndroid Build Coastguard Worker };
607*35238bceSAndroid Build Coastguard Worker };
608*35238bceSAndroid Build Coastguard Worker
609*35238bceSAndroid Build Coastguard Worker template <>
610*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<UploadRenderReadDurationWithUnrelatedUploadSize>
611*35238bceSAndroid Build Coastguard Worker {
612*35238bceSAndroid Build Coastguard Worker typedef UploadRenderReadStatistics StatsType;
613*35238bceSAndroid Build Coastguard Worker
614*35238bceSAndroid Build Coastguard Worker enum
615*35238bceSAndroid Build Coastguard Worker {
616*35238bceSAndroid Build Coastguard Worker HAS_RENDER_STATS = 1
617*35238bceSAndroid Build Coastguard Worker };
618*35238bceSAndroid Build Coastguard Worker enum
619*35238bceSAndroid Build Coastguard Worker {
620*35238bceSAndroid Build Coastguard Worker HAS_READ_STATS = 1
621*35238bceSAndroid Build Coastguard Worker };
622*35238bceSAndroid Build Coastguard Worker enum
623*35238bceSAndroid Build Coastguard Worker {
624*35238bceSAndroid Build Coastguard Worker HAS_UPLOAD_STATS = 1
625*35238bceSAndroid Build Coastguard Worker };
626*35238bceSAndroid Build Coastguard Worker enum
627*35238bceSAndroid Build Coastguard Worker {
628*35238bceSAndroid Build Coastguard Worker HAS_TOTAL_STATS = 1
629*35238bceSAndroid Build Coastguard Worker };
630*35238bceSAndroid Build Coastguard Worker enum
631*35238bceSAndroid Build Coastguard Worker {
632*35238bceSAndroid Build Coastguard Worker HAS_FIRST_RENDER_STATS = 0
633*35238bceSAndroid Build Coastguard Worker };
634*35238bceSAndroid Build Coastguard Worker enum
635*35238bceSAndroid Build Coastguard Worker {
636*35238bceSAndroid Build Coastguard Worker HAS_SECOND_RENDER_STATS = 0
637*35238bceSAndroid Build Coastguard Worker };
638*35238bceSAndroid Build Coastguard Worker
639*35238bceSAndroid Build Coastguard Worker enum
640*35238bceSAndroid Build Coastguard Worker {
641*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
642*35238bceSAndroid Build Coastguard Worker };
643*35238bceSAndroid Build Coastguard Worker enum
644*35238bceSAndroid Build Coastguard Worker {
645*35238bceSAndroid Build Coastguard Worker LOG_UNRELATED_UPLOAD_SIZE = 1
646*35238bceSAndroid Build Coastguard Worker };
647*35238bceSAndroid Build Coastguard Worker };
648*35238bceSAndroid Build Coastguard Worker
649*35238bceSAndroid Build Coastguard Worker template <>
650*35238bceSAndroid Build Coastguard Worker struct SampleTypeTraits<RenderUploadRenderReadDuration>
651*35238bceSAndroid Build Coastguard Worker {
652*35238bceSAndroid Build Coastguard Worker typedef RenderUploadRenderReadStatistics StatsType;
653*35238bceSAndroid Build Coastguard Worker
654*35238bceSAndroid Build Coastguard Worker enum
655*35238bceSAndroid Build Coastguard Worker {
656*35238bceSAndroid Build Coastguard Worker HAS_RENDER_STATS = 0
657*35238bceSAndroid Build Coastguard Worker };
658*35238bceSAndroid Build Coastguard Worker enum
659*35238bceSAndroid Build Coastguard Worker {
660*35238bceSAndroid Build Coastguard Worker HAS_READ_STATS = 1
661*35238bceSAndroid Build Coastguard Worker };
662*35238bceSAndroid Build Coastguard Worker enum
663*35238bceSAndroid Build Coastguard Worker {
664*35238bceSAndroid Build Coastguard Worker HAS_UPLOAD_STATS = 1
665*35238bceSAndroid Build Coastguard Worker };
666*35238bceSAndroid Build Coastguard Worker enum
667*35238bceSAndroid Build Coastguard Worker {
668*35238bceSAndroid Build Coastguard Worker HAS_TOTAL_STATS = 1
669*35238bceSAndroid Build Coastguard Worker };
670*35238bceSAndroid Build Coastguard Worker enum
671*35238bceSAndroid Build Coastguard Worker {
672*35238bceSAndroid Build Coastguard Worker HAS_FIRST_RENDER_STATS = 1
673*35238bceSAndroid Build Coastguard Worker };
674*35238bceSAndroid Build Coastguard Worker enum
675*35238bceSAndroid Build Coastguard Worker {
676*35238bceSAndroid Build Coastguard Worker HAS_SECOND_RENDER_STATS = 1
677*35238bceSAndroid Build Coastguard Worker };
678*35238bceSAndroid Build Coastguard Worker
679*35238bceSAndroid Build Coastguard Worker enum
680*35238bceSAndroid Build Coastguard Worker {
681*35238bceSAndroid Build Coastguard Worker LOG_CONTRIBUTIONS = 1
682*35238bceSAndroid Build Coastguard Worker };
683*35238bceSAndroid Build Coastguard Worker enum
684*35238bceSAndroid Build Coastguard Worker {
685*35238bceSAndroid Build Coastguard Worker LOG_UNRELATED_UPLOAD_SIZE = 1
686*35238bceSAndroid Build Coastguard Worker };
687*35238bceSAndroid Build Coastguard Worker };
688*35238bceSAndroid Build Coastguard Worker
689*35238bceSAndroid Build Coastguard Worker struct UploadSampleAnalyzeResult
690*35238bceSAndroid Build Coastguard Worker {
691*35238bceSAndroid Build Coastguard Worker float transferRateMedian;
692*35238bceSAndroid Build Coastguard Worker float transferRateAtRange;
693*35238bceSAndroid Build Coastguard Worker float transferRateAtInfinity;
694*35238bceSAndroid Build Coastguard Worker };
695*35238bceSAndroid Build Coastguard Worker
696*35238bceSAndroid Build Coastguard Worker struct RenderSampleAnalyzeResult
697*35238bceSAndroid Build Coastguard Worker {
698*35238bceSAndroid Build Coastguard Worker float renderRateMedian;
699*35238bceSAndroid Build Coastguard Worker float renderRateAtRange;
700*35238bceSAndroid Build Coastguard Worker float renderRateAtInfinity;
701*35238bceSAndroid Build Coastguard Worker };
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker class UnmapFailureError : public std::exception
704*35238bceSAndroid Build Coastguard Worker {
705*35238bceSAndroid Build Coastguard Worker public:
UnmapFailureError(void)706*35238bceSAndroid Build Coastguard Worker UnmapFailureError(void) : std::exception()
707*35238bceSAndroid Build Coastguard Worker {
708*35238bceSAndroid Build Coastguard Worker }
709*35238bceSAndroid Build Coastguard Worker };
710*35238bceSAndroid Build Coastguard Worker
getHumanReadableByteSize(int numBytes)711*35238bceSAndroid Build Coastguard Worker static std::string getHumanReadableByteSize(int numBytes)
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker std::ostringstream buf;
714*35238bceSAndroid Build Coastguard Worker
715*35238bceSAndroid Build Coastguard Worker if (numBytes < 1024)
716*35238bceSAndroid Build Coastguard Worker buf << numBytes << " byte(s)";
717*35238bceSAndroid Build Coastguard Worker else if (numBytes < 1024 * 1024)
718*35238bceSAndroid Build Coastguard Worker buf << de::floatToString((float)numBytes / 1024.0f, 1) << " KiB";
719*35238bceSAndroid Build Coastguard Worker else
720*35238bceSAndroid Build Coastguard Worker buf << de::floatToString((float)numBytes / 1024.0f / 1024.0f, 1) << " MiB";
721*35238bceSAndroid Build Coastguard Worker
722*35238bceSAndroid Build Coastguard Worker return buf.str();
723*35238bceSAndroid Build Coastguard Worker }
724*35238bceSAndroid Build Coastguard Worker
medianTimeMemcpy(void * dst,const void * src,int numBytes)725*35238bceSAndroid Build Coastguard Worker static uint64_t medianTimeMemcpy(void *dst, const void *src, int numBytes)
726*35238bceSAndroid Build Coastguard Worker {
727*35238bceSAndroid Build Coastguard Worker // Time used by memcpy is assumed to be asymptotically linear
728*35238bceSAndroid Build Coastguard Worker
729*35238bceSAndroid Build Coastguard Worker // With large numBytes, the probability of context switch or other random
730*35238bceSAndroid Build Coastguard Worker // event is high. Apply memcpy in parts and report how much time would
731*35238bceSAndroid Build Coastguard Worker // memcpy have used with the median transfer rate.
732*35238bceSAndroid Build Coastguard Worker
733*35238bceSAndroid Build Coastguard Worker // Less than 1MiB, no need to do anything special
734*35238bceSAndroid Build Coastguard Worker if (numBytes < 1048576)
735*35238bceSAndroid Build Coastguard Worker {
736*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
737*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
738*35238bceSAndroid Build Coastguard Worker
739*35238bceSAndroid Build Coastguard Worker deYield();
740*35238bceSAndroid Build Coastguard Worker
741*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
742*35238bceSAndroid Build Coastguard Worker deMemcpy(dst, src, numBytes);
743*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
744*35238bceSAndroid Build Coastguard Worker
745*35238bceSAndroid Build Coastguard Worker return endTime - startTime;
746*35238bceSAndroid Build Coastguard Worker }
747*35238bceSAndroid Build Coastguard Worker else
748*35238bceSAndroid Build Coastguard Worker {
749*35238bceSAndroid Build Coastguard Worker // Do memcpy in multiple parts
750*35238bceSAndroid Build Coastguard Worker
751*35238bceSAndroid Build Coastguard Worker const int numSections = 5;
752*35238bceSAndroid Build Coastguard Worker const int sectionAlign = 16;
753*35238bceSAndroid Build Coastguard Worker
754*35238bceSAndroid Build Coastguard Worker int sectionStarts[numSections + 1];
755*35238bceSAndroid Build Coastguard Worker int sectionLens[numSections];
756*35238bceSAndroid Build Coastguard Worker uint64_t sectionTimes[numSections];
757*35238bceSAndroid Build Coastguard Worker uint64_t medianTime;
758*35238bceSAndroid Build Coastguard Worker uint64_t bestTime = 0;
759*35238bceSAndroid Build Coastguard Worker
760*35238bceSAndroid Build Coastguard Worker for (int sectionNdx = 0; sectionNdx < numSections; ++sectionNdx)
761*35238bceSAndroid Build Coastguard Worker sectionStarts[sectionNdx] = deAlign32((numBytes * sectionNdx / numSections), sectionAlign);
762*35238bceSAndroid Build Coastguard Worker sectionStarts[numSections] = numBytes;
763*35238bceSAndroid Build Coastguard Worker
764*35238bceSAndroid Build Coastguard Worker for (int sectionNdx = 0; sectionNdx < numSections; ++sectionNdx)
765*35238bceSAndroid Build Coastguard Worker sectionLens[sectionNdx] = sectionStarts[sectionNdx + 1] - sectionStarts[sectionNdx];
766*35238bceSAndroid Build Coastguard Worker
767*35238bceSAndroid Build Coastguard Worker // Memcpy is usually called after mapbuffer range which may take
768*35238bceSAndroid Build Coastguard Worker // a lot of time. To prevent power management from kicking in during
769*35238bceSAndroid Build Coastguard Worker // copy, warm up more.
770*35238bceSAndroid Build Coastguard Worker {
771*35238bceSAndroid Build Coastguard Worker deYield();
772*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
773*35238bceSAndroid Build Coastguard Worker deYield();
774*35238bceSAndroid Build Coastguard Worker }
775*35238bceSAndroid Build Coastguard Worker
776*35238bceSAndroid Build Coastguard Worker for (int sectionNdx = 0; sectionNdx < numSections; ++sectionNdx)
777*35238bceSAndroid Build Coastguard Worker {
778*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
779*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
780*35238bceSAndroid Build Coastguard Worker
781*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
782*35238bceSAndroid Build Coastguard Worker deMemcpy((uint8_t *)dst + sectionStarts[sectionNdx], (const uint8_t *)src + sectionStarts[sectionNdx],
783*35238bceSAndroid Build Coastguard Worker sectionLens[sectionNdx]);
784*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
785*35238bceSAndroid Build Coastguard Worker
786*35238bceSAndroid Build Coastguard Worker sectionTimes[sectionNdx] = endTime - startTime;
787*35238bceSAndroid Build Coastguard Worker
788*35238bceSAndroid Build Coastguard Worker if (!bestTime || sectionTimes[sectionNdx] < bestTime)
789*35238bceSAndroid Build Coastguard Worker bestTime = sectionTimes[sectionNdx];
790*35238bceSAndroid Build Coastguard Worker
791*35238bceSAndroid Build Coastguard Worker // Detect if write takes 50% longer than it should, and warm up if that happened
792*35238bceSAndroid Build Coastguard Worker if (sectionNdx != numSections - 1 && (float)sectionTimes[sectionNdx] > 1.5f * (float)bestTime)
793*35238bceSAndroid Build Coastguard Worker {
794*35238bceSAndroid Build Coastguard Worker deYield();
795*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
796*35238bceSAndroid Build Coastguard Worker deYield();
797*35238bceSAndroid Build Coastguard Worker }
798*35238bceSAndroid Build Coastguard Worker }
799*35238bceSAndroid Build Coastguard Worker
800*35238bceSAndroid Build Coastguard Worker std::sort(sectionTimes, sectionTimes + numSections);
801*35238bceSAndroid Build Coastguard Worker
802*35238bceSAndroid Build Coastguard Worker if ((numSections % 2) == 0)
803*35238bceSAndroid Build Coastguard Worker medianTime = (sectionTimes[numSections / 2 - 1] + sectionTimes[numSections / 2]) / 2;
804*35238bceSAndroid Build Coastguard Worker else
805*35238bceSAndroid Build Coastguard Worker medianTime = sectionTimes[numSections / 2];
806*35238bceSAndroid Build Coastguard Worker
807*35238bceSAndroid Build Coastguard Worker return medianTime * numSections;
808*35238bceSAndroid Build Coastguard Worker }
809*35238bceSAndroid Build Coastguard Worker }
810*35238bceSAndroid Build Coastguard Worker
busyworkCalculation(float initial,int workSize)811*35238bceSAndroid Build Coastguard Worker static float busyworkCalculation(float initial, int workSize)
812*35238bceSAndroid Build Coastguard Worker {
813*35238bceSAndroid Build Coastguard Worker float a = initial;
814*35238bceSAndroid Build Coastguard Worker int b = 123;
815*35238bceSAndroid Build Coastguard Worker
816*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < workSize; ++ndx)
817*35238bceSAndroid Build Coastguard Worker {
818*35238bceSAndroid Build Coastguard Worker a = deFloatCos(a + (float)b);
819*35238bceSAndroid Build Coastguard Worker b = (b + 63) % 107 + de::abs((int)(a * 10.0f));
820*35238bceSAndroid Build Coastguard Worker }
821*35238bceSAndroid Build Coastguard Worker
822*35238bceSAndroid Build Coastguard Worker return a + (float)b;
823*35238bceSAndroid Build Coastguard Worker }
824*35238bceSAndroid Build Coastguard Worker
busyWait(int microseconds)825*35238bceSAndroid Build Coastguard Worker static void busyWait(int microseconds)
826*35238bceSAndroid Build Coastguard Worker {
827*35238bceSAndroid Build Coastguard Worker const uint64_t maxSingleWaitTime = 1000; // 1ms
828*35238bceSAndroid Build Coastguard Worker const uint64_t endTime = deGetMicroseconds() + microseconds;
829*35238bceSAndroid Build Coastguard Worker float unused = *tcu::warmupCPUInternal::g_unused.m_v;
830*35238bceSAndroid Build Coastguard Worker int workSize = 500;
831*35238bceSAndroid Build Coastguard Worker
832*35238bceSAndroid Build Coastguard Worker // exponentially increase work, cap to 1ms
833*35238bceSAndroid Build Coastguard Worker while (deGetMicroseconds() < endTime)
834*35238bceSAndroid Build Coastguard Worker {
835*35238bceSAndroid Build Coastguard Worker const uint64_t startTime = deGetMicroseconds();
836*35238bceSAndroid Build Coastguard Worker uint64_t totalTime;
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker unused = busyworkCalculation(unused, workSize);
839*35238bceSAndroid Build Coastguard Worker
840*35238bceSAndroid Build Coastguard Worker totalTime = deGetMicroseconds() - startTime;
841*35238bceSAndroid Build Coastguard Worker
842*35238bceSAndroid Build Coastguard Worker if (totalTime >= maxSingleWaitTime)
843*35238bceSAndroid Build Coastguard Worker break;
844*35238bceSAndroid Build Coastguard Worker else
845*35238bceSAndroid Build Coastguard Worker workSize *= 2;
846*35238bceSAndroid Build Coastguard Worker }
847*35238bceSAndroid Build Coastguard Worker
848*35238bceSAndroid Build Coastguard Worker // "wait"
849*35238bceSAndroid Build Coastguard Worker while (deGetMicroseconds() < endTime)
850*35238bceSAndroid Build Coastguard Worker unused = busyworkCalculation(unused, workSize);
851*35238bceSAndroid Build Coastguard Worker
852*35238bceSAndroid Build Coastguard Worker *tcu::warmupCPUInternal::g_unused.m_v = unused;
853*35238bceSAndroid Build Coastguard Worker }
854*35238bceSAndroid Build Coastguard Worker
855*35238bceSAndroid Build Coastguard Worker // Sample from given values using linear interpolation at a given position as if values were laid to range [0, 1]
856*35238bceSAndroid Build Coastguard Worker template <typename T>
linearSample(const std::vector<T> & values,float position)857*35238bceSAndroid Build Coastguard Worker static float linearSample(const std::vector<T> &values, float position)
858*35238bceSAndroid Build Coastguard Worker {
859*35238bceSAndroid Build Coastguard Worker DE_ASSERT(position >= 0.0f);
860*35238bceSAndroid Build Coastguard Worker DE_ASSERT(position <= 1.0f);
861*35238bceSAndroid Build Coastguard Worker
862*35238bceSAndroid Build Coastguard Worker const float floatNdx = (float)(values.size() - 1) * position;
863*35238bceSAndroid Build Coastguard Worker const int lowerNdx = (int)deFloatFloor(floatNdx);
864*35238bceSAndroid Build Coastguard Worker const int higherNdx = lowerNdx + 1;
865*35238bceSAndroid Build Coastguard Worker const float interpolationFactor = floatNdx - (float)lowerNdx;
866*35238bceSAndroid Build Coastguard Worker
867*35238bceSAndroid Build Coastguard Worker DE_ASSERT(lowerNdx >= 0 && lowerNdx < (int)values.size());
868*35238bceSAndroid Build Coastguard Worker DE_ASSERT(higherNdx >= 0 && higherNdx < (int)values.size());
869*35238bceSAndroid Build Coastguard Worker DE_ASSERT(interpolationFactor >= 0 && interpolationFactor < 1.0f);
870*35238bceSAndroid Build Coastguard Worker
871*35238bceSAndroid Build Coastguard Worker return tcu::mix((float)values[lowerNdx], (float)values[higherNdx], interpolationFactor);
872*35238bceSAndroid Build Coastguard Worker }
873*35238bceSAndroid Build Coastguard Worker
874*35238bceSAndroid Build Coastguard Worker template <typename T>
calculateSingleOperationStatistics(const std::vector<T> & samples,uint64_t T::SampleType::* target)875*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics calculateSingleOperationStatistics(const std::vector<T> &samples,
876*35238bceSAndroid Build Coastguard Worker uint64_t T::SampleType::*target)
877*35238bceSAndroid Build Coastguard Worker {
878*35238bceSAndroid Build Coastguard Worker SingleOperationStatistics stats;
879*35238bceSAndroid Build Coastguard Worker std::vector<uint64_t> values(samples.size());
880*35238bceSAndroid Build Coastguard Worker
881*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)samples.size(); ++ndx)
882*35238bceSAndroid Build Coastguard Worker values[ndx] = samples[ndx].duration.*target;
883*35238bceSAndroid Build Coastguard Worker
884*35238bceSAndroid Build Coastguard Worker std::sort(values.begin(), values.end());
885*35238bceSAndroid Build Coastguard Worker
886*35238bceSAndroid Build Coastguard Worker stats.minTime = (float)values.front();
887*35238bceSAndroid Build Coastguard Worker stats.maxTime = (float)values.back();
888*35238bceSAndroid Build Coastguard Worker stats.medianTime = linearSample(values, 0.5f);
889*35238bceSAndroid Build Coastguard Worker stats.min2DecileTime = linearSample(values, 0.1f);
890*35238bceSAndroid Build Coastguard Worker stats.max9DecileTime = linearSample(values, 0.9f);
891*35238bceSAndroid Build Coastguard Worker
892*35238bceSAndroid Build Coastguard Worker return stats;
893*35238bceSAndroid Build Coastguard Worker }
894*35238bceSAndroid Build Coastguard Worker
895*35238bceSAndroid Build Coastguard Worker template <typename StatisticsType, typename SampleType>
calculateBasicStatistics(StatisticsType & stats,const LineParametersWithConfidence & fit,const std::vector<SampleType> & samples,int SampleType::* predictor)896*35238bceSAndroid Build Coastguard Worker void calculateBasicStatistics(StatisticsType &stats, const LineParametersWithConfidence &fit,
897*35238bceSAndroid Build Coastguard Worker const std::vector<SampleType> &samples, int SampleType::*predictor)
898*35238bceSAndroid Build Coastguard Worker {
899*35238bceSAndroid Build Coastguard Worker std::vector<uint64_t> values(samples.size());
900*35238bceSAndroid Build Coastguard Worker
901*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)samples.size(); ++ndx)
902*35238bceSAndroid Build Coastguard Worker values[ndx] = samples[ndx].duration.fitResponseDuration;
903*35238bceSAndroid Build Coastguard Worker
904*35238bceSAndroid Build Coastguard Worker // median rate
905*35238bceSAndroid Build Coastguard Worker {
906*35238bceSAndroid Build Coastguard Worker std::vector<float> processingRates(samples.size());
907*35238bceSAndroid Build Coastguard Worker
908*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)samples.size(); ++ndx)
909*35238bceSAndroid Build Coastguard Worker {
910*35238bceSAndroid Build Coastguard Worker const float timeInSeconds = (float)values[ndx] / 1000.0f / 1000.0f;
911*35238bceSAndroid Build Coastguard Worker processingRates[ndx] = (float)(samples[ndx].*predictor) / timeInSeconds;
912*35238bceSAndroid Build Coastguard Worker }
913*35238bceSAndroid Build Coastguard Worker
914*35238bceSAndroid Build Coastguard Worker std::sort(processingRates.begin(), processingRates.end());
915*35238bceSAndroid Build Coastguard Worker
916*35238bceSAndroid Build Coastguard Worker stats.medianRate = linearSample(processingRates, 0.5f);
917*35238bceSAndroid Build Coastguard Worker }
918*35238bceSAndroid Build Coastguard Worker
919*35238bceSAndroid Build Coastguard Worker // results compared to the approximation
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker std::vector<float> timeDiffs(samples.size());
922*35238bceSAndroid Build Coastguard Worker
923*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)samples.size(); ++ndx)
924*35238bceSAndroid Build Coastguard Worker {
925*35238bceSAndroid Build Coastguard Worker const float prediction = (float)(samples[ndx].*predictor) * fit.coefficient + fit.offset;
926*35238bceSAndroid Build Coastguard Worker const float actual = (float)values[ndx];
927*35238bceSAndroid Build Coastguard Worker timeDiffs[ndx] = actual - prediction;
928*35238bceSAndroid Build Coastguard Worker }
929*35238bceSAndroid Build Coastguard Worker std::sort(timeDiffs.begin(), timeDiffs.end());
930*35238bceSAndroid Build Coastguard Worker
931*35238bceSAndroid Build Coastguard Worker stats.maxDiffTime = timeDiffs.back();
932*35238bceSAndroid Build Coastguard Worker stats.maxDiff9DecileTime = linearSample(timeDiffs, 0.9f);
933*35238bceSAndroid Build Coastguard Worker stats.medianDiffTime = linearSample(timeDiffs, 0.5f);
934*35238bceSAndroid Build Coastguard Worker }
935*35238bceSAndroid Build Coastguard Worker
936*35238bceSAndroid Build Coastguard Worker // relative comparison to the approximation
937*35238bceSAndroid Build Coastguard Worker {
938*35238bceSAndroid Build Coastguard Worker std::vector<float> relativeDiffs(samples.size());
939*35238bceSAndroid Build Coastguard Worker
940*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)samples.size(); ++ndx)
941*35238bceSAndroid Build Coastguard Worker {
942*35238bceSAndroid Build Coastguard Worker const float prediction = (float)(samples[ndx].*predictor) * fit.coefficient + fit.offset;
943*35238bceSAndroid Build Coastguard Worker const float actual = (float)values[ndx];
944*35238bceSAndroid Build Coastguard Worker
945*35238bceSAndroid Build Coastguard Worker // Ignore cases where we predict negative times, or if
946*35238bceSAndroid Build Coastguard Worker // ratio would be (nearly) infinite: ignore if predicted
947*35238bceSAndroid Build Coastguard Worker // time is less than 1 microsecond
948*35238bceSAndroid Build Coastguard Worker if (prediction < 1.0f)
949*35238bceSAndroid Build Coastguard Worker relativeDiffs[ndx] = 0.0f;
950*35238bceSAndroid Build Coastguard Worker else
951*35238bceSAndroid Build Coastguard Worker relativeDiffs[ndx] = (actual - prediction) / prediction;
952*35238bceSAndroid Build Coastguard Worker }
953*35238bceSAndroid Build Coastguard Worker std::sort(relativeDiffs.begin(), relativeDiffs.end());
954*35238bceSAndroid Build Coastguard Worker
955*35238bceSAndroid Build Coastguard Worker stats.maxRelDiffTime = relativeDiffs.back();
956*35238bceSAndroid Build Coastguard Worker stats.max9DecileRelDiffTime = linearSample(relativeDiffs, 0.9f);
957*35238bceSAndroid Build Coastguard Worker stats.medianRelDiffTime = linearSample(relativeDiffs, 0.5f);
958*35238bceSAndroid Build Coastguard Worker }
959*35238bceSAndroid Build Coastguard Worker
960*35238bceSAndroid Build Coastguard Worker // values calculated using sorted timings
961*35238bceSAndroid Build Coastguard Worker
962*35238bceSAndroid Build Coastguard Worker std::sort(values.begin(), values.end());
963*35238bceSAndroid Build Coastguard Worker
964*35238bceSAndroid Build Coastguard Worker stats.result.minTime = (float)values.front();
965*35238bceSAndroid Build Coastguard Worker stats.result.maxTime = (float)values.back();
966*35238bceSAndroid Build Coastguard Worker stats.result.medianTime = linearSample(values, 0.5f);
967*35238bceSAndroid Build Coastguard Worker stats.result.min2DecileTime = linearSample(values, 0.1f);
968*35238bceSAndroid Build Coastguard Worker stats.result.max9DecileTime = linearSample(values, 0.9f);
969*35238bceSAndroid Build Coastguard Worker }
970*35238bceSAndroid Build Coastguard Worker
971*35238bceSAndroid Build Coastguard Worker template <typename StatisticsType, typename SampleType>
calculateBasicTransferStatistics(StatisticsType & stats,const LineParametersWithConfidence & fit,const std::vector<SampleType> & samples)972*35238bceSAndroid Build Coastguard Worker void calculateBasicTransferStatistics(StatisticsType &stats, const LineParametersWithConfidence &fit,
973*35238bceSAndroid Build Coastguard Worker const std::vector<SampleType> &samples)
974*35238bceSAndroid Build Coastguard Worker {
975*35238bceSAndroid Build Coastguard Worker calculateBasicStatistics(stats, fit, samples, &SampleType::writtenSize);
976*35238bceSAndroid Build Coastguard Worker }
977*35238bceSAndroid Build Coastguard Worker
978*35238bceSAndroid Build Coastguard Worker template <typename StatisticsType, typename SampleType>
calculateBasicRenderStatistics(StatisticsType & stats,const LineParametersWithConfidence & fit,const std::vector<SampleType> & samples)979*35238bceSAndroid Build Coastguard Worker void calculateBasicRenderStatistics(StatisticsType &stats, const LineParametersWithConfidence &fit,
980*35238bceSAndroid Build Coastguard Worker const std::vector<SampleType> &samples)
981*35238bceSAndroid Build Coastguard Worker {
982*35238bceSAndroid Build Coastguard Worker calculateBasicStatistics(stats, fit, samples, &SampleType::renderDataSize);
983*35238bceSAndroid Build Coastguard Worker }
984*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<UploadSampleResult<SingleOperationDuration>> & samples)985*35238bceSAndroid Build Coastguard Worker static SingleCallStatistics calculateSampleStatistics(
986*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit, const std::vector<UploadSampleResult<SingleOperationDuration>> &samples)
987*35238bceSAndroid Build Coastguard Worker {
988*35238bceSAndroid Build Coastguard Worker SingleCallStatistics stats;
989*35238bceSAndroid Build Coastguard Worker
990*35238bceSAndroid Build Coastguard Worker calculateBasicTransferStatistics(stats, fit, samples);
991*35238bceSAndroid Build Coastguard Worker
992*35238bceSAndroid Build Coastguard Worker return stats;
993*35238bceSAndroid Build Coastguard Worker }
994*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<UploadSampleResult<MapBufferRangeDuration>> & samples)995*35238bceSAndroid Build Coastguard Worker static MapCallStatistics calculateSampleStatistics(
996*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit, const std::vector<UploadSampleResult<MapBufferRangeDuration>> &samples)
997*35238bceSAndroid Build Coastguard Worker {
998*35238bceSAndroid Build Coastguard Worker MapCallStatistics stats;
999*35238bceSAndroid Build Coastguard Worker
1000*35238bceSAndroid Build Coastguard Worker calculateBasicTransferStatistics(stats, fit, samples);
1001*35238bceSAndroid Build Coastguard Worker
1002*35238bceSAndroid Build Coastguard Worker stats.map = calculateSingleOperationStatistics(samples, &MapBufferRangeDuration::mapDuration);
1003*35238bceSAndroid Build Coastguard Worker stats.unmap = calculateSingleOperationStatistics(samples, &MapBufferRangeDuration::unmapDuration);
1004*35238bceSAndroid Build Coastguard Worker stats.write = calculateSingleOperationStatistics(samples, &MapBufferRangeDuration::writeDuration);
1005*35238bceSAndroid Build Coastguard Worker stats.alloc = calculateSingleOperationStatistics(samples, &MapBufferRangeDuration::allocDuration);
1006*35238bceSAndroid Build Coastguard Worker
1007*35238bceSAndroid Build Coastguard Worker return stats;
1008*35238bceSAndroid Build Coastguard Worker }
1009*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<UploadSampleResult<MapBufferRangeFlushDuration>> & samples)1010*35238bceSAndroid Build Coastguard Worker static MapFlushCallStatistics calculateSampleStatistics(
1011*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1012*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeFlushDuration>> &samples)
1013*35238bceSAndroid Build Coastguard Worker {
1014*35238bceSAndroid Build Coastguard Worker MapFlushCallStatistics stats;
1015*35238bceSAndroid Build Coastguard Worker
1016*35238bceSAndroid Build Coastguard Worker calculateBasicTransferStatistics(stats, fit, samples);
1017*35238bceSAndroid Build Coastguard Worker
1018*35238bceSAndroid Build Coastguard Worker stats.map = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDuration::mapDuration);
1019*35238bceSAndroid Build Coastguard Worker stats.unmap = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDuration::unmapDuration);
1020*35238bceSAndroid Build Coastguard Worker stats.write = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDuration::writeDuration);
1021*35238bceSAndroid Build Coastguard Worker stats.flush = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDuration::flushDuration);
1022*35238bceSAndroid Build Coastguard Worker stats.alloc = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDuration::allocDuration);
1023*35238bceSAndroid Build Coastguard Worker
1024*35238bceSAndroid Build Coastguard Worker return stats;
1025*35238bceSAndroid Build Coastguard Worker }
1026*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<UploadSampleResult<MapBufferRangeDurationNoAlloc>> & samples)1027*35238bceSAndroid Build Coastguard Worker static MapCallStatistics calculateSampleStatistics(
1028*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1029*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeDurationNoAlloc>> &samples)
1030*35238bceSAndroid Build Coastguard Worker {
1031*35238bceSAndroid Build Coastguard Worker MapCallStatistics stats;
1032*35238bceSAndroid Build Coastguard Worker
1033*35238bceSAndroid Build Coastguard Worker calculateBasicTransferStatistics(stats, fit, samples);
1034*35238bceSAndroid Build Coastguard Worker
1035*35238bceSAndroid Build Coastguard Worker stats.map = calculateSingleOperationStatistics(samples, &MapBufferRangeDurationNoAlloc::mapDuration);
1036*35238bceSAndroid Build Coastguard Worker stats.unmap = calculateSingleOperationStatistics(samples, &MapBufferRangeDurationNoAlloc::unmapDuration);
1037*35238bceSAndroid Build Coastguard Worker stats.write = calculateSingleOperationStatistics(samples, &MapBufferRangeDurationNoAlloc::writeDuration);
1038*35238bceSAndroid Build Coastguard Worker
1039*35238bceSAndroid Build Coastguard Worker return stats;
1040*35238bceSAndroid Build Coastguard Worker }
1041*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<UploadSampleResult<MapBufferRangeFlushDurationNoAlloc>> & samples)1042*35238bceSAndroid Build Coastguard Worker static MapFlushCallStatistics calculateSampleStatistics(
1043*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1044*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeFlushDurationNoAlloc>> &samples)
1045*35238bceSAndroid Build Coastguard Worker {
1046*35238bceSAndroid Build Coastguard Worker MapFlushCallStatistics stats;
1047*35238bceSAndroid Build Coastguard Worker
1048*35238bceSAndroid Build Coastguard Worker calculateBasicTransferStatistics(stats, fit, samples);
1049*35238bceSAndroid Build Coastguard Worker
1050*35238bceSAndroid Build Coastguard Worker stats.map = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDurationNoAlloc::mapDuration);
1051*35238bceSAndroid Build Coastguard Worker stats.unmap = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDurationNoAlloc::unmapDuration);
1052*35238bceSAndroid Build Coastguard Worker stats.write = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDurationNoAlloc::writeDuration);
1053*35238bceSAndroid Build Coastguard Worker stats.flush = calculateSingleOperationStatistics(samples, &MapBufferRangeFlushDurationNoAlloc::flushDuration);
1054*35238bceSAndroid Build Coastguard Worker
1055*35238bceSAndroid Build Coastguard Worker return stats;
1056*35238bceSAndroid Build Coastguard Worker }
1057*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<RenderSampleResult<RenderReadDuration>> & samples)1058*35238bceSAndroid Build Coastguard Worker static RenderReadStatistics calculateSampleStatistics(
1059*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit, const std::vector<RenderSampleResult<RenderReadDuration>> &samples)
1060*35238bceSAndroid Build Coastguard Worker {
1061*35238bceSAndroid Build Coastguard Worker RenderReadStatistics stats;
1062*35238bceSAndroid Build Coastguard Worker
1063*35238bceSAndroid Build Coastguard Worker calculateBasicRenderStatistics(stats, fit, samples);
1064*35238bceSAndroid Build Coastguard Worker
1065*35238bceSAndroid Build Coastguard Worker stats.render = calculateSingleOperationStatistics(samples, &RenderReadDuration::renderDuration);
1066*35238bceSAndroid Build Coastguard Worker stats.read = calculateSingleOperationStatistics(samples, &RenderReadDuration::readDuration);
1067*35238bceSAndroid Build Coastguard Worker stats.total = calculateSingleOperationStatistics(samples, &RenderReadDuration::totalDuration);
1068*35238bceSAndroid Build Coastguard Worker
1069*35238bceSAndroid Build Coastguard Worker return stats;
1070*35238bceSAndroid Build Coastguard Worker }
1071*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<RenderSampleResult<UnrelatedUploadRenderReadDuration>> & samples)1072*35238bceSAndroid Build Coastguard Worker static RenderReadStatistics calculateSampleStatistics(
1073*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1074*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<UnrelatedUploadRenderReadDuration>> &samples)
1075*35238bceSAndroid Build Coastguard Worker {
1076*35238bceSAndroid Build Coastguard Worker RenderReadStatistics stats;
1077*35238bceSAndroid Build Coastguard Worker
1078*35238bceSAndroid Build Coastguard Worker calculateBasicRenderStatistics(stats, fit, samples);
1079*35238bceSAndroid Build Coastguard Worker
1080*35238bceSAndroid Build Coastguard Worker stats.render = calculateSingleOperationStatistics(samples, &UnrelatedUploadRenderReadDuration::renderDuration);
1081*35238bceSAndroid Build Coastguard Worker stats.read = calculateSingleOperationStatistics(samples, &UnrelatedUploadRenderReadDuration::readDuration);
1082*35238bceSAndroid Build Coastguard Worker stats.total = calculateSingleOperationStatistics(samples, &UnrelatedUploadRenderReadDuration::totalDuration);
1083*35238bceSAndroid Build Coastguard Worker
1084*35238bceSAndroid Build Coastguard Worker return stats;
1085*35238bceSAndroid Build Coastguard Worker }
1086*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<RenderSampleResult<UploadRenderReadDuration>> & samples)1087*35238bceSAndroid Build Coastguard Worker static UploadRenderReadStatistics calculateSampleStatistics(
1088*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit, const std::vector<RenderSampleResult<UploadRenderReadDuration>> &samples)
1089*35238bceSAndroid Build Coastguard Worker {
1090*35238bceSAndroid Build Coastguard Worker UploadRenderReadStatistics stats;
1091*35238bceSAndroid Build Coastguard Worker
1092*35238bceSAndroid Build Coastguard Worker calculateBasicRenderStatistics(stats, fit, samples);
1093*35238bceSAndroid Build Coastguard Worker
1094*35238bceSAndroid Build Coastguard Worker stats.upload = calculateSingleOperationStatistics(samples, &UploadRenderReadDuration::uploadDuration);
1095*35238bceSAndroid Build Coastguard Worker stats.render = calculateSingleOperationStatistics(samples, &UploadRenderReadDuration::renderDuration);
1096*35238bceSAndroid Build Coastguard Worker stats.read = calculateSingleOperationStatistics(samples, &UploadRenderReadDuration::readDuration);
1097*35238bceSAndroid Build Coastguard Worker stats.total = calculateSingleOperationStatistics(samples, &UploadRenderReadDuration::totalDuration);
1098*35238bceSAndroid Build Coastguard Worker
1099*35238bceSAndroid Build Coastguard Worker return stats;
1100*35238bceSAndroid Build Coastguard Worker }
1101*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<RenderSampleResult<UploadRenderReadDurationWithUnrelatedUploadSize>> & samples)1102*35238bceSAndroid Build Coastguard Worker static UploadRenderReadStatistics calculateSampleStatistics(
1103*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1104*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<UploadRenderReadDurationWithUnrelatedUploadSize>> &samples)
1105*35238bceSAndroid Build Coastguard Worker {
1106*35238bceSAndroid Build Coastguard Worker UploadRenderReadStatistics stats;
1107*35238bceSAndroid Build Coastguard Worker
1108*35238bceSAndroid Build Coastguard Worker calculateBasicRenderStatistics(stats, fit, samples);
1109*35238bceSAndroid Build Coastguard Worker
1110*35238bceSAndroid Build Coastguard Worker stats.upload =
1111*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &UploadRenderReadDurationWithUnrelatedUploadSize::uploadDuration);
1112*35238bceSAndroid Build Coastguard Worker stats.render =
1113*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &UploadRenderReadDurationWithUnrelatedUploadSize::renderDuration);
1114*35238bceSAndroid Build Coastguard Worker stats.read =
1115*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &UploadRenderReadDurationWithUnrelatedUploadSize::readDuration);
1116*35238bceSAndroid Build Coastguard Worker stats.total =
1117*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &UploadRenderReadDurationWithUnrelatedUploadSize::totalDuration);
1118*35238bceSAndroid Build Coastguard Worker
1119*35238bceSAndroid Build Coastguard Worker return stats;
1120*35238bceSAndroid Build Coastguard Worker }
1121*35238bceSAndroid Build Coastguard Worker
calculateSampleStatistics(const LineParametersWithConfidence & fit,const std::vector<RenderSampleResult<RenderUploadRenderReadDuration>> & samples)1122*35238bceSAndroid Build Coastguard Worker static RenderUploadRenderReadStatistics calculateSampleStatistics(
1123*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence &fit,
1124*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<RenderUploadRenderReadDuration>> &samples)
1125*35238bceSAndroid Build Coastguard Worker {
1126*35238bceSAndroid Build Coastguard Worker RenderUploadRenderReadStatistics stats;
1127*35238bceSAndroid Build Coastguard Worker
1128*35238bceSAndroid Build Coastguard Worker calculateBasicRenderStatistics(stats, fit, samples);
1129*35238bceSAndroid Build Coastguard Worker
1130*35238bceSAndroid Build Coastguard Worker stats.firstRender =
1131*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &RenderUploadRenderReadDuration::firstRenderDuration);
1132*35238bceSAndroid Build Coastguard Worker stats.upload = calculateSingleOperationStatistics(samples, &RenderUploadRenderReadDuration::uploadDuration);
1133*35238bceSAndroid Build Coastguard Worker stats.secondRender =
1134*35238bceSAndroid Build Coastguard Worker calculateSingleOperationStatistics(samples, &RenderUploadRenderReadDuration::secondRenderDuration);
1135*35238bceSAndroid Build Coastguard Worker stats.read = calculateSingleOperationStatistics(samples, &RenderUploadRenderReadDuration::readDuration);
1136*35238bceSAndroid Build Coastguard Worker stats.total = calculateSingleOperationStatistics(samples, &RenderUploadRenderReadDuration::totalDuration);
1137*35238bceSAndroid Build Coastguard Worker
1138*35238bceSAndroid Build Coastguard Worker return stats;
1139*35238bceSAndroid Build Coastguard Worker }
1140*35238bceSAndroid Build Coastguard Worker
1141*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
fitLineToSamples(const std::vector<UploadSampleResult<DurationType>> & samples,int beginNdx,int endNdx,int step,uint64_t DurationType::* target=& DurationType::fitResponseDuration)1142*35238bceSAndroid Build Coastguard Worker static LineParametersWithConfidence fitLineToSamples(
1143*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<DurationType>> &samples, int beginNdx, int endNdx, int step,
1144*35238bceSAndroid Build Coastguard Worker uint64_t DurationType::*target = &DurationType::fitResponseDuration)
1145*35238bceSAndroid Build Coastguard Worker {
1146*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec2> samplePoints;
1147*35238bceSAndroid Build Coastguard Worker
1148*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = beginNdx; sampleNdx < endNdx; sampleNdx += step)
1149*35238bceSAndroid Build Coastguard Worker {
1150*35238bceSAndroid Build Coastguard Worker tcu::Vec2 point;
1151*35238bceSAndroid Build Coastguard Worker
1152*35238bceSAndroid Build Coastguard Worker point.x() = (float)(samples[sampleNdx].writtenSize);
1153*35238bceSAndroid Build Coastguard Worker point.y() = (float)(samples[sampleNdx].duration.*target);
1154*35238bceSAndroid Build Coastguard Worker
1155*35238bceSAndroid Build Coastguard Worker samplePoints.push_back(point);
1156*35238bceSAndroid Build Coastguard Worker }
1157*35238bceSAndroid Build Coastguard Worker
1158*35238bceSAndroid Build Coastguard Worker return theilSenSiegelLinearRegression(samplePoints, 0.6f);
1159*35238bceSAndroid Build Coastguard Worker }
1160*35238bceSAndroid Build Coastguard Worker
1161*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
fitLineToSamples(const std::vector<RenderSampleResult<DurationType>> & samples,int beginNdx,int endNdx,int step,uint64_t DurationType::* target=& DurationType::fitResponseDuration)1162*35238bceSAndroid Build Coastguard Worker static LineParametersWithConfidence fitLineToSamples(
1163*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<DurationType>> &samples, int beginNdx, int endNdx, int step,
1164*35238bceSAndroid Build Coastguard Worker uint64_t DurationType::*target = &DurationType::fitResponseDuration)
1165*35238bceSAndroid Build Coastguard Worker {
1166*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec2> samplePoints;
1167*35238bceSAndroid Build Coastguard Worker
1168*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = beginNdx; sampleNdx < endNdx; sampleNdx += step)
1169*35238bceSAndroid Build Coastguard Worker {
1170*35238bceSAndroid Build Coastguard Worker tcu::Vec2 point;
1171*35238bceSAndroid Build Coastguard Worker
1172*35238bceSAndroid Build Coastguard Worker point.x() = (float)(samples[sampleNdx].renderDataSize);
1173*35238bceSAndroid Build Coastguard Worker point.y() = (float)(samples[sampleNdx].duration.*target);
1174*35238bceSAndroid Build Coastguard Worker
1175*35238bceSAndroid Build Coastguard Worker samplePoints.push_back(point);
1176*35238bceSAndroid Build Coastguard Worker }
1177*35238bceSAndroid Build Coastguard Worker
1178*35238bceSAndroid Build Coastguard Worker return theilSenSiegelLinearRegression(samplePoints, 0.6f);
1179*35238bceSAndroid Build Coastguard Worker }
1180*35238bceSAndroid Build Coastguard Worker
1181*35238bceSAndroid Build Coastguard Worker template <typename T>
fitLineToSamples(const std::vector<T> & samples,int beginNdx,int endNdx,uint64_t T::SampleType::* target=& T::SampleType::fitResponseDuration)1182*35238bceSAndroid Build Coastguard Worker static LineParametersWithConfidence fitLineToSamples(
1183*35238bceSAndroid Build Coastguard Worker const std::vector<T> &samples, int beginNdx, int endNdx,
1184*35238bceSAndroid Build Coastguard Worker uint64_t T::SampleType::*target = &T::SampleType::fitResponseDuration)
1185*35238bceSAndroid Build Coastguard Worker {
1186*35238bceSAndroid Build Coastguard Worker return fitLineToSamples(samples, beginNdx, endNdx, 1, target);
1187*35238bceSAndroid Build Coastguard Worker }
1188*35238bceSAndroid Build Coastguard Worker
1189*35238bceSAndroid Build Coastguard Worker template <typename T>
fitLineToSamples(const std::vector<T> & samples,uint64_t T::SampleType::* target=& T::SampleType::fitResponseDuration)1190*35238bceSAndroid Build Coastguard Worker static LineParametersWithConfidence fitLineToSamples(
1191*35238bceSAndroid Build Coastguard Worker const std::vector<T> &samples, uint64_t T::SampleType::*target = &T::SampleType::fitResponseDuration)
1192*35238bceSAndroid Build Coastguard Worker {
1193*35238bceSAndroid Build Coastguard Worker return fitLineToSamples(samples, 0, (int)samples.size(), target);
1194*35238bceSAndroid Build Coastguard Worker }
1195*35238bceSAndroid Build Coastguard Worker
getAreaBetweenLines(float xmin,float xmax,float lineAOffset,float lineACoefficient,float lineBOffset,float lineBCoefficient)1196*35238bceSAndroid Build Coastguard Worker static float getAreaBetweenLines(float xmin, float xmax, float lineAOffset, float lineACoefficient, float lineBOffset,
1197*35238bceSAndroid Build Coastguard Worker float lineBCoefficient)
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker const float lineAMin = lineAOffset + lineACoefficient * xmin;
1200*35238bceSAndroid Build Coastguard Worker const float lineAMax = lineAOffset + lineACoefficient * xmax;
1201*35238bceSAndroid Build Coastguard Worker const float lineBMin = lineBOffset + lineBCoefficient * xmin;
1202*35238bceSAndroid Build Coastguard Worker const float lineBMax = lineBOffset + lineBCoefficient * xmax;
1203*35238bceSAndroid Build Coastguard Worker const bool aOverBAtBegin = (lineAMin > lineBMin);
1204*35238bceSAndroid Build Coastguard Worker const bool aOverBAtEnd = (lineAMax > lineBMax);
1205*35238bceSAndroid Build Coastguard Worker
1206*35238bceSAndroid Build Coastguard Worker if (aOverBAtBegin == aOverBAtEnd)
1207*35238bceSAndroid Build Coastguard Worker {
1208*35238bceSAndroid Build Coastguard Worker // lines do not intersect
1209*35238bceSAndroid Build Coastguard Worker
1210*35238bceSAndroid Build Coastguard Worker const float midpoint = (xmin + xmax) / 2.0f;
1211*35238bceSAndroid Build Coastguard Worker const float width = (xmax - xmin);
1212*35238bceSAndroid Build Coastguard Worker
1213*35238bceSAndroid Build Coastguard Worker const float lineAHeight = lineAOffset + lineACoefficient * midpoint;
1214*35238bceSAndroid Build Coastguard Worker const float lineBHeight = lineBOffset + lineBCoefficient * midpoint;
1215*35238bceSAndroid Build Coastguard Worker
1216*35238bceSAndroid Build Coastguard Worker return width * de::abs(lineAHeight - lineBHeight);
1217*35238bceSAndroid Build Coastguard Worker }
1218*35238bceSAndroid Build Coastguard Worker else
1219*35238bceSAndroid Build Coastguard Worker {
1220*35238bceSAndroid Build Coastguard Worker
1221*35238bceSAndroid Build Coastguard Worker // lines intersect
1222*35238bceSAndroid Build Coastguard Worker
1223*35238bceSAndroid Build Coastguard Worker const float approachCoeffient = de::abs(lineACoefficient - lineBCoefficient);
1224*35238bceSAndroid Build Coastguard Worker const float epsilon = 0.0001f;
1225*35238bceSAndroid Build Coastguard Worker const float leftHeight = de::abs(lineAMin - lineBMin);
1226*35238bceSAndroid Build Coastguard Worker const float rightHeight = de::abs(lineAMax - lineBMax);
1227*35238bceSAndroid Build Coastguard Worker
1228*35238bceSAndroid Build Coastguard Worker if (approachCoeffient < epsilon)
1229*35238bceSAndroid Build Coastguard Worker return 0.0f;
1230*35238bceSAndroid Build Coastguard Worker
1231*35238bceSAndroid Build Coastguard Worker return (0.5f * leftHeight * (leftHeight / approachCoeffient)) +
1232*35238bceSAndroid Build Coastguard Worker (0.5f * rightHeight * (rightHeight / approachCoeffient));
1233*35238bceSAndroid Build Coastguard Worker }
1234*35238bceSAndroid Build Coastguard Worker }
1235*35238bceSAndroid Build Coastguard Worker
1236*35238bceSAndroid Build Coastguard Worker template <typename T>
calculateSampleFitLinearity(const std::vector<T> & samples,int T::* predictor)1237*35238bceSAndroid Build Coastguard Worker static float calculateSampleFitLinearity(const std::vector<T> &samples, int T::*predictor)
1238*35238bceSAndroid Build Coastguard Worker {
1239*35238bceSAndroid Build Coastguard Worker // Compare the fitted line of first half of the samples to the fitted line of
1240*35238bceSAndroid Build Coastguard Worker // the second half of the samples. Calculate a AABB that fully contains every
1241*35238bceSAndroid Build Coastguard Worker // sample's x component and both fit lines in this range. Calculate the ratio
1242*35238bceSAndroid Build Coastguard Worker // of the area between the lines and the AABB.
1243*35238bceSAndroid Build Coastguard Worker
1244*35238bceSAndroid Build Coastguard Worker const float epsilon = 1.e-6f;
1245*35238bceSAndroid Build Coastguard Worker const int midPoint = (int)samples.size() / 2;
1246*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence startApproximation =
1247*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, 0, midPoint, &T::SampleType::fitResponseDuration);
1248*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence endApproximation =
1249*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, midPoint, (int)samples.size(), &T::SampleType::fitResponseDuration);
1250*35238bceSAndroid Build Coastguard Worker
1251*35238bceSAndroid Build Coastguard Worker const float aabbMinX = (float)(samples.front().*predictor);
1252*35238bceSAndroid Build Coastguard Worker const float aabbMinY = de::min(startApproximation.offset + startApproximation.coefficient * aabbMinX,
1253*35238bceSAndroid Build Coastguard Worker endApproximation.offset + endApproximation.coefficient * aabbMinX);
1254*35238bceSAndroid Build Coastguard Worker const float aabbMaxX = (float)(samples.back().*predictor);
1255*35238bceSAndroid Build Coastguard Worker const float aabbMaxY = de::max(startApproximation.offset + startApproximation.coefficient * aabbMaxX,
1256*35238bceSAndroid Build Coastguard Worker endApproximation.offset + endApproximation.coefficient * aabbMaxX);
1257*35238bceSAndroid Build Coastguard Worker
1258*35238bceSAndroid Build Coastguard Worker const float aabbArea = (aabbMaxX - aabbMinX) * (aabbMaxY - aabbMinY);
1259*35238bceSAndroid Build Coastguard Worker const float areaBetweenLines =
1260*35238bceSAndroid Build Coastguard Worker getAreaBetweenLines(aabbMinX, aabbMaxX, startApproximation.offset, startApproximation.coefficient,
1261*35238bceSAndroid Build Coastguard Worker endApproximation.offset, endApproximation.coefficient);
1262*35238bceSAndroid Build Coastguard Worker const float errorAreaRatio = (aabbArea < epsilon) ? (1.0f) : (areaBetweenLines / aabbArea);
1263*35238bceSAndroid Build Coastguard Worker
1264*35238bceSAndroid Build Coastguard Worker return de::clamp(1.0f - errorAreaRatio, 0.0f, 1.0f);
1265*35238bceSAndroid Build Coastguard Worker }
1266*35238bceSAndroid Build Coastguard Worker
1267*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
calculateSampleFitLinearity(const std::vector<UploadSampleResult<DurationType>> & samples)1268*35238bceSAndroid Build Coastguard Worker static float calculateSampleFitLinearity(const std::vector<UploadSampleResult<DurationType>> &samples)
1269*35238bceSAndroid Build Coastguard Worker {
1270*35238bceSAndroid Build Coastguard Worker return calculateSampleFitLinearity(samples, &UploadSampleResult<DurationType>::writtenSize);
1271*35238bceSAndroid Build Coastguard Worker }
1272*35238bceSAndroid Build Coastguard Worker
1273*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
calculateSampleFitLinearity(const std::vector<RenderSampleResult<DurationType>> & samples)1274*35238bceSAndroid Build Coastguard Worker static float calculateSampleFitLinearity(const std::vector<RenderSampleResult<DurationType>> &samples)
1275*35238bceSAndroid Build Coastguard Worker {
1276*35238bceSAndroid Build Coastguard Worker return calculateSampleFitLinearity(samples, &RenderSampleResult<DurationType>::renderDataSize);
1277*35238bceSAndroid Build Coastguard Worker }
1278*35238bceSAndroid Build Coastguard Worker
1279*35238bceSAndroid Build Coastguard Worker template <typename T>
calculateSampleTemporalStability(const std::vector<T> & samples,int T::* predictor)1280*35238bceSAndroid Build Coastguard Worker static float calculateSampleTemporalStability(const std::vector<T> &samples, int T::*predictor)
1281*35238bceSAndroid Build Coastguard Worker {
1282*35238bceSAndroid Build Coastguard Worker // Samples are sampled in the following order: 1) even samples (in random order) 2) odd samples (in random order)
1283*35238bceSAndroid Build Coastguard Worker // Compare the fitted line of even samples to the fitted line of the odd samples. Calculate a AABB that fully
1284*35238bceSAndroid Build Coastguard Worker // contains every sample's x component and both fit lines in this range. Calculate the ratio of the area between
1285*35238bceSAndroid Build Coastguard Worker // the lines and the AABB.
1286*35238bceSAndroid Build Coastguard Worker
1287*35238bceSAndroid Build Coastguard Worker const float epsilon = 1.e-6f;
1288*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence evenApproximation =
1289*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, 0, (int)samples.size(), 2, &T::SampleType::fitResponseDuration);
1290*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence oddApproximation =
1291*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, 1, (int)samples.size(), 2, &T::SampleType::fitResponseDuration);
1292*35238bceSAndroid Build Coastguard Worker
1293*35238bceSAndroid Build Coastguard Worker const float aabbMinX = (float)(samples.front().*predictor);
1294*35238bceSAndroid Build Coastguard Worker const float aabbMinY = de::min(evenApproximation.offset + evenApproximation.coefficient * aabbMinX,
1295*35238bceSAndroid Build Coastguard Worker oddApproximation.offset + oddApproximation.coefficient * aabbMinX);
1296*35238bceSAndroid Build Coastguard Worker const float aabbMaxX = (float)(samples.back().*predictor);
1297*35238bceSAndroid Build Coastguard Worker const float aabbMaxY = de::max(evenApproximation.offset + evenApproximation.coefficient * aabbMaxX,
1298*35238bceSAndroid Build Coastguard Worker oddApproximation.offset + oddApproximation.coefficient * aabbMaxX);
1299*35238bceSAndroid Build Coastguard Worker
1300*35238bceSAndroid Build Coastguard Worker const float aabbArea = (aabbMaxX - aabbMinX) * (aabbMaxY - aabbMinY);
1301*35238bceSAndroid Build Coastguard Worker const float areaBetweenLines =
1302*35238bceSAndroid Build Coastguard Worker getAreaBetweenLines(aabbMinX, aabbMaxX, evenApproximation.offset, evenApproximation.coefficient,
1303*35238bceSAndroid Build Coastguard Worker oddApproximation.offset, oddApproximation.coefficient);
1304*35238bceSAndroid Build Coastguard Worker const float errorAreaRatio = (aabbArea < epsilon) ? (1.0f) : (areaBetweenLines / aabbArea);
1305*35238bceSAndroid Build Coastguard Worker
1306*35238bceSAndroid Build Coastguard Worker return de::clamp(1.0f - errorAreaRatio, 0.0f, 1.0f);
1307*35238bceSAndroid Build Coastguard Worker }
1308*35238bceSAndroid Build Coastguard Worker
1309*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
calculateSampleTemporalStability(const std::vector<UploadSampleResult<DurationType>> & samples)1310*35238bceSAndroid Build Coastguard Worker static float calculateSampleTemporalStability(const std::vector<UploadSampleResult<DurationType>> &samples)
1311*35238bceSAndroid Build Coastguard Worker {
1312*35238bceSAndroid Build Coastguard Worker return calculateSampleTemporalStability(samples, &UploadSampleResult<DurationType>::writtenSize);
1313*35238bceSAndroid Build Coastguard Worker }
1314*35238bceSAndroid Build Coastguard Worker
1315*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
calculateSampleTemporalStability(const std::vector<RenderSampleResult<DurationType>> & samples)1316*35238bceSAndroid Build Coastguard Worker static float calculateSampleTemporalStability(const std::vector<RenderSampleResult<DurationType>> &samples)
1317*35238bceSAndroid Build Coastguard Worker {
1318*35238bceSAndroid Build Coastguard Worker return calculateSampleTemporalStability(samples, &RenderSampleResult<DurationType>::renderDataSize);
1319*35238bceSAndroid Build Coastguard Worker }
1320*35238bceSAndroid Build Coastguard Worker
1321*35238bceSAndroid Build Coastguard Worker template <typename DurationType>
bucketizeSamplesUniformly(const std::vector<UploadSampleResult<DurationType>> & samples,std::vector<UploadSampleResult<DurationType>> * buckets,int numBuckets,int & minBufferSize,int & maxBufferSize)1322*35238bceSAndroid Build Coastguard Worker static void bucketizeSamplesUniformly(const std::vector<UploadSampleResult<DurationType>> &samples,
1323*35238bceSAndroid Build Coastguard Worker std::vector<UploadSampleResult<DurationType>> *buckets, int numBuckets,
1324*35238bceSAndroid Build Coastguard Worker int &minBufferSize, int &maxBufferSize)
1325*35238bceSAndroid Build Coastguard Worker {
1326*35238bceSAndroid Build Coastguard Worker minBufferSize = 0;
1327*35238bceSAndroid Build Coastguard Worker maxBufferSize = 0;
1328*35238bceSAndroid Build Coastguard Worker
1329*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1330*35238bceSAndroid Build Coastguard Worker {
1331*35238bceSAndroid Build Coastguard Worker DE_ASSERT(samples[sampleNdx].allocatedSize != 0);
1332*35238bceSAndroid Build Coastguard Worker
1333*35238bceSAndroid Build Coastguard Worker if (!minBufferSize || samples[sampleNdx].allocatedSize < minBufferSize)
1334*35238bceSAndroid Build Coastguard Worker minBufferSize = samples[sampleNdx].allocatedSize;
1335*35238bceSAndroid Build Coastguard Worker if (!maxBufferSize || samples[sampleNdx].allocatedSize > maxBufferSize)
1336*35238bceSAndroid Build Coastguard Worker maxBufferSize = samples[sampleNdx].allocatedSize;
1337*35238bceSAndroid Build Coastguard Worker }
1338*35238bceSAndroid Build Coastguard Worker
1339*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1340*35238bceSAndroid Build Coastguard Worker {
1341*35238bceSAndroid Build Coastguard Worker const float bucketNdxFloat = (float)(samples[sampleNdx].allocatedSize - minBufferSize) /
1342*35238bceSAndroid Build Coastguard Worker (float)(maxBufferSize - minBufferSize) * (float)numBuckets;
1343*35238bceSAndroid Build Coastguard Worker const int bucketNdx = de::clamp((int)deFloatFloor(bucketNdxFloat), 0, numBuckets - 1);
1344*35238bceSAndroid Build Coastguard Worker
1345*35238bceSAndroid Build Coastguard Worker buckets[bucketNdx].push_back(samples[sampleNdx]);
1346*35238bceSAndroid Build Coastguard Worker }
1347*35238bceSAndroid Build Coastguard Worker }
1348*35238bceSAndroid Build Coastguard Worker
1349*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logMapRangeStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1350*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_MAP_STATS>::Type logMapRangeStats(
1351*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1352*35238bceSAndroid Build Coastguard Worker {
1353*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("MapRangeMin", "MapRange: Min time", "us", QP_KEY_TAG_TIME, stats.map.minTime)
1354*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapRangeMax", "MapRange: Max time", "us", QP_KEY_TAG_TIME, stats.map.maxTime)
1355*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapRangeMin90", "MapRange: 90%-Min time", "us", QP_KEY_TAG_TIME,
1356*35238bceSAndroid Build Coastguard Worker stats.map.min2DecileTime)
1357*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapRangeMax90", "MapRange: 90%-Max time", "us", QP_KEY_TAG_TIME,
1358*35238bceSAndroid Build Coastguard Worker stats.map.max9DecileTime)
1359*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapRangeMedian", "MapRange: Median time", "us", QP_KEY_TAG_TIME, stats.map.medianTime);
1360*35238bceSAndroid Build Coastguard Worker }
1361*35238bceSAndroid Build Coastguard Worker
1362*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUnmapStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1363*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_UNMAP_STATS>::Type logUnmapStats(
1364*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1365*35238bceSAndroid Build Coastguard Worker {
1366*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("UnmapMin", "Unmap: Min time", "us", QP_KEY_TAG_TIME, stats.unmap.minTime)
1367*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapMax", "Unmap: Max time", "us", QP_KEY_TAG_TIME, stats.unmap.maxTime)
1368*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapMin90", "Unmap: 90%-Min time", "us", QP_KEY_TAG_TIME, stats.unmap.min2DecileTime)
1369*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapMax90", "Unmap: 90%-Max time", "us", QP_KEY_TAG_TIME, stats.unmap.max9DecileTime)
1370*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapMedian", "Unmap: Median time", "us", QP_KEY_TAG_TIME, stats.unmap.medianTime);
1371*35238bceSAndroid Build Coastguard Worker }
1372*35238bceSAndroid Build Coastguard Worker
1373*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logWriteStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1374*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_WRITE_STATS>::Type logWriteStats(
1375*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1376*35238bceSAndroid Build Coastguard Worker {
1377*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("WriteMin", "Write: Min time", "us", QP_KEY_TAG_TIME, stats.write.minTime)
1378*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteMax", "Write: Max time", "us", QP_KEY_TAG_TIME, stats.write.maxTime)
1379*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteMin90", "Write: 90%-Min time", "us", QP_KEY_TAG_TIME, stats.write.min2DecileTime)
1380*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteMax90", "Write: 90%-Max time", "us", QP_KEY_TAG_TIME, stats.write.max9DecileTime)
1381*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteMedian", "Write: Median time", "us", QP_KEY_TAG_TIME, stats.write.medianTime);
1382*35238bceSAndroid Build Coastguard Worker }
1383*35238bceSAndroid Build Coastguard Worker
1384*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFlushStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1385*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_FLUSH_STATS>::Type logFlushStats(
1386*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1387*35238bceSAndroid Build Coastguard Worker {
1388*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("FlushMin", "Flush: Min time", "us", QP_KEY_TAG_TIME, stats.flush.minTime)
1389*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushMax", "Flush: Max time", "us", QP_KEY_TAG_TIME, stats.flush.maxTime)
1390*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushMin90", "Flush: 90%-Min time", "us", QP_KEY_TAG_TIME, stats.flush.min2DecileTime)
1391*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushMax90", "Flush: 90%-Max time", "us", QP_KEY_TAG_TIME, stats.flush.max9DecileTime)
1392*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushMedian", "Flush: Median time", "us", QP_KEY_TAG_TIME, stats.flush.medianTime);
1393*35238bceSAndroid Build Coastguard Worker }
1394*35238bceSAndroid Build Coastguard Worker
1395*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAllocStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1396*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_ALLOC_STATS>::Type logAllocStats(
1397*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1398*35238bceSAndroid Build Coastguard Worker {
1399*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("AllocMin", "Alloc: Min time", "us", QP_KEY_TAG_TIME, stats.alloc.minTime)
1400*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocMax", "Alloc: Max time", "us", QP_KEY_TAG_TIME, stats.alloc.maxTime)
1401*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocMin90", "Alloc: 90%-Min time", "us", QP_KEY_TAG_TIME, stats.alloc.min2DecileTime)
1402*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocMax90", "Alloc: 90%-Max time", "us", QP_KEY_TAG_TIME, stats.alloc.max9DecileTime)
1403*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocMedian", "Alloc: Median time", "us", QP_KEY_TAG_TIME, stats.alloc.medianTime);
1404*35238bceSAndroid Build Coastguard Worker }
1405*35238bceSAndroid Build Coastguard Worker
1406*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logMapRangeStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1407*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_MAP_STATS>::Value>::Type logMapRangeStats(
1408*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1409*35238bceSAndroid Build Coastguard Worker {
1410*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1411*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1412*35238bceSAndroid Build Coastguard Worker }
1413*35238bceSAndroid Build Coastguard Worker
1414*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUnmapStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1415*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_UNMAP_STATS>::Value>::Type logUnmapStats(
1416*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1417*35238bceSAndroid Build Coastguard Worker {
1418*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1419*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1420*35238bceSAndroid Build Coastguard Worker }
1421*35238bceSAndroid Build Coastguard Worker
1422*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logWriteStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1423*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_WRITE_STATS>::Value>::Type logWriteStats(
1424*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1425*35238bceSAndroid Build Coastguard Worker {
1426*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1427*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1428*35238bceSAndroid Build Coastguard Worker }
1429*35238bceSAndroid Build Coastguard Worker
1430*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFlushStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1431*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_FLUSH_STATS>::Value>::Type logFlushStats(
1432*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1433*35238bceSAndroid Build Coastguard Worker {
1434*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1435*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1436*35238bceSAndroid Build Coastguard Worker }
1437*35238bceSAndroid Build Coastguard Worker
1438*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAllocStats(tcu::TestLog & log,const typename SampleTypeTraits<SampleType>::StatsType & stats)1439*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_ALLOC_STATS>::Value>::Type logAllocStats(
1440*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const typename SampleTypeTraits<SampleType>::StatsType &stats)
1441*35238bceSAndroid Build Coastguard Worker {
1442*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1443*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1444*35238bceSAndroid Build Coastguard Worker }
1445*35238bceSAndroid Build Coastguard Worker
1446*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logMapContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1447*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_MAP_STATS>::Type logMapContribution(
1448*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1449*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1450*35238bceSAndroid Build Coastguard Worker {
1451*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::mapDuration);
1452*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("MapConstantCost", "Map: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1453*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1454*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapLinearCost", "Map: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1455*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1456*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MapMedianCost", "Map: Median cost", "us", QP_KEY_TAG_TIME, stats.map.medianTime);
1457*35238bceSAndroid Build Coastguard Worker }
1458*35238bceSAndroid Build Coastguard Worker
1459*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUnmapContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1460*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_UNMAP_STATS>::Type logUnmapContribution(
1461*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1462*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1463*35238bceSAndroid Build Coastguard Worker {
1464*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::unmapDuration);
1465*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("UnmapConstantCost", "Unmap: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1466*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1467*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapLinearCost", "Unmap: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1468*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1469*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UnmapMedianCost", "Unmap: Median cost", "us", QP_KEY_TAG_TIME, stats.unmap.medianTime);
1470*35238bceSAndroid Build Coastguard Worker }
1471*35238bceSAndroid Build Coastguard Worker
1472*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logWriteContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1473*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_WRITE_STATS>::Type logWriteContribution(
1474*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1475*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1476*35238bceSAndroid Build Coastguard Worker {
1477*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::writeDuration);
1478*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("WriteConstantCost", "Write: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1479*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1480*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteLinearCost", "Write: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1481*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1482*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("WriteMedianCost", "Write: Median cost", "us", QP_KEY_TAG_TIME, stats.write.medianTime);
1483*35238bceSAndroid Build Coastguard Worker }
1484*35238bceSAndroid Build Coastguard Worker
1485*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFlushContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1486*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_FLUSH_STATS>::Type logFlushContribution(
1487*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1488*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1489*35238bceSAndroid Build Coastguard Worker {
1490*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::flushDuration);
1491*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("FlushConstantCost", "Flush: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1492*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1493*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushLinearCost", "Flush: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1494*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1495*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FlushMedianCost", "Flush: Median cost", "us", QP_KEY_TAG_TIME, stats.flush.medianTime);
1496*35238bceSAndroid Build Coastguard Worker }
1497*35238bceSAndroid Build Coastguard Worker
1498*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAllocContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1499*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_ALLOC_STATS>::Type logAllocContribution(
1500*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1501*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1502*35238bceSAndroid Build Coastguard Worker {
1503*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::allocDuration);
1504*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("AllocConstantCost", "Alloc: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1505*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1506*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocLinearCost", "Alloc: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1507*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1508*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("AllocMedianCost", "Alloc: Median cost", "us", QP_KEY_TAG_TIME, stats.alloc.medianTime);
1509*35238bceSAndroid Build Coastguard Worker }
1510*35238bceSAndroid Build Coastguard Worker
1511*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1512*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_RENDER_STATS>::Type logRenderContribution(
1513*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1514*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1515*35238bceSAndroid Build Coastguard Worker {
1516*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::renderDuration);
1517*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("DrawCallConstantCost", "DrawCall: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1518*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1519*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("DrawCallLinearCost", "DrawCall: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1520*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1521*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("DrawCallMedianCost", "DrawCall: Median cost", "us", QP_KEY_TAG_TIME,
1522*35238bceSAndroid Build Coastguard Worker stats.render.medianTime);
1523*35238bceSAndroid Build Coastguard Worker }
1524*35238bceSAndroid Build Coastguard Worker
1525*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logReadContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1526*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_READ_STATS>::Type logReadContribution(
1527*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1528*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1529*35238bceSAndroid Build Coastguard Worker {
1530*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::readDuration);
1531*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("ReadConstantCost", "Read: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1532*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1533*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ReadLinearCost", "Read: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1534*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1535*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ReadMedianCost", "Read: Median cost", "us", QP_KEY_TAG_TIME, stats.read.medianTime);
1536*35238bceSAndroid Build Coastguard Worker }
1537*35238bceSAndroid Build Coastguard Worker
1538*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUploadContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1539*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_UPLOAD_STATS>::Type logUploadContribution(
1540*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1541*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1542*35238bceSAndroid Build Coastguard Worker {
1543*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::uploadDuration);
1544*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("UploadConstantCost", "Upload: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1545*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1546*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UploadLinearCost", "Upload: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1547*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1548*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("UploadMedianCost", "Upload: Median cost", "us", QP_KEY_TAG_TIME,
1549*35238bceSAndroid Build Coastguard Worker stats.upload.medianTime);
1550*35238bceSAndroid Build Coastguard Worker }
1551*35238bceSAndroid Build Coastguard Worker
1552*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logTotalContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1553*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_TOTAL_STATS>::Type logTotalContribution(
1554*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1555*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1556*35238bceSAndroid Build Coastguard Worker {
1557*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting = fitLineToSamples(samples, &SampleType::totalDuration);
1558*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("TotalConstantCost", "Total: Approximated contant cost", "us", QP_KEY_TAG_TIME,
1559*35238bceSAndroid Build Coastguard Worker contributionFitting.offset)
1560*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("TotalLinearCost", "Total: Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
1561*35238bceSAndroid Build Coastguard Worker contributionFitting.coefficient * 1024.0f * 1024.0f)
1562*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("TotalMedianCost", "Total: Median cost", "us", QP_KEY_TAG_TIME, stats.total.medianTime);
1563*35238bceSAndroid Build Coastguard Worker }
1564*35238bceSAndroid Build Coastguard Worker
1565*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFirstRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1566*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_FIRST_RENDER_STATS>::Type logFirstRenderContribution(
1567*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1568*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1569*35238bceSAndroid Build Coastguard Worker {
1570*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting =
1571*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, &SampleType::firstRenderDuration);
1572*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("FirstDrawCallConstantCost", "First DrawCall: Approximated contant cost", "us",
1573*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_TIME, contributionFitting.offset)
1574*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FirstDrawCallLinearCost", "First DrawCall: Approximated linear cost", "us / MB",
1575*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_TIME, contributionFitting.coefficient * 1024.0f * 1024.0f)
1576*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("FirstDrawCallMedianCost", "First DrawCall: Median cost", "us", QP_KEY_TAG_TIME,
1577*35238bceSAndroid Build Coastguard Worker stats.firstRender.medianTime);
1578*35238bceSAndroid Build Coastguard Worker }
1579*35238bceSAndroid Build Coastguard Worker
1580*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logSecondRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1581*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, SampleTypeTraits<SampleType>::HAS_SECOND_RENDER_STATS>::Type logSecondRenderContribution(
1582*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1583*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1584*35238bceSAndroid Build Coastguard Worker {
1585*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence contributionFitting =
1586*35238bceSAndroid Build Coastguard Worker fitLineToSamples(samples, &SampleType::secondRenderDuration);
1587*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("SecondDrawCallConstantCost", "Second DrawCall: Approximated contant cost", "us",
1588*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_TIME, contributionFitting.offset)
1589*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SecondDrawCallLinearCost", "Second DrawCall: Approximated linear cost", "us / MB",
1590*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_TIME, contributionFitting.coefficient * 1024.0f * 1024.0f)
1591*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SecondDrawCallMedianCost", "Second DrawCall: Median cost", "us", QP_KEY_TAG_TIME,
1592*35238bceSAndroid Build Coastguard Worker stats.secondRender.medianTime);
1593*35238bceSAndroid Build Coastguard Worker }
1594*35238bceSAndroid Build Coastguard Worker
1595*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logMapContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1596*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_MAP_STATS>::Value>::Type logMapContribution(
1597*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1598*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1599*35238bceSAndroid Build Coastguard Worker {
1600*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1601*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1602*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1603*35238bceSAndroid Build Coastguard Worker }
1604*35238bceSAndroid Build Coastguard Worker
1605*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUnmapContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1606*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_UNMAP_STATS>::Value>::Type logUnmapContribution(
1607*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1608*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1609*35238bceSAndroid Build Coastguard Worker {
1610*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1611*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1612*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1613*35238bceSAndroid Build Coastguard Worker }
1614*35238bceSAndroid Build Coastguard Worker
1615*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logWriteContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1616*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_WRITE_STATS>::Value>::Type logWriteContribution(
1617*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1618*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1619*35238bceSAndroid Build Coastguard Worker {
1620*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1621*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1622*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1623*35238bceSAndroid Build Coastguard Worker }
1624*35238bceSAndroid Build Coastguard Worker
1625*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFlushContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1626*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_FLUSH_STATS>::Value>::Type logFlushContribution(
1627*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1628*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1629*35238bceSAndroid Build Coastguard Worker {
1630*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1631*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1632*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1633*35238bceSAndroid Build Coastguard Worker }
1634*35238bceSAndroid Build Coastguard Worker
1635*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAllocContribution(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1636*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_ALLOC_STATS>::Value>::Type logAllocContribution(
1637*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<UploadSampleResult<SampleType>> &samples,
1638*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1639*35238bceSAndroid Build Coastguard Worker {
1640*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1641*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1642*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1643*35238bceSAndroid Build Coastguard Worker }
1644*35238bceSAndroid Build Coastguard Worker
1645*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1646*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_RENDER_STATS>::Value>::Type logRenderContribution(
1647*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1648*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1649*35238bceSAndroid Build Coastguard Worker {
1650*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1651*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1652*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1653*35238bceSAndroid Build Coastguard Worker }
1654*35238bceSAndroid Build Coastguard Worker
1655*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logReadContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1656*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_READ_STATS>::Value>::Type logReadContribution(
1657*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1658*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1659*35238bceSAndroid Build Coastguard Worker {
1660*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1661*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1662*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1663*35238bceSAndroid Build Coastguard Worker }
1664*35238bceSAndroid Build Coastguard Worker
1665*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logUploadContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1666*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_UPLOAD_STATS>::Value>::Type logUploadContribution(
1667*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1668*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1669*35238bceSAndroid Build Coastguard Worker {
1670*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1671*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1672*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1673*35238bceSAndroid Build Coastguard Worker }
1674*35238bceSAndroid Build Coastguard Worker
1675*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logTotalContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1676*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_TOTAL_STATS>::Value>::Type logTotalContribution(
1677*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1678*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1679*35238bceSAndroid Build Coastguard Worker {
1680*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1681*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1682*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1683*35238bceSAndroid Build Coastguard Worker }
1684*35238bceSAndroid Build Coastguard Worker
1685*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logFirstRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1686*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_FIRST_RENDER_STATS>::Value>::Type logFirstRenderContribution(
1687*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1688*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1689*35238bceSAndroid Build Coastguard Worker {
1690*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1691*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1692*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1693*35238bceSAndroid Build Coastguard Worker }
1694*35238bceSAndroid Build Coastguard Worker
1695*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logSecondRenderContribution(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples,const typename SampleTypeTraits<SampleType>::StatsType & stats)1696*35238bceSAndroid Build Coastguard Worker static typename EnableIf<void, Not<SampleTypeTraits<SampleType>::HAS_SECOND_RENDER_STATS>::Value>::Type logSecondRenderContribution(
1697*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log, const std::vector<RenderSampleResult<SampleType>> &samples,
1698*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType &stats)
1699*35238bceSAndroid Build Coastguard Worker {
1700*35238bceSAndroid Build Coastguard Worker DE_UNREF(log);
1701*35238bceSAndroid Build Coastguard Worker DE_UNREF(samples);
1702*35238bceSAndroid Build Coastguard Worker DE_UNREF(stats);
1703*35238bceSAndroid Build Coastguard Worker }
1704*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<UploadSampleResult<SingleOperationDuration>> & samples)1705*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1706*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<SingleOperationDuration>> &samples)
1707*35238bceSAndroid Build Coastguard Worker {
1708*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1709*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WrittenSize", "Written size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1710*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("BufferSize", "Buffer size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1711*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UploadTime", "Upload time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1712*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1713*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1714*35238bceSAndroid Build Coastguard Worker
1715*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1716*35238bceSAndroid Build Coastguard Worker {
1717*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1718*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1719*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].writtenSize);
1720*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].writtenSize << samples[sampleNdx].bufferSize
1721*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << fitResidual << tcu::TestLog::EndSample;
1722*35238bceSAndroid Build Coastguard Worker }
1723*35238bceSAndroid Build Coastguard Worker
1724*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1725*35238bceSAndroid Build Coastguard Worker }
1726*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<UploadSampleResult<MapBufferRangeDuration>> & samples)1727*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1728*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeDuration>> &samples)
1729*35238bceSAndroid Build Coastguard Worker {
1730*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1731*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WrittenSize", "Written size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1732*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("BufferSize", "Buffer size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1733*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1734*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("AllocTime", "Alloc time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1735*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("MapTime", "Map time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1736*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnmapTime", "Unmap time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1737*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WriteTime", "Write time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1738*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1739*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1740*35238bceSAndroid Build Coastguard Worker
1741*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1742*35238bceSAndroid Build Coastguard Worker {
1743*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1744*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1745*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].writtenSize);
1746*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].writtenSize << samples[sampleNdx].bufferSize
1747*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.allocDuration
1748*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.mapDuration << (int)samples[sampleNdx].duration.unmapDuration
1749*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.writeDuration << fitResidual << tcu::TestLog::EndSample;
1750*35238bceSAndroid Build Coastguard Worker }
1751*35238bceSAndroid Build Coastguard Worker
1752*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1753*35238bceSAndroid Build Coastguard Worker }
1754*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<UploadSampleResult<MapBufferRangeDurationNoAlloc>> & samples)1755*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1756*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeDurationNoAlloc>> &samples)
1757*35238bceSAndroid Build Coastguard Worker {
1758*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1759*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WrittenSize", "Written size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1760*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("BufferSize", "Buffer size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1761*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1762*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("MapTime", "Map time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1763*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnmapTime", "Unmap time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1764*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WriteTime", "Write time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1765*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1766*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1767*35238bceSAndroid Build Coastguard Worker
1768*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1769*35238bceSAndroid Build Coastguard Worker {
1770*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1771*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1772*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].writtenSize);
1773*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].writtenSize << samples[sampleNdx].bufferSize
1774*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.mapDuration
1775*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.unmapDuration << (int)samples[sampleNdx].duration.writeDuration
1776*35238bceSAndroid Build Coastguard Worker << fitResidual << tcu::TestLog::EndSample;
1777*35238bceSAndroid Build Coastguard Worker }
1778*35238bceSAndroid Build Coastguard Worker
1779*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1780*35238bceSAndroid Build Coastguard Worker }
1781*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<UploadSampleResult<MapBufferRangeFlushDuration>> & samples)1782*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1783*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeFlushDuration>> &samples)
1784*35238bceSAndroid Build Coastguard Worker {
1785*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1786*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WrittenSize", "Written size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1787*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("BufferSize", "Buffer size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1788*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1789*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("AllocTime", "Alloc time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1790*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("MapTime", "Map time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1791*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnmapTime", "Unmap time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1792*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WriteTime", "Write time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1793*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FlushTime", "Flush time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1794*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1795*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1796*35238bceSAndroid Build Coastguard Worker
1797*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1798*35238bceSAndroid Build Coastguard Worker {
1799*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1800*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1801*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].writtenSize);
1802*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].writtenSize << samples[sampleNdx].bufferSize
1803*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.allocDuration
1804*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.mapDuration << (int)samples[sampleNdx].duration.unmapDuration
1805*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.writeDuration << (int)samples[sampleNdx].duration.flushDuration
1806*35238bceSAndroid Build Coastguard Worker << fitResidual << tcu::TestLog::EndSample;
1807*35238bceSAndroid Build Coastguard Worker }
1808*35238bceSAndroid Build Coastguard Worker
1809*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1810*35238bceSAndroid Build Coastguard Worker }
1811*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<UploadSampleResult<MapBufferRangeFlushDurationNoAlloc>> & samples)1812*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1813*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<MapBufferRangeFlushDurationNoAlloc>> &samples)
1814*35238bceSAndroid Build Coastguard Worker {
1815*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1816*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WrittenSize", "Written size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1817*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("BufferSize", "Buffer size", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1818*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1819*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("MapTime", "Map time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1820*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnmapTime", "Unmap time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1821*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("WriteTime", "Write time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1822*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FlushTime", "Flush time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1823*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1824*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1825*35238bceSAndroid Build Coastguard Worker
1826*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1827*35238bceSAndroid Build Coastguard Worker {
1828*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1829*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1830*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].writtenSize);
1831*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].writtenSize << samples[sampleNdx].bufferSize
1832*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.mapDuration
1833*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.unmapDuration << (int)samples[sampleNdx].duration.writeDuration
1834*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.flushDuration << fitResidual << tcu::TestLog::EndSample;
1835*35238bceSAndroid Build Coastguard Worker }
1836*35238bceSAndroid Build Coastguard Worker
1837*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1838*35238bceSAndroid Build Coastguard Worker }
1839*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<RenderSampleResult<RenderReadDuration>> & samples)1840*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1841*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<RenderReadDuration>> &samples)
1842*35238bceSAndroid Build Coastguard Worker {
1843*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1844*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DataSize", "Data processed", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1845*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("VertexCount", "Number of vertices", "vertices", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1846*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1847*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawCallTime", "Draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1848*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1849*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1850*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1851*35238bceSAndroid Build Coastguard Worker
1852*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1853*35238bceSAndroid Build Coastguard Worker {
1854*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1855*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1856*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].renderDataSize);
1857*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].renderDataSize << samples[sampleNdx].numVertices
1858*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.renderReadDuration << (int)samples[sampleNdx].duration.renderDuration
1859*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.readDuration << fitResidual << tcu::TestLog::EndSample;
1860*35238bceSAndroid Build Coastguard Worker }
1861*35238bceSAndroid Build Coastguard Worker
1862*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1863*35238bceSAndroid Build Coastguard Worker }
1864*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<RenderSampleResult<UnrelatedUploadRenderReadDuration>> & samples)1865*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1866*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<UnrelatedUploadRenderReadDuration>> &samples)
1867*35238bceSAndroid Build Coastguard Worker {
1868*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1869*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DataSize", "Data processed", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1870*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("VertexCount", "Number of vertices", "vertices", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1871*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnrelatedUploadSize", "Unrelated upload size", "bytes",
1872*35238bceSAndroid Build Coastguard Worker QP_SAMPLE_VALUE_TAG_PREDICTOR)
1873*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1874*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawCallTime", "Draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1875*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1876*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1877*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1878*35238bceSAndroid Build Coastguard Worker
1879*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1880*35238bceSAndroid Build Coastguard Worker {
1881*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1882*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1883*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].renderDataSize);
1884*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].renderDataSize << samples[sampleNdx].numVertices
1885*35238bceSAndroid Build Coastguard Worker << samples[sampleNdx].unrelatedDataSize << (int)samples[sampleNdx].duration.renderReadDuration
1886*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.renderDuration << (int)samples[sampleNdx].duration.readDuration
1887*35238bceSAndroid Build Coastguard Worker << fitResidual << tcu::TestLog::EndSample;
1888*35238bceSAndroid Build Coastguard Worker }
1889*35238bceSAndroid Build Coastguard Worker
1890*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1891*35238bceSAndroid Build Coastguard Worker }
1892*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<RenderSampleResult<UploadRenderReadDuration>> & samples)1893*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1894*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<UploadRenderReadDuration>> &samples)
1895*35238bceSAndroid Build Coastguard Worker {
1896*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1897*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DataSize", "Data processed", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1898*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UploadSize", "Data uploaded", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1899*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("VertexCount", "Number of vertices", "vertices", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1900*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawReadTime", "Draw call and ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1901*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1902*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("Upload time", "Upload time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1903*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawCallTime", "Draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1904*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1905*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1906*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1907*35238bceSAndroid Build Coastguard Worker
1908*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1909*35238bceSAndroid Build Coastguard Worker {
1910*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1911*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1912*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].renderDataSize);
1913*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].renderDataSize << samples[sampleNdx].uploadedDataSize
1914*35238bceSAndroid Build Coastguard Worker << samples[sampleNdx].numVertices << (int)samples[sampleNdx].duration.renderReadDuration
1915*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.uploadDuration
1916*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.renderDuration << (int)samples[sampleNdx].duration.readDuration
1917*35238bceSAndroid Build Coastguard Worker << fitResidual << tcu::TestLog::EndSample;
1918*35238bceSAndroid Build Coastguard Worker }
1919*35238bceSAndroid Build Coastguard Worker
1920*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1921*35238bceSAndroid Build Coastguard Worker }
1922*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<RenderSampleResult<UploadRenderReadDurationWithUnrelatedUploadSize>> & samples)1923*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1924*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<UploadRenderReadDurationWithUnrelatedUploadSize>> &samples)
1925*35238bceSAndroid Build Coastguard Worker {
1926*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1927*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DataSize", "Data processed", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1928*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UploadSize", "Data uploaded", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1929*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("VertexCount", "Number of vertices", "vertices", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1930*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UnrelatedUploadSize", "Unrelated upload size", "bytes",
1931*35238bceSAndroid Build Coastguard Worker QP_SAMPLE_VALUE_TAG_PREDICTOR)
1932*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawReadTime", "Draw call and ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1933*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1934*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("Upload time", "Upload time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1935*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawCallTime", "Draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1936*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1937*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1938*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1939*35238bceSAndroid Build Coastguard Worker
1940*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1941*35238bceSAndroid Build Coastguard Worker {
1942*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1943*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1944*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].renderDataSize);
1945*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].renderDataSize << samples[sampleNdx].uploadedDataSize
1946*35238bceSAndroid Build Coastguard Worker << samples[sampleNdx].numVertices << samples[sampleNdx].unrelatedDataSize
1947*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.renderReadDuration << (int)samples[sampleNdx].duration.totalDuration
1948*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.uploadDuration << (int)samples[sampleNdx].duration.renderDuration
1949*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.readDuration << fitResidual << tcu::TestLog::EndSample;
1950*35238bceSAndroid Build Coastguard Worker }
1951*35238bceSAndroid Build Coastguard Worker
1952*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1953*35238bceSAndroid Build Coastguard Worker }
1954*35238bceSAndroid Build Coastguard Worker
logSampleList(tcu::TestLog & log,const LineParametersWithConfidence & theilSenFitting,const std::vector<RenderSampleResult<RenderUploadRenderReadDuration>> & samples)1955*35238bceSAndroid Build Coastguard Worker void logSampleList(tcu::TestLog &log, const LineParametersWithConfidence &theilSenFitting,
1956*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<RenderUploadRenderReadDuration>> &samples)
1957*35238bceSAndroid Build Coastguard Worker {
1958*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
1959*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DataSize", "Data processed", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1960*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("UploadSize", "Data uploaded", "bytes", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1961*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("VertexCount", "Number of vertices", "vertices", QP_SAMPLE_VALUE_TAG_PREDICTOR)
1962*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawReadTime", "Second draw call and ReadPixels time", "us",
1963*35238bceSAndroid Build Coastguard Worker QP_SAMPLE_VALUE_TAG_RESPONSE)
1964*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1965*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FirstDrawCallTime", "First draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1966*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("Upload time", "Upload time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1967*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("SecondDrawCallTime", "Second draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1968*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1969*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("FitResidual", "Fit residual", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
1970*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
1971*35238bceSAndroid Build Coastguard Worker
1972*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)samples.size(); ++sampleNdx)
1973*35238bceSAndroid Build Coastguard Worker {
1974*35238bceSAndroid Build Coastguard Worker const float fitResidual =
1975*35238bceSAndroid Build Coastguard Worker (float)samples[sampleNdx].duration.fitResponseDuration -
1976*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)samples[sampleNdx].renderDataSize);
1977*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Sample << samples[sampleNdx].renderDataSize << samples[sampleNdx].uploadedDataSize
1978*35238bceSAndroid Build Coastguard Worker << samples[sampleNdx].numVertices << (int)samples[sampleNdx].duration.renderReadDuration
1979*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.totalDuration << (int)samples[sampleNdx].duration.firstRenderDuration
1980*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.uploadDuration << (int)samples[sampleNdx].duration.secondRenderDuration
1981*35238bceSAndroid Build Coastguard Worker << (int)samples[sampleNdx].duration.readDuration << fitResidual << tcu::TestLog::EndSample;
1982*35238bceSAndroid Build Coastguard Worker }
1983*35238bceSAndroid Build Coastguard Worker
1984*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::EndSampleList;
1985*35238bceSAndroid Build Coastguard Worker }
1986*35238bceSAndroid Build Coastguard Worker
1987*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
analyzeSampleResults(tcu::TestLog & log,const std::vector<UploadSampleResult<SampleType>> & samples,bool logBucketPerformance)1988*35238bceSAndroid Build Coastguard Worker static UploadSampleAnalyzeResult analyzeSampleResults(tcu::TestLog &log,
1989*35238bceSAndroid Build Coastguard Worker const std::vector<UploadSampleResult<SampleType>> &samples,
1990*35238bceSAndroid Build Coastguard Worker bool logBucketPerformance)
1991*35238bceSAndroid Build Coastguard Worker {
1992*35238bceSAndroid Build Coastguard Worker // Assume data is linear with some outliers, fit a line
1993*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence theilSenFitting = fitLineToSamples(samples);
1994*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType resultStats =
1995*35238bceSAndroid Build Coastguard Worker calculateSampleStatistics(theilSenFitting, samples);
1996*35238bceSAndroid Build Coastguard Worker float approximatedTransferRate;
1997*35238bceSAndroid Build Coastguard Worker float approximatedTransferRateNoConstant;
1998*35238bceSAndroid Build Coastguard Worker
1999*35238bceSAndroid Build Coastguard Worker // Output raw samples
2000*35238bceSAndroid Build Coastguard Worker {
2001*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Samples", "Samples");
2002*35238bceSAndroid Build Coastguard Worker logSampleList(log, theilSenFitting, samples);
2003*35238bceSAndroid Build Coastguard Worker }
2004*35238bceSAndroid Build Coastguard Worker
2005*35238bceSAndroid Build Coastguard Worker // Calculate results for different ranges
2006*35238bceSAndroid Build Coastguard Worker if (logBucketPerformance)
2007*35238bceSAndroid Build Coastguard Worker {
2008*35238bceSAndroid Build Coastguard Worker const int numBuckets = 4;
2009*35238bceSAndroid Build Coastguard Worker int minBufferSize = 0;
2010*35238bceSAndroid Build Coastguard Worker int maxBufferSize = 0;
2011*35238bceSAndroid Build Coastguard Worker std::vector<UploadSampleResult<SampleType>> buckets[numBuckets];
2012*35238bceSAndroid Build Coastguard Worker
2013*35238bceSAndroid Build Coastguard Worker bucketizeSamplesUniformly(samples, &buckets[0], numBuckets, minBufferSize, maxBufferSize);
2014*35238bceSAndroid Build Coastguard Worker
2015*35238bceSAndroid Build Coastguard Worker for (int bucketNdx = 0; bucketNdx < numBuckets; ++bucketNdx)
2016*35238bceSAndroid Build Coastguard Worker {
2017*35238bceSAndroid Build Coastguard Worker if (buckets[bucketNdx].empty())
2018*35238bceSAndroid Build Coastguard Worker continue;
2019*35238bceSAndroid Build Coastguard Worker
2020*35238bceSAndroid Build Coastguard Worker // Print a nice result summary
2021*35238bceSAndroid Build Coastguard Worker
2022*35238bceSAndroid Build Coastguard Worker const int bucketRangeMin =
2023*35238bceSAndroid Build Coastguard Worker minBufferSize + (int)(((float)bucketNdx / (float)numBuckets) * (float)(maxBufferSize - minBufferSize));
2024*35238bceSAndroid Build Coastguard Worker const int bucketRangeMax = minBufferSize + (int)(((float)(bucketNdx + 1) / (float)numBuckets) *
2025*35238bceSAndroid Build Coastguard Worker (float)(maxBufferSize - minBufferSize));
2026*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType stats =
2027*35238bceSAndroid Build Coastguard Worker calculateSampleStatistics(theilSenFitting, buckets[bucketNdx]);
2028*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(
2029*35238bceSAndroid Build Coastguard Worker log, "BufferSizeRange",
2030*35238bceSAndroid Build Coastguard Worker std::string("Transfer performance with buffer size in range [")
2031*35238bceSAndroid Build Coastguard Worker .append(getHumanReadableByteSize(bucketRangeMin)
2032*35238bceSAndroid Build Coastguard Worker .append(", ")
2033*35238bceSAndroid Build Coastguard Worker .append(getHumanReadableByteSize(bucketRangeMax).append("]"))));
2034*35238bceSAndroid Build Coastguard Worker
2035*35238bceSAndroid Build Coastguard Worker logMapRangeStats<SampleType>(log, stats);
2036*35238bceSAndroid Build Coastguard Worker logUnmapStats<SampleType>(log, stats);
2037*35238bceSAndroid Build Coastguard Worker logWriteStats<SampleType>(log, stats);
2038*35238bceSAndroid Build Coastguard Worker logFlushStats<SampleType>(log, stats);
2039*35238bceSAndroid Build Coastguard Worker logAllocStats<SampleType>(log, stats);
2040*35238bceSAndroid Build Coastguard Worker
2041*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("Min", "Total: Min time", "us", QP_KEY_TAG_TIME, stats.result.minTime)
2042*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Max", "Total: Max time", "us", QP_KEY_TAG_TIME, stats.result.maxTime)
2043*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Min90", "Total: 90%-Min time", "us", QP_KEY_TAG_TIME,
2044*35238bceSAndroid Build Coastguard Worker stats.result.min2DecileTime)
2045*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Max90", "Total: 90%-Max time", "us", QP_KEY_TAG_TIME,
2046*35238bceSAndroid Build Coastguard Worker stats.result.max9DecileTime)
2047*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Median", "Total: Median time", "us", QP_KEY_TAG_TIME, stats.result.medianTime)
2048*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MedianTransfer", "Median transfer rate", "MB / s", QP_KEY_TAG_PERFORMANCE,
2049*35238bceSAndroid Build Coastguard Worker stats.medianRate / 1024.0f / 1024.0f)
2050*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MaxDiff", "Max difference to approximated", "us", QP_KEY_TAG_TIME,
2051*35238bceSAndroid Build Coastguard Worker stats.maxDiffTime)
2052*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Max90Diff", "90%-Max difference to approximated", "us", QP_KEY_TAG_TIME,
2053*35238bceSAndroid Build Coastguard Worker stats.maxDiff9DecileTime)
2054*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MedianDiff", "Median difference to approximated", "us", QP_KEY_TAG_TIME,
2055*35238bceSAndroid Build Coastguard Worker stats.medianDiffTime)
2056*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MaxRelDiff", "Max relative difference to approximated", "%", QP_KEY_TAG_NONE,
2057*35238bceSAndroid Build Coastguard Worker stats.maxRelDiffTime * 100.0f)
2058*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Max90RelDiff", "90%-Max relative difference to approximated", "%",
2059*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_NONE, stats.max9DecileRelDiffTime * 100.0f)
2060*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("MedianRelDiff", "Median relative difference to approximated", "%",
2061*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_NONE, stats.medianRelDiffTime * 100.0f);
2062*35238bceSAndroid Build Coastguard Worker }
2063*35238bceSAndroid Build Coastguard Worker }
2064*35238bceSAndroid Build Coastguard Worker
2065*35238bceSAndroid Build Coastguard Worker // Contributions
2066*35238bceSAndroid Build Coastguard Worker if (SampleTypeTraits<SampleType>::LOG_CONTRIBUTIONS)
2067*35238bceSAndroid Build Coastguard Worker {
2068*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Contribution", "Contributions");
2069*35238bceSAndroid Build Coastguard Worker
2070*35238bceSAndroid Build Coastguard Worker logMapContribution(log, samples, resultStats);
2071*35238bceSAndroid Build Coastguard Worker logUnmapContribution(log, samples, resultStats);
2072*35238bceSAndroid Build Coastguard Worker logWriteContribution(log, samples, resultStats);
2073*35238bceSAndroid Build Coastguard Worker logFlushContribution(log, samples, resultStats);
2074*35238bceSAndroid Build Coastguard Worker logAllocContribution(log, samples, resultStats);
2075*35238bceSAndroid Build Coastguard Worker }
2076*35238bceSAndroid Build Coastguard Worker
2077*35238bceSAndroid Build Coastguard Worker // Print results
2078*35238bceSAndroid Build Coastguard Worker {
2079*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Results", "Results");
2080*35238bceSAndroid Build Coastguard Worker
2081*35238bceSAndroid Build Coastguard Worker const int medianBufferSize = (samples.front().bufferSize + samples.back().bufferSize) / 2;
2082*35238bceSAndroid Build Coastguard Worker const float approximatedTransferTime =
2083*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)medianBufferSize) / 1000.0f / 1000.0f;
2084*35238bceSAndroid Build Coastguard Worker const float approximatedTransferTimeNoConstant =
2085*35238bceSAndroid Build Coastguard Worker (theilSenFitting.coefficient * (float)medianBufferSize) / 1000.0f / 1000.0f;
2086*35238bceSAndroid Build Coastguard Worker const float sampleLinearity = calculateSampleFitLinearity(samples);
2087*35238bceSAndroid Build Coastguard Worker const float sampleTemporalStability = calculateSampleTemporalStability(samples);
2088*35238bceSAndroid Build Coastguard Worker
2089*35238bceSAndroid Build Coastguard Worker approximatedTransferRateNoConstant = (float)medianBufferSize / approximatedTransferTimeNoConstant;
2090*35238bceSAndroid Build Coastguard Worker approximatedTransferRate = (float)medianBufferSize / approximatedTransferTime;
2091*35238bceSAndroid Build Coastguard Worker
2092*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("ResultLinearity", "Sample linearity", "%", QP_KEY_TAG_QUALITY,
2093*35238bceSAndroid Build Coastguard Worker sampleLinearity * 100.0f)
2094*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleTemporalStability", "Sample temporal stability", "%", QP_KEY_TAG_QUALITY,
2095*35238bceSAndroid Build Coastguard Worker sampleTemporalStability * 100.0f)
2096*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCost", "Approximated contant cost", "us", QP_KEY_TAG_TIME,
2097*35238bceSAndroid Build Coastguard Worker theilSenFitting.offset)
2098*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCostConfidence60Lower",
2099*35238bceSAndroid Build Coastguard Worker "Approximated contant cost 60% confidence lower limit", "us", QP_KEY_TAG_TIME,
2100*35238bceSAndroid Build Coastguard Worker theilSenFitting.offsetConfidenceLower)
2101*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCostConfidence60Upper",
2102*35238bceSAndroid Build Coastguard Worker "Approximated contant cost 60% confidence upper limit", "us", QP_KEY_TAG_TIME,
2103*35238bceSAndroid Build Coastguard Worker theilSenFitting.offsetConfidenceUpper)
2104*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCost", "Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
2105*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficient * 1024.0f * 1024.0f)
2106*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCostConfidence60Lower",
2107*35238bceSAndroid Build Coastguard Worker "Approximated linear cost 60% confidence lower limit", "us / MB", QP_KEY_TAG_TIME,
2108*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficientConfidenceLower * 1024.0f * 1024.0f)
2109*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCostConfidence60Upper",
2110*35238bceSAndroid Build Coastguard Worker "Approximated linear cost 60% confidence upper limit", "us / MB", QP_KEY_TAG_TIME,
2111*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficientConfidenceUpper * 1024.0f * 1024.0f)
2112*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedTransferRate", "Approximated transfer rate", "MB / s",
2113*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_PERFORMANCE, approximatedTransferRate / 1024.0f / 1024.0f)
2114*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedTransferRateNoConstant",
2115*35238bceSAndroid Build Coastguard Worker "Approximated transfer rate without constant cost", "MB / s", QP_KEY_TAG_PERFORMANCE,
2116*35238bceSAndroid Build Coastguard Worker approximatedTransferRateNoConstant / 1024.0f / 1024.0f)
2117*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleMedianTime", "Median sample time", "us", QP_KEY_TAG_TIME,
2118*35238bceSAndroid Build Coastguard Worker resultStats.result.medianTime)
2119*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleMedianTransfer", "Median transfer rate", "MB / s", QP_KEY_TAG_PERFORMANCE,
2120*35238bceSAndroid Build Coastguard Worker resultStats.medianRate / 1024.0f / 1024.0f);
2121*35238bceSAndroid Build Coastguard Worker }
2122*35238bceSAndroid Build Coastguard Worker
2123*35238bceSAndroid Build Coastguard Worker // return approximated transfer rate
2124*35238bceSAndroid Build Coastguard Worker {
2125*35238bceSAndroid Build Coastguard Worker UploadSampleAnalyzeResult result;
2126*35238bceSAndroid Build Coastguard Worker
2127*35238bceSAndroid Build Coastguard Worker result.transferRateMedian = resultStats.medianRate;
2128*35238bceSAndroid Build Coastguard Worker result.transferRateAtRange = approximatedTransferRate;
2129*35238bceSAndroid Build Coastguard Worker result.transferRateAtInfinity = approximatedTransferRateNoConstant;
2130*35238bceSAndroid Build Coastguard Worker
2131*35238bceSAndroid Build Coastguard Worker return result;
2132*35238bceSAndroid Build Coastguard Worker }
2133*35238bceSAndroid Build Coastguard Worker }
2134*35238bceSAndroid Build Coastguard Worker
2135*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
analyzeSampleResults(tcu::TestLog & log,const std::vector<RenderSampleResult<SampleType>> & samples)2136*35238bceSAndroid Build Coastguard Worker static RenderSampleAnalyzeResult analyzeSampleResults(tcu::TestLog &log,
2137*35238bceSAndroid Build Coastguard Worker const std::vector<RenderSampleResult<SampleType>> &samples)
2138*35238bceSAndroid Build Coastguard Worker {
2139*35238bceSAndroid Build Coastguard Worker // Assume data is linear with some outliers, fit a line
2140*35238bceSAndroid Build Coastguard Worker const LineParametersWithConfidence theilSenFitting = fitLineToSamples(samples);
2141*35238bceSAndroid Build Coastguard Worker const typename SampleTypeTraits<SampleType>::StatsType resultStats =
2142*35238bceSAndroid Build Coastguard Worker calculateSampleStatistics(theilSenFitting, samples);
2143*35238bceSAndroid Build Coastguard Worker float approximatedProcessingRate;
2144*35238bceSAndroid Build Coastguard Worker float approximatedProcessingRateNoConstant;
2145*35238bceSAndroid Build Coastguard Worker
2146*35238bceSAndroid Build Coastguard Worker // output raw samples
2147*35238bceSAndroid Build Coastguard Worker {
2148*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Samples", "Samples");
2149*35238bceSAndroid Build Coastguard Worker logSampleList(log, theilSenFitting, samples);
2150*35238bceSAndroid Build Coastguard Worker }
2151*35238bceSAndroid Build Coastguard Worker
2152*35238bceSAndroid Build Coastguard Worker // Contributions
2153*35238bceSAndroid Build Coastguard Worker if (SampleTypeTraits<SampleType>::LOG_CONTRIBUTIONS)
2154*35238bceSAndroid Build Coastguard Worker {
2155*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Contribution", "Contributions");
2156*35238bceSAndroid Build Coastguard Worker
2157*35238bceSAndroid Build Coastguard Worker logFirstRenderContribution(log, samples, resultStats);
2158*35238bceSAndroid Build Coastguard Worker logUploadContribution(log, samples, resultStats);
2159*35238bceSAndroid Build Coastguard Worker logRenderContribution(log, samples, resultStats);
2160*35238bceSAndroid Build Coastguard Worker logSecondRenderContribution(log, samples, resultStats);
2161*35238bceSAndroid Build Coastguard Worker logReadContribution(log, samples, resultStats);
2162*35238bceSAndroid Build Coastguard Worker logTotalContribution(log, samples, resultStats);
2163*35238bceSAndroid Build Coastguard Worker }
2164*35238bceSAndroid Build Coastguard Worker
2165*35238bceSAndroid Build Coastguard Worker // print results
2166*35238bceSAndroid Build Coastguard Worker {
2167*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(log, "Results", "Results");
2168*35238bceSAndroid Build Coastguard Worker
2169*35238bceSAndroid Build Coastguard Worker const int medianDataSize = (samples.front().renderDataSize + samples.back().renderDataSize) / 2;
2170*35238bceSAndroid Build Coastguard Worker const float approximatedRenderTime =
2171*35238bceSAndroid Build Coastguard Worker (theilSenFitting.offset + theilSenFitting.coefficient * (float)medianDataSize) / 1000.0f / 1000.0f;
2172*35238bceSAndroid Build Coastguard Worker const float approximatedRenderTimeNoConstant =
2173*35238bceSAndroid Build Coastguard Worker (theilSenFitting.coefficient * (float)medianDataSize) / 1000.0f / 1000.0f;
2174*35238bceSAndroid Build Coastguard Worker const float sampleLinearity = calculateSampleFitLinearity(samples);
2175*35238bceSAndroid Build Coastguard Worker const float sampleTemporalStability = calculateSampleTemporalStability(samples);
2176*35238bceSAndroid Build Coastguard Worker
2177*35238bceSAndroid Build Coastguard Worker approximatedProcessingRateNoConstant = (float)medianDataSize / approximatedRenderTimeNoConstant;
2178*35238bceSAndroid Build Coastguard Worker approximatedProcessingRate = (float)medianDataSize / approximatedRenderTime;
2179*35238bceSAndroid Build Coastguard Worker
2180*35238bceSAndroid Build Coastguard Worker log << tcu::TestLog::Float("ResultLinearity", "Sample linearity", "%", QP_KEY_TAG_QUALITY,
2181*35238bceSAndroid Build Coastguard Worker sampleLinearity * 100.0f)
2182*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleTemporalStability", "Sample temporal stability", "%", QP_KEY_TAG_QUALITY,
2183*35238bceSAndroid Build Coastguard Worker sampleTemporalStability * 100.0f)
2184*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCost", "Approximated contant cost", "us", QP_KEY_TAG_TIME,
2185*35238bceSAndroid Build Coastguard Worker theilSenFitting.offset)
2186*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCostConfidence60Lower",
2187*35238bceSAndroid Build Coastguard Worker "Approximated contant cost 60% confidence lower limit", "us", QP_KEY_TAG_TIME,
2188*35238bceSAndroid Build Coastguard Worker theilSenFitting.offsetConfidenceLower)
2189*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedConstantCostConfidence60Upper",
2190*35238bceSAndroid Build Coastguard Worker "Approximated contant cost 60% confidence upper limit", "us", QP_KEY_TAG_TIME,
2191*35238bceSAndroid Build Coastguard Worker theilSenFitting.offsetConfidenceUpper)
2192*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCost", "Approximated linear cost", "us / MB", QP_KEY_TAG_TIME,
2193*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficient * 1024.0f * 1024.0f)
2194*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCostConfidence60Lower",
2195*35238bceSAndroid Build Coastguard Worker "Approximated linear cost 60% confidence lower limit", "us / MB", QP_KEY_TAG_TIME,
2196*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficientConfidenceLower * 1024.0f * 1024.0f)
2197*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedLinearCostConfidence60Upper",
2198*35238bceSAndroid Build Coastguard Worker "Approximated linear cost 60% confidence upper limit", "us / MB", QP_KEY_TAG_TIME,
2199*35238bceSAndroid Build Coastguard Worker theilSenFitting.coefficientConfidenceUpper * 1024.0f * 1024.0f)
2200*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedProcessRate", "Approximated processing rate", "MB / s",
2201*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_PERFORMANCE, approximatedProcessingRate / 1024.0f / 1024.0f)
2202*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("ApproximatedProcessRateNoConstant",
2203*35238bceSAndroid Build Coastguard Worker "Approximated processing rate without constant cost", "MB / s",
2204*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_PERFORMANCE, approximatedProcessingRateNoConstant / 1024.0f / 1024.0f)
2205*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleMedianTime", "Median sample time", "us", QP_KEY_TAG_TIME,
2206*35238bceSAndroid Build Coastguard Worker resultStats.result.medianTime)
2207*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("SampleMedianProcess", "Median processing rate", "MB / s", QP_KEY_TAG_PERFORMANCE,
2208*35238bceSAndroid Build Coastguard Worker resultStats.medianRate / 1024.0f / 1024.0f);
2209*35238bceSAndroid Build Coastguard Worker }
2210*35238bceSAndroid Build Coastguard Worker
2211*35238bceSAndroid Build Coastguard Worker // return approximated render rate
2212*35238bceSAndroid Build Coastguard Worker {
2213*35238bceSAndroid Build Coastguard Worker RenderSampleAnalyzeResult result;
2214*35238bceSAndroid Build Coastguard Worker
2215*35238bceSAndroid Build Coastguard Worker result.renderRateMedian = resultStats.medianRate;
2216*35238bceSAndroid Build Coastguard Worker result.renderRateAtRange = approximatedProcessingRate;
2217*35238bceSAndroid Build Coastguard Worker result.renderRateAtInfinity = approximatedProcessingRateNoConstant;
2218*35238bceSAndroid Build Coastguard Worker
2219*35238bceSAndroid Build Coastguard Worker return result;
2220*35238bceSAndroid Build Coastguard Worker }
2221*35238bceSAndroid Build Coastguard Worker return RenderSampleAnalyzeResult();
2222*35238bceSAndroid Build Coastguard Worker }
2223*35238bceSAndroid Build Coastguard Worker
generateTwoPassRandomIterationOrder(std::vector<int> & iterationOrder,int numSamples)2224*35238bceSAndroid Build Coastguard Worker static void generateTwoPassRandomIterationOrder(std::vector<int> &iterationOrder, int numSamples)
2225*35238bceSAndroid Build Coastguard Worker {
2226*35238bceSAndroid Build Coastguard Worker de::Random rnd(0xabc);
2227*35238bceSAndroid Build Coastguard Worker const int midPoint = (numSamples + 1) / 2; // !< ceil(m_numSamples / 2)
2228*35238bceSAndroid Build Coastguard Worker
2229*35238bceSAndroid Build Coastguard Worker DE_ASSERT((int)iterationOrder.size() == numSamples);
2230*35238bceSAndroid Build Coastguard Worker
2231*35238bceSAndroid Build Coastguard Worker // Two "passes" over range, randomize order in both passes
2232*35238bceSAndroid Build Coastguard Worker // This allows to us detect if iterations are not independent
2233*35238bceSAndroid Build Coastguard Worker // (first run and later run samples differ significantly?)
2234*35238bceSAndroid Build Coastguard Worker
2235*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < midPoint; ++sampleNdx)
2236*35238bceSAndroid Build Coastguard Worker iterationOrder[sampleNdx] = sampleNdx * 2;
2237*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = midPoint; sampleNdx < numSamples; ++sampleNdx)
2238*35238bceSAndroid Build Coastguard Worker iterationOrder[sampleNdx] = (sampleNdx - midPoint) * 2 + 1;
2239*35238bceSAndroid Build Coastguard Worker
2240*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < midPoint; ++ndx)
2241*35238bceSAndroid Build Coastguard Worker std::swap(iterationOrder[ndx], iterationOrder[rnd.getInt(0, midPoint - 1)]);
2242*35238bceSAndroid Build Coastguard Worker for (int ndx = midPoint; ndx < (int)iterationOrder.size(); ++ndx)
2243*35238bceSAndroid Build Coastguard Worker std::swap(iterationOrder[ndx], iterationOrder[rnd.getInt(midPoint, (int)iterationOrder.size() - 1)]);
2244*35238bceSAndroid Build Coastguard Worker }
2245*35238bceSAndroid Build Coastguard Worker
2246*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
2247*35238bceSAndroid Build Coastguard Worker class BasicBufferCase : public TestCase
2248*35238bceSAndroid Build Coastguard Worker {
2249*35238bceSAndroid Build Coastguard Worker public:
2250*35238bceSAndroid Build Coastguard Worker enum Flags
2251*35238bceSAndroid Build Coastguard Worker {
2252*35238bceSAndroid Build Coastguard Worker FLAG_ALLOCATE_LARGER_BUFFER = 0x01,
2253*35238bceSAndroid Build Coastguard Worker };
2254*35238bceSAndroid Build Coastguard Worker BasicBufferCase(Context &context, const char *name, const char *desc, int bufferSizeMin, int bufferSizeMax,
2255*35238bceSAndroid Build Coastguard Worker int numSamples, int flags);
2256*35238bceSAndroid Build Coastguard Worker ~BasicBufferCase(void);
2257*35238bceSAndroid Build Coastguard Worker
2258*35238bceSAndroid Build Coastguard Worker virtual void init(void);
2259*35238bceSAndroid Build Coastguard Worker virtual void deinit(void);
2260*35238bceSAndroid Build Coastguard Worker
2261*35238bceSAndroid Build Coastguard Worker protected:
2262*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
2263*35238bceSAndroid Build Coastguard Worker
2264*35238bceSAndroid Build Coastguard Worker virtual bool runSample(int iteration, UploadSampleResult<SampleType> &sample) = 0;
2265*35238bceSAndroid Build Coastguard Worker virtual void logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> &results) = 0;
2266*35238bceSAndroid Build Coastguard Worker
2267*35238bceSAndroid Build Coastguard Worker void disableGLWarmup(void);
2268*35238bceSAndroid Build Coastguard Worker void waitGLResults(void);
2269*35238bceSAndroid Build Coastguard Worker
2270*35238bceSAndroid Build Coastguard Worker enum
2271*35238bceSAndroid Build Coastguard Worker {
2272*35238bceSAndroid Build Coastguard Worker UNUSED_RENDER_AREA_SIZE = 32
2273*35238bceSAndroid Build Coastguard Worker };
2274*35238bceSAndroid Build Coastguard Worker
2275*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_minimalProgram;
2276*35238bceSAndroid Build Coastguard Worker int32_t m_minimalProgramPosLoc;
2277*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferID;
2278*35238bceSAndroid Build Coastguard Worker
2279*35238bceSAndroid Build Coastguard Worker const int m_numSamples;
2280*35238bceSAndroid Build Coastguard Worker const int m_bufferSizeMin;
2281*35238bceSAndroid Build Coastguard Worker const int m_bufferSizeMax;
2282*35238bceSAndroid Build Coastguard Worker const bool m_allocateLargerBuffer;
2283*35238bceSAndroid Build Coastguard Worker
2284*35238bceSAndroid Build Coastguard Worker private:
2285*35238bceSAndroid Build Coastguard Worker int m_iteration;
2286*35238bceSAndroid Build Coastguard Worker std::vector<int> m_iterationOrder;
2287*35238bceSAndroid Build Coastguard Worker std::vector<UploadSampleResult<SampleType>> m_results;
2288*35238bceSAndroid Build Coastguard Worker
2289*35238bceSAndroid Build Coastguard Worker bool m_useGL;
2290*35238bceSAndroid Build Coastguard Worker int m_bufferRandomizerTimer;
2291*35238bceSAndroid Build Coastguard Worker };
2292*35238bceSAndroid Build Coastguard Worker
2293*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
BasicBufferCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,int numSamples,int flags)2294*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::BasicBufferCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
2295*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, int numSamples, int flags)
2296*35238bceSAndroid Build Coastguard Worker : TestCase(context, tcu::NODETYPE_PERFORMANCE, name, desc)
2297*35238bceSAndroid Build Coastguard Worker , m_minimalProgram(DE_NULL)
2298*35238bceSAndroid Build Coastguard Worker , m_minimalProgramPosLoc(-1)
2299*35238bceSAndroid Build Coastguard Worker , m_bufferID(0)
2300*35238bceSAndroid Build Coastguard Worker , m_numSamples(numSamples)
2301*35238bceSAndroid Build Coastguard Worker , m_bufferSizeMin(bufferSizeMin)
2302*35238bceSAndroid Build Coastguard Worker , m_bufferSizeMax(bufferSizeMax)
2303*35238bceSAndroid Build Coastguard Worker , m_allocateLargerBuffer((flags & FLAG_ALLOCATE_LARGER_BUFFER) != 0)
2304*35238bceSAndroid Build Coastguard Worker , m_iteration(0)
2305*35238bceSAndroid Build Coastguard Worker , m_iterationOrder(numSamples)
2306*35238bceSAndroid Build Coastguard Worker , m_results(numSamples)
2307*35238bceSAndroid Build Coastguard Worker , m_useGL(true)
2308*35238bceSAndroid Build Coastguard Worker , m_bufferRandomizerTimer(0)
2309*35238bceSAndroid Build Coastguard Worker {
2310*35238bceSAndroid Build Coastguard Worker // "randomize" iteration order. Deterministic, patternless
2311*35238bceSAndroid Build Coastguard Worker generateTwoPassRandomIterationOrder(m_iterationOrder, m_numSamples);
2312*35238bceSAndroid Build Coastguard Worker
2313*35238bceSAndroid Build Coastguard Worker // choose buffer sizes
2314*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < m_numSamples; ++sampleNdx)
2315*35238bceSAndroid Build Coastguard Worker {
2316*35238bceSAndroid Build Coastguard Worker const int rawBufferSize =
2317*35238bceSAndroid Build Coastguard Worker (int)deFloatFloor((float)bufferSizeMin +
2318*35238bceSAndroid Build Coastguard Worker (float)(bufferSizeMax - bufferSizeMin) * ((float)(sampleNdx + 1) / (float)m_numSamples));
2319*35238bceSAndroid Build Coastguard Worker const int bufferSize = deAlign32(rawBufferSize, 16);
2320*35238bceSAndroid Build Coastguard Worker const int allocatedBufferSize =
2321*35238bceSAndroid Build Coastguard Worker deAlign32((m_allocateLargerBuffer) ? ((int)((float)bufferSize * 1.5f)) : (bufferSize), 16);
2322*35238bceSAndroid Build Coastguard Worker
2323*35238bceSAndroid Build Coastguard Worker m_results[sampleNdx].bufferSize = bufferSize;
2324*35238bceSAndroid Build Coastguard Worker m_results[sampleNdx].allocatedSize = allocatedBufferSize;
2325*35238bceSAndroid Build Coastguard Worker m_results[sampleNdx].writtenSize = -1;
2326*35238bceSAndroid Build Coastguard Worker }
2327*35238bceSAndroid Build Coastguard Worker }
2328*35238bceSAndroid Build Coastguard Worker
2329*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
~BasicBufferCase(void)2330*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::~BasicBufferCase(void)
2331*35238bceSAndroid Build Coastguard Worker {
2332*35238bceSAndroid Build Coastguard Worker deinit();
2333*35238bceSAndroid Build Coastguard Worker }
2334*35238bceSAndroid Build Coastguard Worker
2335*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
init(void)2336*35238bceSAndroid Build Coastguard Worker void BasicBufferCase<SampleType>::init(void)
2337*35238bceSAndroid Build Coastguard Worker {
2338*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2339*35238bceSAndroid Build Coastguard Worker
2340*35238bceSAndroid Build Coastguard Worker if (!m_useGL)
2341*35238bceSAndroid Build Coastguard Worker return;
2342*35238bceSAndroid Build Coastguard Worker
2343*35238bceSAndroid Build Coastguard Worker // \note Viewport size is not checked, it won't matter if the render target actually is smaller than UNUSED_RENDER_AREA_SIZE
2344*35238bceSAndroid Build Coastguard Worker
2345*35238bceSAndroid Build Coastguard Worker // minimal shader
2346*35238bceSAndroid Build Coastguard Worker
2347*35238bceSAndroid Build Coastguard Worker m_minimalProgram = new glu::ShaderProgram(m_context.getRenderContext(),
2348*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::VertexSource(s_minimalVertexShader)
2349*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(s_minimalFragnentShader));
2350*35238bceSAndroid Build Coastguard Worker if (!m_minimalProgram->isOk())
2351*35238bceSAndroid Build Coastguard Worker {
2352*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_minimalProgram;
2353*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("failed to build shader program");
2354*35238bceSAndroid Build Coastguard Worker }
2355*35238bceSAndroid Build Coastguard Worker
2356*35238bceSAndroid Build Coastguard Worker m_minimalProgramPosLoc = gl.getAttribLocation(m_minimalProgram->getProgram(), "a_position");
2357*35238bceSAndroid Build Coastguard Worker if (m_minimalProgramPosLoc == -1)
2358*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("a_position location was -1");
2359*35238bceSAndroid Build Coastguard Worker }
2360*35238bceSAndroid Build Coastguard Worker
2361*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
deinit(void)2362*35238bceSAndroid Build Coastguard Worker void BasicBufferCase<SampleType>::deinit(void)
2363*35238bceSAndroid Build Coastguard Worker {
2364*35238bceSAndroid Build Coastguard Worker if (m_bufferID)
2365*35238bceSAndroid Build Coastguard Worker {
2366*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_bufferID);
2367*35238bceSAndroid Build Coastguard Worker m_bufferID = 0;
2368*35238bceSAndroid Build Coastguard Worker }
2369*35238bceSAndroid Build Coastguard Worker
2370*35238bceSAndroid Build Coastguard Worker delete m_minimalProgram;
2371*35238bceSAndroid Build Coastguard Worker m_minimalProgram = DE_NULL;
2372*35238bceSAndroid Build Coastguard Worker }
2373*35238bceSAndroid Build Coastguard Worker
2374*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
iterate(void)2375*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult BasicBufferCase<SampleType>::iterate(void)
2376*35238bceSAndroid Build Coastguard Worker {
2377*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2378*35238bceSAndroid Build Coastguard Worker static bool buffersWarmedUp = false;
2379*35238bceSAndroid Build Coastguard Worker
2380*35238bceSAndroid Build Coastguard Worker static const uint32_t usages[] = {
2381*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ,
2382*35238bceSAndroid Build Coastguard Worker GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY,
2383*35238bceSAndroid Build Coastguard Worker };
2384*35238bceSAndroid Build Coastguard Worker
2385*35238bceSAndroid Build Coastguard Worker // Allocate some random sized buffers and remove them to
2386*35238bceSAndroid Build Coastguard Worker // make sure the first samples too have some buffers removed
2387*35238bceSAndroid Build Coastguard Worker // just before their allocation. This is only needed by the
2388*35238bceSAndroid Build Coastguard Worker // the first test.
2389*35238bceSAndroid Build Coastguard Worker
2390*35238bceSAndroid Build Coastguard Worker if (m_useGL && !buffersWarmedUp)
2391*35238bceSAndroid Build Coastguard Worker {
2392*35238bceSAndroid Build Coastguard Worker const int numRandomBuffers = 6;
2393*35238bceSAndroid Build Coastguard Worker const int numRepeats = 10;
2394*35238bceSAndroid Build Coastguard Worker const int maxBufferSize = 16777216;
2395*35238bceSAndroid Build Coastguard Worker const std::vector<uint8_t> zeroData(maxBufferSize, 0x00);
2396*35238bceSAndroid Build Coastguard Worker de::Random rnd(0x1234);
2397*35238bceSAndroid Build Coastguard Worker uint32_t bufferIDs[numRandomBuffers] = {0};
2398*35238bceSAndroid Build Coastguard Worker
2399*35238bceSAndroid Build Coastguard Worker gl.useProgram(m_minimalProgram->getProgram());
2400*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, UNUSED_RENDER_AREA_SIZE, UNUSED_RENDER_AREA_SIZE);
2401*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_minimalProgramPosLoc);
2402*35238bceSAndroid Build Coastguard Worker
2403*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numRepeats; ++ndx)
2404*35238bceSAndroid Build Coastguard Worker {
2405*35238bceSAndroid Build Coastguard Worker // Create buffer and maybe draw from it
2406*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2407*35238bceSAndroid Build Coastguard Worker {
2408*35238bceSAndroid Build Coastguard Worker const int randomSize = deAlign32(rnd.getInt(1, maxBufferSize), 4 * 4);
2409*35238bceSAndroid Build Coastguard Worker const uint32_t usage = usages[rnd.getUint32() % (uint32_t)DE_LENGTH_OF_ARRAY(usages)];
2410*35238bceSAndroid Build Coastguard Worker
2411*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &bufferIDs[randomBufferNdx]);
2412*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, bufferIDs[randomBufferNdx]);
2413*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, randomSize, &zeroData[0], usage);
2414*35238bceSAndroid Build Coastguard Worker
2415*35238bceSAndroid Build Coastguard Worker if (rnd.getBool())
2416*35238bceSAndroid Build Coastguard Worker {
2417*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_minimalProgramPosLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
2418*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, 0, 1);
2419*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, randomSize / (int)sizeof(float[4]) - 1, 1);
2420*35238bceSAndroid Build Coastguard Worker }
2421*35238bceSAndroid Build Coastguard Worker }
2422*35238bceSAndroid Build Coastguard Worker
2423*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2424*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &bufferIDs[randomBufferNdx]);
2425*35238bceSAndroid Build Coastguard Worker
2426*35238bceSAndroid Build Coastguard Worker waitGLResults();
2427*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer gen");
2428*35238bceSAndroid Build Coastguard Worker
2429*35238bceSAndroid Build Coastguard Worker m_testCtx.touchWatchdog();
2430*35238bceSAndroid Build Coastguard Worker }
2431*35238bceSAndroid Build Coastguard Worker
2432*35238bceSAndroid Build Coastguard Worker buffersWarmedUp = true;
2433*35238bceSAndroid Build Coastguard Worker return CONTINUE;
2434*35238bceSAndroid Build Coastguard Worker }
2435*35238bceSAndroid Build Coastguard Worker else if (m_useGL && m_bufferRandomizerTimer++ % 8 == 0)
2436*35238bceSAndroid Build Coastguard Worker {
2437*35238bceSAndroid Build Coastguard Worker // Do some random buffer operations to every now and then
2438*35238bceSAndroid Build Coastguard Worker // to make sure the previous test iterations won't affect
2439*35238bceSAndroid Build Coastguard Worker // following test runs.
2440*35238bceSAndroid Build Coastguard Worker
2441*35238bceSAndroid Build Coastguard Worker const int numRandomBuffers = 3;
2442*35238bceSAndroid Build Coastguard Worker const int maxBufferSize = 16777216;
2443*35238bceSAndroid Build Coastguard Worker const std::vector<uint8_t> zeroData(maxBufferSize, 0x00);
2444*35238bceSAndroid Build Coastguard Worker de::Random rnd(0x1234 + 0xabc * m_bufferRandomizerTimer);
2445*35238bceSAndroid Build Coastguard Worker
2446*35238bceSAndroid Build Coastguard Worker // BufferData
2447*35238bceSAndroid Build Coastguard Worker {
2448*35238bceSAndroid Build Coastguard Worker uint32_t bufferIDs[numRandomBuffers] = {0};
2449*35238bceSAndroid Build Coastguard Worker
2450*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2451*35238bceSAndroid Build Coastguard Worker {
2452*35238bceSAndroid Build Coastguard Worker const int randomSize = deAlign32(rnd.getInt(1, maxBufferSize), 4 * 4);
2453*35238bceSAndroid Build Coastguard Worker const uint32_t usage = usages[rnd.getUint32() % (uint32_t)DE_LENGTH_OF_ARRAY(usages)];
2454*35238bceSAndroid Build Coastguard Worker
2455*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &bufferIDs[randomBufferNdx]);
2456*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, bufferIDs[randomBufferNdx]);
2457*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, randomSize, &zeroData[0], usage);
2458*35238bceSAndroid Build Coastguard Worker }
2459*35238bceSAndroid Build Coastguard Worker
2460*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2461*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &bufferIDs[randomBufferNdx]);
2462*35238bceSAndroid Build Coastguard Worker }
2463*35238bceSAndroid Build Coastguard Worker
2464*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "buffer ops");
2465*35238bceSAndroid Build Coastguard Worker
2466*35238bceSAndroid Build Coastguard Worker // Do some memory mappings
2467*35238bceSAndroid Build Coastguard Worker {
2468*35238bceSAndroid Build Coastguard Worker uint32_t bufferIDs[numRandomBuffers] = {0};
2469*35238bceSAndroid Build Coastguard Worker
2470*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2471*35238bceSAndroid Build Coastguard Worker {
2472*35238bceSAndroid Build Coastguard Worker const int randomSize = deAlign32(rnd.getInt(1, maxBufferSize), 4 * 4);
2473*35238bceSAndroid Build Coastguard Worker const uint32_t usage = usages[rnd.getUint32() % (uint32_t)DE_LENGTH_OF_ARRAY(usages)];
2474*35238bceSAndroid Build Coastguard Worker void *ptr;
2475*35238bceSAndroid Build Coastguard Worker
2476*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &bufferIDs[randomBufferNdx]);
2477*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, bufferIDs[randomBufferNdx]);
2478*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, randomSize, &zeroData[0], usage);
2479*35238bceSAndroid Build Coastguard Worker
2480*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_minimalProgramPosLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
2481*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, 0, 1);
2482*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, randomSize / (int)sizeof(float[4]) - 1, 1);
2483*35238bceSAndroid Build Coastguard Worker
2484*35238bceSAndroid Build Coastguard Worker if (rnd.getBool())
2485*35238bceSAndroid Build Coastguard Worker waitGLResults();
2486*35238bceSAndroid Build Coastguard Worker
2487*35238bceSAndroid Build Coastguard Worker ptr = gl.mapBufferRange(GL_ARRAY_BUFFER, 0, randomSize, GL_MAP_WRITE_BIT);
2488*35238bceSAndroid Build Coastguard Worker if (ptr)
2489*35238bceSAndroid Build Coastguard Worker {
2490*35238bceSAndroid Build Coastguard Worker medianTimeMemcpy(ptr, &zeroData[0], randomSize);
2491*35238bceSAndroid Build Coastguard Worker gl.unmapBuffer(GL_ARRAY_BUFFER);
2492*35238bceSAndroid Build Coastguard Worker }
2493*35238bceSAndroid Build Coastguard Worker }
2494*35238bceSAndroid Build Coastguard Worker
2495*35238bceSAndroid Build Coastguard Worker for (int randomBufferNdx = 0; randomBufferNdx < numRandomBuffers; ++randomBufferNdx)
2496*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &bufferIDs[randomBufferNdx]);
2497*35238bceSAndroid Build Coastguard Worker
2498*35238bceSAndroid Build Coastguard Worker waitGLResults();
2499*35238bceSAndroid Build Coastguard Worker }
2500*35238bceSAndroid Build Coastguard Worker
2501*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "buffer maps");
2502*35238bceSAndroid Build Coastguard Worker return CONTINUE;
2503*35238bceSAndroid Build Coastguard Worker }
2504*35238bceSAndroid Build Coastguard Worker else
2505*35238bceSAndroid Build Coastguard Worker {
2506*35238bceSAndroid Build Coastguard Worker const int currentIteration = m_iteration;
2507*35238bceSAndroid Build Coastguard Worker const int sampleNdx = m_iterationOrder[currentIteration];
2508*35238bceSAndroid Build Coastguard Worker const bool sampleRunSuccessful = runSample(currentIteration, m_results[sampleNdx]);
2509*35238bceSAndroid Build Coastguard Worker
2510*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "post runSample()");
2511*35238bceSAndroid Build Coastguard Worker
2512*35238bceSAndroid Build Coastguard Worker // Retry failed samples
2513*35238bceSAndroid Build Coastguard Worker if (!sampleRunSuccessful)
2514*35238bceSAndroid Build Coastguard Worker return CONTINUE;
2515*35238bceSAndroid Build Coastguard Worker
2516*35238bceSAndroid Build Coastguard Worker if (++m_iteration >= m_numSamples)
2517*35238bceSAndroid Build Coastguard Worker {
2518*35238bceSAndroid Build Coastguard Worker logAndSetTestResult(m_results);
2519*35238bceSAndroid Build Coastguard Worker return STOP;
2520*35238bceSAndroid Build Coastguard Worker }
2521*35238bceSAndroid Build Coastguard Worker else
2522*35238bceSAndroid Build Coastguard Worker return CONTINUE;
2523*35238bceSAndroid Build Coastguard Worker }
2524*35238bceSAndroid Build Coastguard Worker }
2525*35238bceSAndroid Build Coastguard Worker
2526*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
disableGLWarmup(void)2527*35238bceSAndroid Build Coastguard Worker void BasicBufferCase<SampleType>::disableGLWarmup(void)
2528*35238bceSAndroid Build Coastguard Worker {
2529*35238bceSAndroid Build Coastguard Worker m_useGL = false;
2530*35238bceSAndroid Build Coastguard Worker }
2531*35238bceSAndroid Build Coastguard Worker
2532*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
waitGLResults(void)2533*35238bceSAndroid Build Coastguard Worker void BasicBufferCase<SampleType>::waitGLResults(void)
2534*35238bceSAndroid Build Coastguard Worker {
2535*35238bceSAndroid Build Coastguard Worker tcu::Surface unusedSurface(UNUSED_RENDER_AREA_SIZE, UNUSED_RENDER_AREA_SIZE);
2536*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, unusedSurface.getAccess());
2537*35238bceSAndroid Build Coastguard Worker }
2538*35238bceSAndroid Build Coastguard Worker
2539*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
2540*35238bceSAndroid Build Coastguard Worker class BasicUploadCase : public BasicBufferCase<SampleType>
2541*35238bceSAndroid Build Coastguard Worker {
2542*35238bceSAndroid Build Coastguard Worker public:
2543*35238bceSAndroid Build Coastguard Worker enum CaseType
2544*35238bceSAndroid Build Coastguard Worker {
2545*35238bceSAndroid Build Coastguard Worker CASE_NO_BUFFERS = 0,
2546*35238bceSAndroid Build Coastguard Worker CASE_NEW_BUFFER,
2547*35238bceSAndroid Build Coastguard Worker CASE_UNSPECIFIED_BUFFER,
2548*35238bceSAndroid Build Coastguard Worker CASE_SPECIFIED_BUFFER,
2549*35238bceSAndroid Build Coastguard Worker CASE_USED_BUFFER,
2550*35238bceSAndroid Build Coastguard Worker CASE_USED_LARGER_BUFFER,
2551*35238bceSAndroid Build Coastguard Worker
2552*35238bceSAndroid Build Coastguard Worker CASE_LAST
2553*35238bceSAndroid Build Coastguard Worker };
2554*35238bceSAndroid Build Coastguard Worker
2555*35238bceSAndroid Build Coastguard Worker enum CaseFlags
2556*35238bceSAndroid Build Coastguard Worker {
2557*35238bceSAndroid Build Coastguard Worker FLAG_DONT_LOG_BUFFER_INFO = 0x01,
2558*35238bceSAndroid Build Coastguard Worker FLAG_RESULT_BUFFER_UNSPECIFIED_CONTENT = 0x02,
2559*35238bceSAndroid Build Coastguard Worker };
2560*35238bceSAndroid Build Coastguard Worker
2561*35238bceSAndroid Build Coastguard Worker enum ResultType
2562*35238bceSAndroid Build Coastguard Worker {
2563*35238bceSAndroid Build Coastguard Worker RESULT_MEDIAN_TRANSFER_RATE = 0,
2564*35238bceSAndroid Build Coastguard Worker RESULT_ASYMPTOTIC_TRANSFER_RATE,
2565*35238bceSAndroid Build Coastguard Worker };
2566*35238bceSAndroid Build Coastguard Worker
2567*35238bceSAndroid Build Coastguard Worker BasicUploadCase(Context &context, const char *name, const char *desc, int bufferSizeMin, int bufferSizeMax,
2568*35238bceSAndroid Build Coastguard Worker int numSamples, uint32_t bufferUsage, CaseType caseType, ResultType resultType, int flags = 0);
2569*35238bceSAndroid Build Coastguard Worker
2570*35238bceSAndroid Build Coastguard Worker ~BasicUploadCase(void);
2571*35238bceSAndroid Build Coastguard Worker
2572*35238bceSAndroid Build Coastguard Worker virtual void init(void);
2573*35238bceSAndroid Build Coastguard Worker virtual void deinit(void);
2574*35238bceSAndroid Build Coastguard Worker
2575*35238bceSAndroid Build Coastguard Worker private:
2576*35238bceSAndroid Build Coastguard Worker bool runSample(int iteration, UploadSampleResult<SampleType> &sample);
2577*35238bceSAndroid Build Coastguard Worker void createBuffer(int bufferSize, int iteration);
2578*35238bceSAndroid Build Coastguard Worker void deleteBuffer(int bufferSize);
2579*35238bceSAndroid Build Coastguard Worker void useBuffer(int bufferSize);
2580*35238bceSAndroid Build Coastguard Worker
2581*35238bceSAndroid Build Coastguard Worker virtual void testBufferUpload(UploadSampleResult<SampleType> &result, int writeSize) = 0;
2582*35238bceSAndroid Build Coastguard Worker void logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> &results);
2583*35238bceSAndroid Build Coastguard Worker
2584*35238bceSAndroid Build Coastguard Worker uint32_t m_unusedBufferID;
2585*35238bceSAndroid Build Coastguard Worker
2586*35238bceSAndroid Build Coastguard Worker protected:
2587*35238bceSAndroid Build Coastguard Worker const CaseType m_caseType;
2588*35238bceSAndroid Build Coastguard Worker const ResultType m_resultType;
2589*35238bceSAndroid Build Coastguard Worker const uint32_t m_bufferUsage;
2590*35238bceSAndroid Build Coastguard Worker const bool m_logBufferInfo;
2591*35238bceSAndroid Build Coastguard Worker const bool m_bufferUnspecifiedContent;
2592*35238bceSAndroid Build Coastguard Worker std::vector<uint8_t> m_zeroData;
2593*35238bceSAndroid Build Coastguard Worker
2594*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_testCtx;
2595*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_context;
2596*35238bceSAndroid Build Coastguard Worker
2597*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::UNUSED_RENDER_AREA_SIZE;
2598*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_minimalProgram;
2599*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_minimalProgramPosLoc;
2600*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferID;
2601*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_numSamples;
2602*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferSizeMin;
2603*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferSizeMax;
2604*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_allocateLargerBuffer;
2605*35238bceSAndroid Build Coastguard Worker };
2606*35238bceSAndroid Build Coastguard Worker
2607*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
BasicUploadCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,int numSamples,uint32_t bufferUsage,CaseType caseType,ResultType resultType,int flags)2608*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SampleType>::BasicUploadCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
2609*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, int numSamples, uint32_t bufferUsage, CaseType caseType,
2610*35238bceSAndroid Build Coastguard Worker ResultType resultType, int flags)
2611*35238bceSAndroid Build Coastguard Worker : BasicBufferCase<SampleType>(
2612*35238bceSAndroid Build Coastguard Worker context, name, desc, bufferSizeMin, bufferSizeMax, numSamples,
2613*35238bceSAndroid Build Coastguard Worker (caseType == CASE_USED_LARGER_BUFFER) ? (BasicBufferCase<SampleType>::FLAG_ALLOCATE_LARGER_BUFFER) : (0))
2614*35238bceSAndroid Build Coastguard Worker , m_unusedBufferID(0)
2615*35238bceSAndroid Build Coastguard Worker , m_caseType(caseType)
2616*35238bceSAndroid Build Coastguard Worker , m_resultType(resultType)
2617*35238bceSAndroid Build Coastguard Worker , m_bufferUsage(bufferUsage)
2618*35238bceSAndroid Build Coastguard Worker , m_logBufferInfo((flags & FLAG_DONT_LOG_BUFFER_INFO) == 0)
2619*35238bceSAndroid Build Coastguard Worker , m_bufferUnspecifiedContent((flags & FLAG_RESULT_BUFFER_UNSPECIFIED_CONTENT) != 0)
2620*35238bceSAndroid Build Coastguard Worker , m_zeroData()
2621*35238bceSAndroid Build Coastguard Worker {
2622*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_caseType < CASE_LAST);
2623*35238bceSAndroid Build Coastguard Worker }
2624*35238bceSAndroid Build Coastguard Worker
2625*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
~BasicUploadCase(void)2626*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SampleType>::~BasicUploadCase(void)
2627*35238bceSAndroid Build Coastguard Worker {
2628*35238bceSAndroid Build Coastguard Worker deinit();
2629*35238bceSAndroid Build Coastguard Worker }
2630*35238bceSAndroid Build Coastguard Worker
2631*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
init(void)2632*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::init(void)
2633*35238bceSAndroid Build Coastguard Worker {
2634*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2635*35238bceSAndroid Build Coastguard Worker
2636*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::init();
2637*35238bceSAndroid Build Coastguard Worker
2638*35238bceSAndroid Build Coastguard Worker // zero buffer as upload source
2639*35238bceSAndroid Build Coastguard Worker m_zeroData.resize(m_bufferSizeMax, 0x00);
2640*35238bceSAndroid Build Coastguard Worker
2641*35238bceSAndroid Build Coastguard Worker // unused buffer
2642*35238bceSAndroid Build Coastguard Worker
2643*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_unusedBufferID);
2644*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Gen buf");
2645*35238bceSAndroid Build Coastguard Worker
2646*35238bceSAndroid Build Coastguard Worker // log basic info
2647*35238bceSAndroid Build Coastguard Worker
2648*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing performance with " << m_numSamples
2649*35238bceSAndroid Build Coastguard Worker << " test samples. Sample order is randomized. All samples at even positions (first = 0) are "
2650*35238bceSAndroid Build Coastguard Worker "tested before samples at odd positions.\n"
2651*35238bceSAndroid Build Coastguard Worker << "Buffer sizes are in range [" << getHumanReadableByteSize(m_bufferSizeMin) << ", "
2652*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(m_bufferSizeMax) << "]." << tcu::TestLog::EndMessage;
2653*35238bceSAndroid Build Coastguard Worker
2654*35238bceSAndroid Build Coastguard Worker if (m_logBufferInfo)
2655*35238bceSAndroid Build Coastguard Worker {
2656*35238bceSAndroid Build Coastguard Worker switch (m_caseType)
2657*35238bceSAndroid Build Coastguard Worker {
2658*35238bceSAndroid Build Coastguard Worker case CASE_NO_BUFFERS:
2659*35238bceSAndroid Build Coastguard Worker break;
2660*35238bceSAndroid Build Coastguard Worker
2661*35238bceSAndroid Build Coastguard Worker case CASE_NEW_BUFFER:
2662*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
2663*35238bceSAndroid Build Coastguard Worker << "Target buffer is generated but not specified (i.e glBufferData() not called)."
2664*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2665*35238bceSAndroid Build Coastguard Worker break;
2666*35238bceSAndroid Build Coastguard Worker
2667*35238bceSAndroid Build Coastguard Worker case CASE_UNSPECIFIED_BUFFER:
2668*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Target buffer is allocated with glBufferData(NULL)."
2669*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2670*35238bceSAndroid Build Coastguard Worker break;
2671*35238bceSAndroid Build Coastguard Worker
2672*35238bceSAndroid Build Coastguard Worker case CASE_SPECIFIED_BUFFER:
2673*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
2674*35238bceSAndroid Build Coastguard Worker << "Target buffer contents are specified prior testing with glBufferData(data)."
2675*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2676*35238bceSAndroid Build Coastguard Worker break;
2677*35238bceSAndroid Build Coastguard Worker
2678*35238bceSAndroid Build Coastguard Worker case CASE_USED_BUFFER:
2679*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Target buffer has been used in drawing before testing."
2680*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2681*35238bceSAndroid Build Coastguard Worker break;
2682*35238bceSAndroid Build Coastguard Worker
2683*35238bceSAndroid Build Coastguard Worker case CASE_USED_LARGER_BUFFER:
2684*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
2685*35238bceSAndroid Build Coastguard Worker << "Target buffer is larger and has been used in drawing before testing."
2686*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2687*35238bceSAndroid Build Coastguard Worker break;
2688*35238bceSAndroid Build Coastguard Worker
2689*35238bceSAndroid Build Coastguard Worker default:
2690*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
2691*35238bceSAndroid Build Coastguard Worker break;
2692*35238bceSAndroid Build Coastguard Worker }
2693*35238bceSAndroid Build Coastguard Worker }
2694*35238bceSAndroid Build Coastguard Worker
2695*35238bceSAndroid Build Coastguard Worker if (m_resultType == RESULT_MEDIAN_TRANSFER_RATE)
2696*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Test result is the median transfer rate of the test samples."
2697*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2698*35238bceSAndroid Build Coastguard Worker else if (m_resultType == RESULT_ASYMPTOTIC_TRANSFER_RATE)
2699*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
2700*35238bceSAndroid Build Coastguard Worker << "Test result is the asymptotic transfer rate as the buffer size approaches infinity."
2701*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
2702*35238bceSAndroid Build Coastguard Worker else
2703*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
2704*35238bceSAndroid Build Coastguard Worker }
2705*35238bceSAndroid Build Coastguard Worker
2706*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
deinit(void)2707*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::deinit(void)
2708*35238bceSAndroid Build Coastguard Worker {
2709*35238bceSAndroid Build Coastguard Worker if (m_unusedBufferID)
2710*35238bceSAndroid Build Coastguard Worker {
2711*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_unusedBufferID);
2712*35238bceSAndroid Build Coastguard Worker m_unusedBufferID = 0;
2713*35238bceSAndroid Build Coastguard Worker }
2714*35238bceSAndroid Build Coastguard Worker
2715*35238bceSAndroid Build Coastguard Worker m_zeroData = std::vector<uint8_t>();
2716*35238bceSAndroid Build Coastguard Worker
2717*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::deinit();
2718*35238bceSAndroid Build Coastguard Worker }
2719*35238bceSAndroid Build Coastguard Worker
2720*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
runSample(int iteration,UploadSampleResult<SampleType> & sample)2721*35238bceSAndroid Build Coastguard Worker bool BasicUploadCase<SampleType>::runSample(int iteration, UploadSampleResult<SampleType> &sample)
2722*35238bceSAndroid Build Coastguard Worker {
2723*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2724*35238bceSAndroid Build Coastguard Worker const int allocatedBufferSize = sample.allocatedSize;
2725*35238bceSAndroid Build Coastguard Worker const int bufferSize = sample.bufferSize;
2726*35238bceSAndroid Build Coastguard Worker
2727*35238bceSAndroid Build Coastguard Worker if (m_caseType != CASE_NO_BUFFERS)
2728*35238bceSAndroid Build Coastguard Worker createBuffer(iteration, allocatedBufferSize);
2729*35238bceSAndroid Build Coastguard Worker
2730*35238bceSAndroid Build Coastguard Worker // warmup CPU before the test to make sure the power management governor
2731*35238bceSAndroid Build Coastguard Worker // keeps us in the "high performance" mode
2732*35238bceSAndroid Build Coastguard Worker {
2733*35238bceSAndroid Build Coastguard Worker deYield();
2734*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
2735*35238bceSAndroid Build Coastguard Worker deYield();
2736*35238bceSAndroid Build Coastguard Worker }
2737*35238bceSAndroid Build Coastguard Worker
2738*35238bceSAndroid Build Coastguard Worker testBufferUpload(sample, bufferSize);
2739*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer upload sample");
2740*35238bceSAndroid Build Coastguard Worker
2741*35238bceSAndroid Build Coastguard Worker if (m_caseType != CASE_NO_BUFFERS)
2742*35238bceSAndroid Build Coastguard Worker deleteBuffer(bufferSize);
2743*35238bceSAndroid Build Coastguard Worker
2744*35238bceSAndroid Build Coastguard Worker return true;
2745*35238bceSAndroid Build Coastguard Worker }
2746*35238bceSAndroid Build Coastguard Worker
2747*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
createBuffer(int iteration,int bufferSize)2748*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::createBuffer(int iteration, int bufferSize)
2749*35238bceSAndroid Build Coastguard Worker {
2750*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_bufferID);
2751*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_caseType != CASE_NO_BUFFERS);
2752*35238bceSAndroid Build Coastguard Worker
2753*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2754*35238bceSAndroid Build Coastguard Worker
2755*35238bceSAndroid Build Coastguard Worker // create buffer
2756*35238bceSAndroid Build Coastguard Worker
2757*35238bceSAndroid Build Coastguard Worker if (m_caseType == CASE_NO_BUFFERS)
2758*35238bceSAndroid Build Coastguard Worker return;
2759*35238bceSAndroid Build Coastguard Worker
2760*35238bceSAndroid Build Coastguard Worker // create empty buffer
2761*35238bceSAndroid Build Coastguard Worker
2762*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_bufferID);
2763*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
2764*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer gen");
2765*35238bceSAndroid Build Coastguard Worker
2766*35238bceSAndroid Build Coastguard Worker if (m_caseType == CASE_NEW_BUFFER)
2767*35238bceSAndroid Build Coastguard Worker {
2768*35238bceSAndroid Build Coastguard Worker // upload something else first, this should reduce noise in samples
2769*35238bceSAndroid Build Coastguard Worker
2770*35238bceSAndroid Build Coastguard Worker de::Random rng(0xbadc * iteration);
2771*35238bceSAndroid Build Coastguard Worker const int sizeDelta = rng.getInt(0, 2097140);
2772*35238bceSAndroid Build Coastguard Worker const int unusedUploadSize =
2773*35238bceSAndroid Build Coastguard Worker deAlign32(1048576 + sizeDelta, 4 * 4); // Vary buffer size to make sure it is always reallocated
2774*35238bceSAndroid Build Coastguard Worker const std::vector<uint8_t> unusedData(unusedUploadSize, 0x20);
2775*35238bceSAndroid Build Coastguard Worker
2776*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_unusedBufferID);
2777*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, unusedUploadSize, &unusedData[0], m_bufferUsage);
2778*35238bceSAndroid Build Coastguard Worker
2779*35238bceSAndroid Build Coastguard Worker // make sure upload won't interfere with the test
2780*35238bceSAndroid Build Coastguard Worker useBuffer(unusedUploadSize);
2781*35238bceSAndroid Build Coastguard Worker
2782*35238bceSAndroid Build Coastguard Worker // don't kill the buffer so that the following upload cannot potentially reuse the buffer
2783*35238bceSAndroid Build Coastguard Worker
2784*35238bceSAndroid Build Coastguard Worker return;
2785*35238bceSAndroid Build Coastguard Worker }
2786*35238bceSAndroid Build Coastguard Worker
2787*35238bceSAndroid Build Coastguard Worker // specify it
2788*35238bceSAndroid Build Coastguard Worker
2789*35238bceSAndroid Build Coastguard Worker if (m_caseType == CASE_UNSPECIFIED_BUFFER)
2790*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, DE_NULL, m_bufferUsage);
2791*35238bceSAndroid Build Coastguard Worker else
2792*35238bceSAndroid Build Coastguard Worker {
2793*35238bceSAndroid Build Coastguard Worker const std::vector<uint8_t> unusedData(bufferSize, 0x20);
2794*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &unusedData[0], m_bufferUsage);
2795*35238bceSAndroid Build Coastguard Worker }
2796*35238bceSAndroid Build Coastguard Worker
2797*35238bceSAndroid Build Coastguard Worker if (m_caseType == CASE_UNSPECIFIED_BUFFER || m_caseType == CASE_SPECIFIED_BUFFER)
2798*35238bceSAndroid Build Coastguard Worker return;
2799*35238bceSAndroid Build Coastguard Worker
2800*35238bceSAndroid Build Coastguard Worker // use it and make sure it is uploaded
2801*35238bceSAndroid Build Coastguard Worker
2802*35238bceSAndroid Build Coastguard Worker useBuffer(bufferSize);
2803*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_caseType == CASE_USED_BUFFER || m_caseType == CASE_USED_LARGER_BUFFER);
2804*35238bceSAndroid Build Coastguard Worker }
2805*35238bceSAndroid Build Coastguard Worker
2806*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
deleteBuffer(int bufferSize)2807*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::deleteBuffer(int bufferSize)
2808*35238bceSAndroid Build Coastguard Worker {
2809*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_bufferID);
2810*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_caseType != CASE_NO_BUFFERS);
2811*35238bceSAndroid Build Coastguard Worker
2812*35238bceSAndroid Build Coastguard Worker // render from the buffer to make sure it actually made it to the gpu. This is to
2813*35238bceSAndroid Build Coastguard Worker // make sure that if the upload actually happens later or is happening right now in
2814*35238bceSAndroid Build Coastguard Worker // the background, it will not interfere with further test runs
2815*35238bceSAndroid Build Coastguard Worker
2816*35238bceSAndroid Build Coastguard Worker // if buffer contains unspecified content, sourcing data from it results in undefined
2817*35238bceSAndroid Build Coastguard Worker // results, possibly including program termination. Specify all data to prevent such
2818*35238bceSAndroid Build Coastguard Worker // case from happening
2819*35238bceSAndroid Build Coastguard Worker
2820*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2821*35238bceSAndroid Build Coastguard Worker
2822*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
2823*35238bceSAndroid Build Coastguard Worker
2824*35238bceSAndroid Build Coastguard Worker if (m_bufferUnspecifiedContent)
2825*35238bceSAndroid Build Coastguard Worker {
2826*35238bceSAndroid Build Coastguard Worker const std::vector<uint8_t> unusedData(bufferSize, 0x20);
2827*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &unusedData[0], m_bufferUsage);
2828*35238bceSAndroid Build Coastguard Worker
2829*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "re-specify buffer");
2830*35238bceSAndroid Build Coastguard Worker }
2831*35238bceSAndroid Build Coastguard Worker
2832*35238bceSAndroid Build Coastguard Worker useBuffer(bufferSize);
2833*35238bceSAndroid Build Coastguard Worker
2834*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &m_bufferID);
2835*35238bceSAndroid Build Coastguard Worker m_bufferID = 0;
2836*35238bceSAndroid Build Coastguard Worker }
2837*35238bceSAndroid Build Coastguard Worker
2838*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
useBuffer(int bufferSize)2839*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::useBuffer(int bufferSize)
2840*35238bceSAndroid Build Coastguard Worker {
2841*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2842*35238bceSAndroid Build Coastguard Worker
2843*35238bceSAndroid Build Coastguard Worker gl.useProgram(m_minimalProgram->getProgram());
2844*35238bceSAndroid Build Coastguard Worker
2845*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, UNUSED_RENDER_AREA_SIZE, UNUSED_RENDER_AREA_SIZE);
2846*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_minimalProgramPosLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
2847*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_minimalProgramPosLoc);
2848*35238bceSAndroid Build Coastguard Worker
2849*35238bceSAndroid Build Coastguard Worker // use whole buffer to make sure buffer is uploaded by drawing first and last
2850*35238bceSAndroid Build Coastguard Worker DE_ASSERT(bufferSize % (int)sizeof(float[4]) == 0);
2851*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, 0, 1);
2852*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, bufferSize / (int)sizeof(float[4]) - 1, 1);
2853*35238bceSAndroid Build Coastguard Worker
2854*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::waitGLResults();
2855*35238bceSAndroid Build Coastguard Worker }
2856*35238bceSAndroid Build Coastguard Worker
2857*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> & results)2858*35238bceSAndroid Build Coastguard Worker void BasicUploadCase<SampleType>::logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> &results)
2859*35238bceSAndroid Build Coastguard Worker {
2860*35238bceSAndroid Build Coastguard Worker const UploadSampleAnalyzeResult analysis = analyzeSampleResults(m_testCtx.getLog(), results, true);
2861*35238bceSAndroid Build Coastguard Worker
2862*35238bceSAndroid Build Coastguard Worker // with small buffers, report the median transfer rate of the samples
2863*35238bceSAndroid Build Coastguard Worker // with large buffers, report the expected preformance of infinitely large buffers
2864*35238bceSAndroid Build Coastguard Worker const float rate = (m_resultType == RESULT_ASYMPTOTIC_TRANSFER_RATE) ? (analysis.transferRateAtInfinity) :
2865*35238bceSAndroid Build Coastguard Worker (analysis.transferRateMedian);
2866*35238bceSAndroid Build Coastguard Worker
2867*35238bceSAndroid Build Coastguard Worker if (rate == std::numeric_limits<float>::infinity())
2868*35238bceSAndroid Build Coastguard Worker {
2869*35238bceSAndroid Build Coastguard Worker // sample times are 1) invalid or 2) timer resolution too low
2870*35238bceSAndroid Build Coastguard Worker // report speed 0 bytes / s since real value cannot be determined
2871*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(0.0f, 2).c_str());
2872*35238bceSAndroid Build Coastguard Worker }
2873*35238bceSAndroid Build Coastguard Worker else
2874*35238bceSAndroid Build Coastguard Worker {
2875*35238bceSAndroid Build Coastguard Worker // report transfer rate in MB / s
2876*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(rate / 1024.0f / 1024.0f, 2).c_str());
2877*35238bceSAndroid Build Coastguard Worker }
2878*35238bceSAndroid Build Coastguard Worker }
2879*35238bceSAndroid Build Coastguard Worker
2880*35238bceSAndroid Build Coastguard Worker class ReferenceMemcpyCase : public BasicUploadCase<SingleOperationDuration>
2881*35238bceSAndroid Build Coastguard Worker {
2882*35238bceSAndroid Build Coastguard Worker public:
2883*35238bceSAndroid Build Coastguard Worker ReferenceMemcpyCase(Context &ctx, const char *name, const char *desc, int minBufferSize, int maxBufferSize,
2884*35238bceSAndroid Build Coastguard Worker int numSamples, bool largeBuffersCase);
2885*35238bceSAndroid Build Coastguard Worker ~ReferenceMemcpyCase(void);
2886*35238bceSAndroid Build Coastguard Worker
2887*35238bceSAndroid Build Coastguard Worker void init(void);
2888*35238bceSAndroid Build Coastguard Worker void deinit(void);
2889*35238bceSAndroid Build Coastguard Worker
2890*35238bceSAndroid Build Coastguard Worker private:
2891*35238bceSAndroid Build Coastguard Worker void testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize);
2892*35238bceSAndroid Build Coastguard Worker
2893*35238bceSAndroid Build Coastguard Worker std::vector<uint8_t> m_dstBuf;
2894*35238bceSAndroid Build Coastguard Worker };
2895*35238bceSAndroid Build Coastguard Worker
ReferenceMemcpyCase(Context & ctx,const char * name,const char * desc,int minBufferSize,int maxBufferSize,int numSamples,bool largeBuffersCase)2896*35238bceSAndroid Build Coastguard Worker ReferenceMemcpyCase::ReferenceMemcpyCase(Context &ctx, const char *name, const char *desc, int minBufferSize,
2897*35238bceSAndroid Build Coastguard Worker int maxBufferSize, int numSamples, bool largeBuffersCase)
2898*35238bceSAndroid Build Coastguard Worker : BasicUploadCase<SingleOperationDuration>(
2899*35238bceSAndroid Build Coastguard Worker ctx, name, desc, minBufferSize, maxBufferSize, numSamples, 0, CASE_NO_BUFFERS,
2900*35238bceSAndroid Build Coastguard Worker (largeBuffersCase) ? (RESULT_ASYMPTOTIC_TRANSFER_RATE) : (RESULT_MEDIAN_TRANSFER_RATE))
2901*35238bceSAndroid Build Coastguard Worker , m_dstBuf()
2902*35238bceSAndroid Build Coastguard Worker {
2903*35238bceSAndroid Build Coastguard Worker disableGLWarmup();
2904*35238bceSAndroid Build Coastguard Worker }
2905*35238bceSAndroid Build Coastguard Worker
~ReferenceMemcpyCase(void)2906*35238bceSAndroid Build Coastguard Worker ReferenceMemcpyCase::~ReferenceMemcpyCase(void)
2907*35238bceSAndroid Build Coastguard Worker {
2908*35238bceSAndroid Build Coastguard Worker }
2909*35238bceSAndroid Build Coastguard Worker
init(void)2910*35238bceSAndroid Build Coastguard Worker void ReferenceMemcpyCase::init(void)
2911*35238bceSAndroid Build Coastguard Worker {
2912*35238bceSAndroid Build Coastguard Worker // Describe what the test tries to do
2913*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing performance of memcpy()." << tcu::TestLog::EndMessage;
2914*35238bceSAndroid Build Coastguard Worker
2915*35238bceSAndroid Build Coastguard Worker m_dstBuf.resize(m_bufferSizeMax, 0x00);
2916*35238bceSAndroid Build Coastguard Worker
2917*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SingleOperationDuration>::init();
2918*35238bceSAndroid Build Coastguard Worker }
2919*35238bceSAndroid Build Coastguard Worker
deinit(void)2920*35238bceSAndroid Build Coastguard Worker void ReferenceMemcpyCase::deinit(void)
2921*35238bceSAndroid Build Coastguard Worker {
2922*35238bceSAndroid Build Coastguard Worker m_dstBuf = std::vector<uint8_t>();
2923*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SingleOperationDuration>::deinit();
2924*35238bceSAndroid Build Coastguard Worker }
2925*35238bceSAndroid Build Coastguard Worker
testBufferUpload(UploadSampleResult<SingleOperationDuration> & result,int bufferSize)2926*35238bceSAndroid Build Coastguard Worker void ReferenceMemcpyCase::testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize)
2927*35238bceSAndroid Build Coastguard Worker {
2928*35238bceSAndroid Build Coastguard Worker // write
2929*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = medianTimeMemcpy(&m_dstBuf[0], &m_zeroData[0], bufferSize);
2930*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
2931*35238bceSAndroid Build Coastguard Worker
2932*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize;
2933*35238bceSAndroid Build Coastguard Worker }
2934*35238bceSAndroid Build Coastguard Worker
2935*35238bceSAndroid Build Coastguard Worker class BufferDataUploadCase : public BasicUploadCase<SingleOperationDuration>
2936*35238bceSAndroid Build Coastguard Worker {
2937*35238bceSAndroid Build Coastguard Worker public:
2938*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase(Context &ctx, const char *name, const char *desc, int minBufferSize, int maxBufferSize,
2939*35238bceSAndroid Build Coastguard Worker int numSamples, uint32_t bufferUsage, CaseType caseType);
2940*35238bceSAndroid Build Coastguard Worker ~BufferDataUploadCase(void);
2941*35238bceSAndroid Build Coastguard Worker
2942*35238bceSAndroid Build Coastguard Worker void init(void);
2943*35238bceSAndroid Build Coastguard Worker
2944*35238bceSAndroid Build Coastguard Worker private:
2945*35238bceSAndroid Build Coastguard Worker void testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize);
2946*35238bceSAndroid Build Coastguard Worker };
2947*35238bceSAndroid Build Coastguard Worker
BufferDataUploadCase(Context & ctx,const char * name,const char * desc,int minBufferSize,int maxBufferSize,int numSamples,uint32_t bufferUsage,CaseType caseType)2948*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::BufferDataUploadCase(Context &ctx, const char *name, const char *desc, int minBufferSize,
2949*35238bceSAndroid Build Coastguard Worker int maxBufferSize, int numSamples, uint32_t bufferUsage, CaseType caseType)
2950*35238bceSAndroid Build Coastguard Worker : BasicUploadCase<SingleOperationDuration>(ctx, name, desc, minBufferSize, maxBufferSize, numSamples, bufferUsage,
2951*35238bceSAndroid Build Coastguard Worker caseType, RESULT_MEDIAN_TRANSFER_RATE)
2952*35238bceSAndroid Build Coastguard Worker {
2953*35238bceSAndroid Build Coastguard Worker }
2954*35238bceSAndroid Build Coastguard Worker
~BufferDataUploadCase(void)2955*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::~BufferDataUploadCase(void)
2956*35238bceSAndroid Build Coastguard Worker {
2957*35238bceSAndroid Build Coastguard Worker }
2958*35238bceSAndroid Build Coastguard Worker
init(void)2959*35238bceSAndroid Build Coastguard Worker void BufferDataUploadCase::init(void)
2960*35238bceSAndroid Build Coastguard Worker {
2961*35238bceSAndroid Build Coastguard Worker // Describe what the test tries to do
2962*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing glBufferData() function." << tcu::TestLog::EndMessage;
2963*35238bceSAndroid Build Coastguard Worker
2964*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SingleOperationDuration>::init();
2965*35238bceSAndroid Build Coastguard Worker }
2966*35238bceSAndroid Build Coastguard Worker
testBufferUpload(UploadSampleResult<SingleOperationDuration> & result,int bufferSize)2967*35238bceSAndroid Build Coastguard Worker void BufferDataUploadCase::testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize)
2968*35238bceSAndroid Build Coastguard Worker {
2969*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
2970*35238bceSAndroid Build Coastguard Worker
2971*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
2972*35238bceSAndroid Build Coastguard Worker
2973*35238bceSAndroid Build Coastguard Worker // upload
2974*35238bceSAndroid Build Coastguard Worker {
2975*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
2976*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
2977*35238bceSAndroid Build Coastguard Worker
2978*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
2979*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &m_zeroData[0], m_bufferUsage);
2980*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
2981*35238bceSAndroid Build Coastguard Worker
2982*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = endTime - startTime;
2983*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
2984*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize;
2985*35238bceSAndroid Build Coastguard Worker }
2986*35238bceSAndroid Build Coastguard Worker }
2987*35238bceSAndroid Build Coastguard Worker
2988*35238bceSAndroid Build Coastguard Worker class BufferSubDataUploadCase : public BasicUploadCase<SingleOperationDuration>
2989*35238bceSAndroid Build Coastguard Worker {
2990*35238bceSAndroid Build Coastguard Worker public:
2991*35238bceSAndroid Build Coastguard Worker enum Flags
2992*35238bceSAndroid Build Coastguard Worker {
2993*35238bceSAndroid Build Coastguard Worker FLAG_FULL_UPLOAD = 0x01,
2994*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL_UPLOAD = 0x02,
2995*35238bceSAndroid Build Coastguard Worker FLAG_INVALIDATE_BEFORE_USE = 0x04,
2996*35238bceSAndroid Build Coastguard Worker };
2997*35238bceSAndroid Build Coastguard Worker
2998*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase(Context &ctx, const char *name, const char *desc, int minBufferSize, int maxBufferSize,
2999*35238bceSAndroid Build Coastguard Worker int numSamples, uint32_t bufferUsage, CaseType parentCase, int flags);
3000*35238bceSAndroid Build Coastguard Worker ~BufferSubDataUploadCase(void);
3001*35238bceSAndroid Build Coastguard Worker
3002*35238bceSAndroid Build Coastguard Worker void init(void);
3003*35238bceSAndroid Build Coastguard Worker
3004*35238bceSAndroid Build Coastguard Worker private:
3005*35238bceSAndroid Build Coastguard Worker void testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize);
3006*35238bceSAndroid Build Coastguard Worker
3007*35238bceSAndroid Build Coastguard Worker const bool m_fullUpload;
3008*35238bceSAndroid Build Coastguard Worker const bool m_invalidateBeforeUse;
3009*35238bceSAndroid Build Coastguard Worker };
3010*35238bceSAndroid Build Coastguard Worker
BufferSubDataUploadCase(Context & ctx,const char * name,const char * desc,int minBufferSize,int maxBufferSize,int numSamples,uint32_t bufferUsage,CaseType parentCase,int flags)3011*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::BufferSubDataUploadCase(Context &ctx, const char *name, const char *desc, int minBufferSize,
3012*35238bceSAndroid Build Coastguard Worker int maxBufferSize, int numSamples, uint32_t bufferUsage,
3013*35238bceSAndroid Build Coastguard Worker CaseType parentCase, int flags)
3014*35238bceSAndroid Build Coastguard Worker : BasicUploadCase<SingleOperationDuration>(ctx, name, desc, minBufferSize, maxBufferSize, numSamples, bufferUsage,
3015*35238bceSAndroid Build Coastguard Worker parentCase, RESULT_MEDIAN_TRANSFER_RATE)
3016*35238bceSAndroid Build Coastguard Worker , m_fullUpload((flags & FLAG_FULL_UPLOAD) != 0)
3017*35238bceSAndroid Build Coastguard Worker , m_invalidateBeforeUse((flags & FLAG_INVALIDATE_BEFORE_USE) != 0)
3018*35238bceSAndroid Build Coastguard Worker {
3019*35238bceSAndroid Build Coastguard Worker DE_ASSERT((flags & (FLAG_FULL_UPLOAD | FLAG_PARTIAL_UPLOAD)) != 0);
3020*35238bceSAndroid Build Coastguard Worker DE_ASSERT((flags & (FLAG_FULL_UPLOAD | FLAG_PARTIAL_UPLOAD)) != (FLAG_FULL_UPLOAD | FLAG_PARTIAL_UPLOAD));
3021*35238bceSAndroid Build Coastguard Worker }
3022*35238bceSAndroid Build Coastguard Worker
~BufferSubDataUploadCase(void)3023*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::~BufferSubDataUploadCase(void)
3024*35238bceSAndroid Build Coastguard Worker {
3025*35238bceSAndroid Build Coastguard Worker }
3026*35238bceSAndroid Build Coastguard Worker
init(void)3027*35238bceSAndroid Build Coastguard Worker void BufferSubDataUploadCase::init(void)
3028*35238bceSAndroid Build Coastguard Worker {
3029*35238bceSAndroid Build Coastguard Worker // Describe what the test tries to do
3030*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing glBufferSubData() function call performance. "
3031*35238bceSAndroid Build Coastguard Worker << ((m_fullUpload) ? ("The whole buffer is updated with glBufferSubData. ") :
3032*35238bceSAndroid Build Coastguard Worker ("Half of the buffer data is updated with glBufferSubData. "))
3033*35238bceSAndroid Build Coastguard Worker << ((m_invalidateBeforeUse) ?
3034*35238bceSAndroid Build Coastguard Worker ("The buffer is cleared with glBufferData(..., NULL) before glBufferSubData upload.") :
3035*35238bceSAndroid Build Coastguard Worker (""))
3036*35238bceSAndroid Build Coastguard Worker << "\n"
3037*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3038*35238bceSAndroid Build Coastguard Worker
3039*35238bceSAndroid Build Coastguard Worker BasicUploadCase<SingleOperationDuration>::init();
3040*35238bceSAndroid Build Coastguard Worker }
3041*35238bceSAndroid Build Coastguard Worker
testBufferUpload(UploadSampleResult<SingleOperationDuration> & result,int bufferSize)3042*35238bceSAndroid Build Coastguard Worker void BufferSubDataUploadCase::testBufferUpload(UploadSampleResult<SingleOperationDuration> &result, int bufferSize)
3043*35238bceSAndroid Build Coastguard Worker {
3044*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3045*35238bceSAndroid Build Coastguard Worker
3046*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
3047*35238bceSAndroid Build Coastguard Worker
3048*35238bceSAndroid Build Coastguard Worker // "invalidate", upload null
3049*35238bceSAndroid Build Coastguard Worker if (m_invalidateBeforeUse)
3050*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, DE_NULL, m_bufferUsage);
3051*35238bceSAndroid Build Coastguard Worker
3052*35238bceSAndroid Build Coastguard Worker // upload
3053*35238bceSAndroid Build Coastguard Worker {
3054*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3055*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3056*35238bceSAndroid Build Coastguard Worker
3057*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3058*35238bceSAndroid Build Coastguard Worker
3059*35238bceSAndroid Build Coastguard Worker if (m_fullUpload)
3060*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(GL_ARRAY_BUFFER, 0, bufferSize, &m_zeroData[0]);
3061*35238bceSAndroid Build Coastguard Worker else
3062*35238bceSAndroid Build Coastguard Worker {
3063*35238bceSAndroid Build Coastguard Worker // upload to buffer center
3064*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(GL_ARRAY_BUFFER, bufferSize / 4, bufferSize / 2, &m_zeroData[0]);
3065*35238bceSAndroid Build Coastguard Worker }
3066*35238bceSAndroid Build Coastguard Worker
3067*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3068*35238bceSAndroid Build Coastguard Worker
3069*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = endTime - startTime;
3070*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
3071*35238bceSAndroid Build Coastguard Worker
3072*35238bceSAndroid Build Coastguard Worker if (m_fullUpload)
3073*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize;
3074*35238bceSAndroid Build Coastguard Worker else
3075*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize / 2;
3076*35238bceSAndroid Build Coastguard Worker }
3077*35238bceSAndroid Build Coastguard Worker }
3078*35238bceSAndroid Build Coastguard Worker
3079*35238bceSAndroid Build Coastguard Worker class MapBufferRangeCase : public BasicUploadCase<MapBufferRangeDuration>
3080*35238bceSAndroid Build Coastguard Worker {
3081*35238bceSAndroid Build Coastguard Worker public:
3082*35238bceSAndroid Build Coastguard Worker enum Flags
3083*35238bceSAndroid Build Coastguard Worker {
3084*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL = 0x01,
3085*35238bceSAndroid Build Coastguard Worker FLAG_MANUAL_INVALIDATION = 0x02,
3086*35238bceSAndroid Build Coastguard Worker FLAG_USE_UNUSED_UNSPECIFIED_BUFFER = 0x04,
3087*35238bceSAndroid Build Coastguard Worker FLAG_USE_UNUSED_SPECIFIED_BUFFER = 0x08,
3088*35238bceSAndroid Build Coastguard Worker };
3089*35238bceSAndroid Build Coastguard Worker
3090*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase(Context &ctx, const char *name, const char *desc, int minBufferSize, int maxBufferSize,
3091*35238bceSAndroid Build Coastguard Worker int numSamples, uint32_t bufferUsage, uint32_t mapFlags, int caseFlags);
3092*35238bceSAndroid Build Coastguard Worker ~MapBufferRangeCase(void);
3093*35238bceSAndroid Build Coastguard Worker
3094*35238bceSAndroid Build Coastguard Worker void init(void);
3095*35238bceSAndroid Build Coastguard Worker
3096*35238bceSAndroid Build Coastguard Worker private:
3097*35238bceSAndroid Build Coastguard Worker static CaseType getBaseCaseType(int caseFlags);
3098*35238bceSAndroid Build Coastguard Worker static int getBaseFlags(uint32_t mapFlags, int caseFlags);
3099*35238bceSAndroid Build Coastguard Worker
3100*35238bceSAndroid Build Coastguard Worker void testBufferUpload(UploadSampleResult<MapBufferRangeDuration> &result, int bufferSize);
3101*35238bceSAndroid Build Coastguard Worker void attemptBufferMap(UploadSampleResult<MapBufferRangeDuration> &result, int bufferSize);
3102*35238bceSAndroid Build Coastguard Worker
3103*35238bceSAndroid Build Coastguard Worker const bool m_manualInvalidation;
3104*35238bceSAndroid Build Coastguard Worker const bool m_fullUpload;
3105*35238bceSAndroid Build Coastguard Worker const bool m_useUnusedUnspecifiedBuffer;
3106*35238bceSAndroid Build Coastguard Worker const bool m_useUnusedSpecifiedBuffer;
3107*35238bceSAndroid Build Coastguard Worker const uint32_t m_mapFlags;
3108*35238bceSAndroid Build Coastguard Worker int m_unmapFailures;
3109*35238bceSAndroid Build Coastguard Worker };
3110*35238bceSAndroid Build Coastguard Worker
MapBufferRangeCase(Context & ctx,const char * name,const char * desc,int minBufferSize,int maxBufferSize,int numSamples,uint32_t bufferUsage,uint32_t mapFlags,int caseFlags)3111*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::MapBufferRangeCase(Context &ctx, const char *name, const char *desc, int minBufferSize,
3112*35238bceSAndroid Build Coastguard Worker int maxBufferSize, int numSamples, uint32_t bufferUsage, uint32_t mapFlags,
3113*35238bceSAndroid Build Coastguard Worker int caseFlags)
3114*35238bceSAndroid Build Coastguard Worker : BasicUploadCase<MapBufferRangeDuration>(ctx, name, desc, minBufferSize, maxBufferSize, numSamples, bufferUsage,
3115*35238bceSAndroid Build Coastguard Worker getBaseCaseType(caseFlags), RESULT_MEDIAN_TRANSFER_RATE,
3116*35238bceSAndroid Build Coastguard Worker getBaseFlags(mapFlags, caseFlags))
3117*35238bceSAndroid Build Coastguard Worker , m_manualInvalidation((caseFlags & FLAG_MANUAL_INVALIDATION) != 0)
3118*35238bceSAndroid Build Coastguard Worker , m_fullUpload((caseFlags & FLAG_PARTIAL) == 0)
3119*35238bceSAndroid Build Coastguard Worker , m_useUnusedUnspecifiedBuffer((caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) != 0)
3120*35238bceSAndroid Build Coastguard Worker , m_useUnusedSpecifiedBuffer((caseFlags & FLAG_USE_UNUSED_SPECIFIED_BUFFER) != 0)
3121*35238bceSAndroid Build Coastguard Worker , m_mapFlags(mapFlags)
3122*35238bceSAndroid Build Coastguard Worker , m_unmapFailures(0)
3123*35238bceSAndroid Build Coastguard Worker {
3124*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!(m_useUnusedUnspecifiedBuffer && m_useUnusedSpecifiedBuffer));
3125*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!((m_useUnusedUnspecifiedBuffer || m_useUnusedSpecifiedBuffer) && m_manualInvalidation));
3126*35238bceSAndroid Build Coastguard Worker }
3127*35238bceSAndroid Build Coastguard Worker
~MapBufferRangeCase(void)3128*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::~MapBufferRangeCase(void)
3129*35238bceSAndroid Build Coastguard Worker {
3130*35238bceSAndroid Build Coastguard Worker }
3131*35238bceSAndroid Build Coastguard Worker
init(void)3132*35238bceSAndroid Build Coastguard Worker void MapBufferRangeCase::init(void)
3133*35238bceSAndroid Build Coastguard Worker {
3134*35238bceSAndroid Build Coastguard Worker // Describe what the test tries to do
3135*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog()
3136*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Testing glMapBufferRange() and glUnmapBuffer() function call performance.\n"
3137*35238bceSAndroid Build Coastguard Worker << ((m_fullUpload) ? ("The whole buffer is mapped.") : ("Half of the buffer is mapped.")) << "\n"
3138*35238bceSAndroid Build Coastguard Worker << ((m_useUnusedUnspecifiedBuffer) ?
3139*35238bceSAndroid Build Coastguard Worker ("The buffer has not been used before mapping and is allocated with unspecified contents.\n") :
3140*35238bceSAndroid Build Coastguard Worker (""))
3141*35238bceSAndroid Build Coastguard Worker << ((m_useUnusedSpecifiedBuffer) ?
3142*35238bceSAndroid Build Coastguard Worker ("The buffer has not been used before mapping and is allocated with specified contents.\n") :
3143*35238bceSAndroid Build Coastguard Worker (""))
3144*35238bceSAndroid Build Coastguard Worker << ((!m_useUnusedSpecifiedBuffer && !m_useUnusedUnspecifiedBuffer) ?
3145*35238bceSAndroid Build Coastguard Worker ("The buffer has previously been used in a drawing operation.\n") :
3146*35238bceSAndroid Build Coastguard Worker (""))
3147*35238bceSAndroid Build Coastguard Worker << ((m_manualInvalidation) ? ("The buffer is cleared with glBufferData(..., NULL) before mapping.\n") : (""))
3148*35238bceSAndroid Build Coastguard Worker << "Map bits:\n"
3149*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_WRITE_BIT) ? ("\tGL_MAP_WRITE_BIT\n") : (""))
3150*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_READ_BIT) ? ("\tGL_MAP_READ_BIT\n") : (""))
3151*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_RANGE_BIT) ? ("\tGL_MAP_INVALIDATE_RANGE_BIT\n") : (""))
3152*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) ? ("\tGL_MAP_INVALIDATE_BUFFER_BIT\n") : (""))
3153*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_UNSYNCHRONIZED_BIT) ? ("\tGL_MAP_UNSYNCHRONIZED_BIT\n") : (""))
3154*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3155*35238bceSAndroid Build Coastguard Worker
3156*35238bceSAndroid Build Coastguard Worker BasicUploadCase<MapBufferRangeDuration>::init();
3157*35238bceSAndroid Build Coastguard Worker }
3158*35238bceSAndroid Build Coastguard Worker
getBaseCaseType(int caseFlags)3159*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::CaseType MapBufferRangeCase::getBaseCaseType(int caseFlags)
3160*35238bceSAndroid Build Coastguard Worker {
3161*35238bceSAndroid Build Coastguard Worker if ((caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) == 0 && (caseFlags & FLAG_USE_UNUSED_SPECIFIED_BUFFER) == 0)
3162*35238bceSAndroid Build Coastguard Worker return CASE_USED_BUFFER;
3163*35238bceSAndroid Build Coastguard Worker else
3164*35238bceSAndroid Build Coastguard Worker return CASE_NEW_BUFFER;
3165*35238bceSAndroid Build Coastguard Worker }
3166*35238bceSAndroid Build Coastguard Worker
getBaseFlags(uint32_t mapFlags,int caseFlags)3167*35238bceSAndroid Build Coastguard Worker int MapBufferRangeCase::getBaseFlags(uint32_t mapFlags, int caseFlags)
3168*35238bceSAndroid Build Coastguard Worker {
3169*35238bceSAndroid Build Coastguard Worker int flags = FLAG_DONT_LOG_BUFFER_INFO;
3170*35238bceSAndroid Build Coastguard Worker
3171*35238bceSAndroid Build Coastguard Worker // If buffer contains unspecified data when it is sourced (i.e drawn)
3172*35238bceSAndroid Build Coastguard Worker // results are undefined, and system errors may occur. Signal parent
3173*35238bceSAndroid Build Coastguard Worker // class to take this into account
3174*35238bceSAndroid Build Coastguard Worker if (caseFlags & FLAG_PARTIAL)
3175*35238bceSAndroid Build Coastguard Worker {
3176*35238bceSAndroid Build Coastguard Worker if ((mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) != 0 || (caseFlags & FLAG_MANUAL_INVALIDATION) != 0 ||
3177*35238bceSAndroid Build Coastguard Worker (caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) != 0)
3178*35238bceSAndroid Build Coastguard Worker {
3179*35238bceSAndroid Build Coastguard Worker flags |= FLAG_RESULT_BUFFER_UNSPECIFIED_CONTENT;
3180*35238bceSAndroid Build Coastguard Worker }
3181*35238bceSAndroid Build Coastguard Worker }
3182*35238bceSAndroid Build Coastguard Worker
3183*35238bceSAndroid Build Coastguard Worker return flags;
3184*35238bceSAndroid Build Coastguard Worker }
3185*35238bceSAndroid Build Coastguard Worker
testBufferUpload(UploadSampleResult<MapBufferRangeDuration> & result,int bufferSize)3186*35238bceSAndroid Build Coastguard Worker void MapBufferRangeCase::testBufferUpload(UploadSampleResult<MapBufferRangeDuration> &result, int bufferSize)
3187*35238bceSAndroid Build Coastguard Worker {
3188*35238bceSAndroid Build Coastguard Worker const int unmapFailureThreshold = 4;
3189*35238bceSAndroid Build Coastguard Worker
3190*35238bceSAndroid Build Coastguard Worker for (; m_unmapFailures < unmapFailureThreshold; ++m_unmapFailures)
3191*35238bceSAndroid Build Coastguard Worker {
3192*35238bceSAndroid Build Coastguard Worker try
3193*35238bceSAndroid Build Coastguard Worker {
3194*35238bceSAndroid Build Coastguard Worker attemptBufferMap(result, bufferSize);
3195*35238bceSAndroid Build Coastguard Worker return;
3196*35238bceSAndroid Build Coastguard Worker }
3197*35238bceSAndroid Build Coastguard Worker catch (UnmapFailureError &)
3198*35238bceSAndroid Build Coastguard Worker {
3199*35238bceSAndroid Build Coastguard Worker }
3200*35238bceSAndroid Build Coastguard Worker }
3201*35238bceSAndroid Build Coastguard Worker
3202*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Unmapping failures exceeded limit");
3203*35238bceSAndroid Build Coastguard Worker }
3204*35238bceSAndroid Build Coastguard Worker
attemptBufferMap(UploadSampleResult<MapBufferRangeDuration> & result,int bufferSize)3205*35238bceSAndroid Build Coastguard Worker void MapBufferRangeCase::attemptBufferMap(UploadSampleResult<MapBufferRangeDuration> &result, int bufferSize)
3206*35238bceSAndroid Build Coastguard Worker {
3207*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3208*35238bceSAndroid Build Coastguard Worker
3209*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
3210*35238bceSAndroid Build Coastguard Worker
3211*35238bceSAndroid Build Coastguard Worker if (m_fullUpload)
3212*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize;
3213*35238bceSAndroid Build Coastguard Worker else
3214*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize / 2;
3215*35238bceSAndroid Build Coastguard Worker
3216*35238bceSAndroid Build Coastguard Worker // Create unused buffer
3217*35238bceSAndroid Build Coastguard Worker
3218*35238bceSAndroid Build Coastguard Worker if (m_manualInvalidation || m_useUnusedUnspecifiedBuffer)
3219*35238bceSAndroid Build Coastguard Worker {
3220*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3221*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3222*35238bceSAndroid Build Coastguard Worker
3223*35238bceSAndroid Build Coastguard Worker // "invalidate" or allocate, upload null
3224*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3225*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, DE_NULL, m_bufferUsage);
3226*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3227*35238bceSAndroid Build Coastguard Worker
3228*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = endTime - startTime;
3229*35238bceSAndroid Build Coastguard Worker }
3230*35238bceSAndroid Build Coastguard Worker else if (m_useUnusedSpecifiedBuffer)
3231*35238bceSAndroid Build Coastguard Worker {
3232*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3233*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3234*35238bceSAndroid Build Coastguard Worker
3235*35238bceSAndroid Build Coastguard Worker // Specify buffer contents
3236*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3237*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &m_zeroData[0], m_bufferUsage);
3238*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3239*35238bceSAndroid Build Coastguard Worker
3240*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = endTime - startTime;
3241*35238bceSAndroid Build Coastguard Worker }
3242*35238bceSAndroid Build Coastguard Worker else
3243*35238bceSAndroid Build Coastguard Worker {
3244*35238bceSAndroid Build Coastguard Worker // No alloc, no time
3245*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = 0;
3246*35238bceSAndroid Build Coastguard Worker }
3247*35238bceSAndroid Build Coastguard Worker
3248*35238bceSAndroid Build Coastguard Worker // upload
3249*35238bceSAndroid Build Coastguard Worker {
3250*35238bceSAndroid Build Coastguard Worker void *mapPtr;
3251*35238bceSAndroid Build Coastguard Worker
3252*35238bceSAndroid Build Coastguard Worker // Map
3253*35238bceSAndroid Build Coastguard Worker {
3254*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3255*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3256*35238bceSAndroid Build Coastguard Worker
3257*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3258*35238bceSAndroid Build Coastguard Worker if (m_fullUpload)
3259*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, 0, result.writtenSize, m_mapFlags);
3260*35238bceSAndroid Build Coastguard Worker else
3261*35238bceSAndroid Build Coastguard Worker {
3262*35238bceSAndroid Build Coastguard Worker // upload to buffer center
3263*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, bufferSize / 4, result.writtenSize, m_mapFlags);
3264*35238bceSAndroid Build Coastguard Worker }
3265*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3266*35238bceSAndroid Build Coastguard Worker
3267*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
3268*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
3269*35238bceSAndroid Build Coastguard Worker
3270*35238bceSAndroid Build Coastguard Worker result.duration.mapDuration = endTime - startTime;
3271*35238bceSAndroid Build Coastguard Worker }
3272*35238bceSAndroid Build Coastguard Worker
3273*35238bceSAndroid Build Coastguard Worker // Write
3274*35238bceSAndroid Build Coastguard Worker {
3275*35238bceSAndroid Build Coastguard Worker result.duration.writeDuration = medianTimeMemcpy(mapPtr, &m_zeroData[0], result.writtenSize);
3276*35238bceSAndroid Build Coastguard Worker }
3277*35238bceSAndroid Build Coastguard Worker
3278*35238bceSAndroid Build Coastguard Worker // Unmap
3279*35238bceSAndroid Build Coastguard Worker {
3280*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3281*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3282*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
3283*35238bceSAndroid Build Coastguard Worker
3284*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3285*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(GL_ARRAY_BUFFER);
3286*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3287*35238bceSAndroid Build Coastguard Worker
3288*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
3289*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
3290*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
3291*35238bceSAndroid Build Coastguard Worker
3292*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration = endTime - startTime;
3293*35238bceSAndroid Build Coastguard Worker }
3294*35238bceSAndroid Build Coastguard Worker
3295*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = result.duration.mapDuration + result.duration.writeDuration +
3296*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration + result.duration.allocDuration;
3297*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
3298*35238bceSAndroid Build Coastguard Worker }
3299*35238bceSAndroid Build Coastguard Worker }
3300*35238bceSAndroid Build Coastguard Worker
3301*35238bceSAndroid Build Coastguard Worker class MapBufferRangeFlushCase : public BasicUploadCase<MapBufferRangeFlushDuration>
3302*35238bceSAndroid Build Coastguard Worker {
3303*35238bceSAndroid Build Coastguard Worker public:
3304*35238bceSAndroid Build Coastguard Worker enum Flags
3305*35238bceSAndroid Build Coastguard Worker {
3306*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL = 0x01,
3307*35238bceSAndroid Build Coastguard Worker FLAG_FLUSH_IN_PARTS = 0x02,
3308*35238bceSAndroid Build Coastguard Worker FLAG_USE_UNUSED_UNSPECIFIED_BUFFER = 0x04,
3309*35238bceSAndroid Build Coastguard Worker FLAG_USE_UNUSED_SPECIFIED_BUFFER = 0x08,
3310*35238bceSAndroid Build Coastguard Worker FLAG_FLUSH_PARTIAL = 0x10,
3311*35238bceSAndroid Build Coastguard Worker };
3312*35238bceSAndroid Build Coastguard Worker
3313*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase(Context &ctx, const char *name, const char *desc, int minBufferSize, int maxBufferSize,
3314*35238bceSAndroid Build Coastguard Worker int numSamples, uint32_t bufferUsage, uint32_t mapFlags, int caseFlags);
3315*35238bceSAndroid Build Coastguard Worker ~MapBufferRangeFlushCase(void);
3316*35238bceSAndroid Build Coastguard Worker
3317*35238bceSAndroid Build Coastguard Worker void init(void);
3318*35238bceSAndroid Build Coastguard Worker
3319*35238bceSAndroid Build Coastguard Worker private:
3320*35238bceSAndroid Build Coastguard Worker static CaseType getBaseCaseType(int caseFlags);
3321*35238bceSAndroid Build Coastguard Worker static int getBaseFlags(uint32_t mapFlags, int caseFlags);
3322*35238bceSAndroid Build Coastguard Worker
3323*35238bceSAndroid Build Coastguard Worker void testBufferUpload(UploadSampleResult<MapBufferRangeFlushDuration> &result, int bufferSize);
3324*35238bceSAndroid Build Coastguard Worker void attemptBufferMap(UploadSampleResult<MapBufferRangeFlushDuration> &result, int bufferSize);
3325*35238bceSAndroid Build Coastguard Worker
3326*35238bceSAndroid Build Coastguard Worker const bool m_fullUpload;
3327*35238bceSAndroid Build Coastguard Worker const bool m_flushInParts;
3328*35238bceSAndroid Build Coastguard Worker const bool m_flushPartial;
3329*35238bceSAndroid Build Coastguard Worker const bool m_useUnusedUnspecifiedBuffer;
3330*35238bceSAndroid Build Coastguard Worker const bool m_useUnusedSpecifiedBuffer;
3331*35238bceSAndroid Build Coastguard Worker const uint32_t m_mapFlags;
3332*35238bceSAndroid Build Coastguard Worker int m_unmapFailures;
3333*35238bceSAndroid Build Coastguard Worker };
3334*35238bceSAndroid Build Coastguard Worker
MapBufferRangeFlushCase(Context & ctx,const char * name,const char * desc,int minBufferSize,int maxBufferSize,int numSamples,uint32_t bufferUsage,uint32_t mapFlags,int caseFlags)3335*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::MapBufferRangeFlushCase(Context &ctx, const char *name, const char *desc, int minBufferSize,
3336*35238bceSAndroid Build Coastguard Worker int maxBufferSize, int numSamples, uint32_t bufferUsage,
3337*35238bceSAndroid Build Coastguard Worker uint32_t mapFlags, int caseFlags)
3338*35238bceSAndroid Build Coastguard Worker : BasicUploadCase<MapBufferRangeFlushDuration>(ctx, name, desc, minBufferSize, maxBufferSize, numSamples,
3339*35238bceSAndroid Build Coastguard Worker bufferUsage, getBaseCaseType(caseFlags), RESULT_MEDIAN_TRANSFER_RATE,
3340*35238bceSAndroid Build Coastguard Worker getBaseFlags(mapFlags, caseFlags))
3341*35238bceSAndroid Build Coastguard Worker , m_fullUpload((caseFlags & FLAG_PARTIAL) == 0)
3342*35238bceSAndroid Build Coastguard Worker , m_flushInParts((caseFlags & FLAG_FLUSH_IN_PARTS) != 0)
3343*35238bceSAndroid Build Coastguard Worker , m_flushPartial((caseFlags & FLAG_FLUSH_PARTIAL) != 0)
3344*35238bceSAndroid Build Coastguard Worker , m_useUnusedUnspecifiedBuffer((caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) != 0)
3345*35238bceSAndroid Build Coastguard Worker , m_useUnusedSpecifiedBuffer((caseFlags & FLAG_USE_UNUSED_SPECIFIED_BUFFER) != 0)
3346*35238bceSAndroid Build Coastguard Worker , m_mapFlags(mapFlags)
3347*35238bceSAndroid Build Coastguard Worker , m_unmapFailures(0)
3348*35238bceSAndroid Build Coastguard Worker {
3349*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!(m_flushPartial && m_flushInParts));
3350*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!(m_flushPartial && !m_fullUpload));
3351*35238bceSAndroid Build Coastguard Worker }
3352*35238bceSAndroid Build Coastguard Worker
~MapBufferRangeFlushCase(void)3353*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::~MapBufferRangeFlushCase(void)
3354*35238bceSAndroid Build Coastguard Worker {
3355*35238bceSAndroid Build Coastguard Worker }
3356*35238bceSAndroid Build Coastguard Worker
init(void)3357*35238bceSAndroid Build Coastguard Worker void MapBufferRangeFlushCase::init(void)
3358*35238bceSAndroid Build Coastguard Worker {
3359*35238bceSAndroid Build Coastguard Worker // Describe what the test tries to do
3360*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog()
3361*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message
3362*35238bceSAndroid Build Coastguard Worker << "Testing glMapBufferRange(), glFlushMappedBufferRange() and glUnmapBuffer() function call performance.\n"
3363*35238bceSAndroid Build Coastguard Worker << ((m_fullUpload) ? ("The whole buffer is mapped.") : ("Half of the buffer is mapped.")) << "\n"
3364*35238bceSAndroid Build Coastguard Worker << ((m_flushInParts) ?
3365*35238bceSAndroid Build Coastguard Worker ("The mapped range is partitioned to 4 subranges and each partition is flushed separately.") :
3366*35238bceSAndroid Build Coastguard Worker (m_flushPartial) ? ("Half of the buffer range is flushed.") :
3367*35238bceSAndroid Build Coastguard Worker ("The whole mapped range is flushed in one flush call."))
3368*35238bceSAndroid Build Coastguard Worker << "\n"
3369*35238bceSAndroid Build Coastguard Worker << ((m_useUnusedUnspecifiedBuffer) ?
3370*35238bceSAndroid Build Coastguard Worker ("The buffer has not been used before mapping and is allocated with unspecified contents.\n") :
3371*35238bceSAndroid Build Coastguard Worker (""))
3372*35238bceSAndroid Build Coastguard Worker << ((m_useUnusedSpecifiedBuffer) ?
3373*35238bceSAndroid Build Coastguard Worker ("The buffer has not been used before mapping and is allocated with specified contents.\n") :
3374*35238bceSAndroid Build Coastguard Worker (""))
3375*35238bceSAndroid Build Coastguard Worker << ((!m_useUnusedSpecifiedBuffer && !m_useUnusedUnspecifiedBuffer) ?
3376*35238bceSAndroid Build Coastguard Worker ("The buffer has previously been used in a drawing operation.\n") :
3377*35238bceSAndroid Build Coastguard Worker (""))
3378*35238bceSAndroid Build Coastguard Worker << "Map bits:\n"
3379*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_WRITE_BIT) ? ("\tGL_MAP_WRITE_BIT\n") : (""))
3380*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_READ_BIT) ? ("\tGL_MAP_READ_BIT\n") : (""))
3381*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_RANGE_BIT) ? ("\tGL_MAP_INVALIDATE_RANGE_BIT\n") : (""))
3382*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) ? ("\tGL_MAP_INVALIDATE_BUFFER_BIT\n") : (""))
3383*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_UNSYNCHRONIZED_BIT) ? ("\tGL_MAP_UNSYNCHRONIZED_BIT\n") : (""))
3384*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_FLUSH_EXPLICIT_BIT) ? ("\tGL_MAP_FLUSH_EXPLICIT_BIT\n") : (""))
3385*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3386*35238bceSAndroid Build Coastguard Worker
3387*35238bceSAndroid Build Coastguard Worker BasicUploadCase<MapBufferRangeFlushDuration>::init();
3388*35238bceSAndroid Build Coastguard Worker }
3389*35238bceSAndroid Build Coastguard Worker
getBaseCaseType(int caseFlags)3390*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::CaseType MapBufferRangeFlushCase::getBaseCaseType(int caseFlags)
3391*35238bceSAndroid Build Coastguard Worker {
3392*35238bceSAndroid Build Coastguard Worker if ((caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) == 0 && (caseFlags & FLAG_USE_UNUSED_SPECIFIED_BUFFER) == 0)
3393*35238bceSAndroid Build Coastguard Worker return CASE_USED_BUFFER;
3394*35238bceSAndroid Build Coastguard Worker else
3395*35238bceSAndroid Build Coastguard Worker return CASE_NEW_BUFFER;
3396*35238bceSAndroid Build Coastguard Worker }
3397*35238bceSAndroid Build Coastguard Worker
getBaseFlags(uint32_t mapFlags,int caseFlags)3398*35238bceSAndroid Build Coastguard Worker int MapBufferRangeFlushCase::getBaseFlags(uint32_t mapFlags, int caseFlags)
3399*35238bceSAndroid Build Coastguard Worker {
3400*35238bceSAndroid Build Coastguard Worker int flags = FLAG_DONT_LOG_BUFFER_INFO;
3401*35238bceSAndroid Build Coastguard Worker
3402*35238bceSAndroid Build Coastguard Worker // If buffer contains unspecified data when it is sourced (i.e drawn)
3403*35238bceSAndroid Build Coastguard Worker // results are undefined, and system errors may occur. Signal parent
3404*35238bceSAndroid Build Coastguard Worker // class to take this into account
3405*35238bceSAndroid Build Coastguard Worker if (caseFlags & FLAG_PARTIAL)
3406*35238bceSAndroid Build Coastguard Worker {
3407*35238bceSAndroid Build Coastguard Worker if ((mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) != 0 || (caseFlags & FLAG_USE_UNUSED_UNSPECIFIED_BUFFER) != 0 ||
3408*35238bceSAndroid Build Coastguard Worker (caseFlags & FLAG_FLUSH_PARTIAL) != 0)
3409*35238bceSAndroid Build Coastguard Worker {
3410*35238bceSAndroid Build Coastguard Worker flags |= FLAG_RESULT_BUFFER_UNSPECIFIED_CONTENT;
3411*35238bceSAndroid Build Coastguard Worker }
3412*35238bceSAndroid Build Coastguard Worker }
3413*35238bceSAndroid Build Coastguard Worker
3414*35238bceSAndroid Build Coastguard Worker return flags;
3415*35238bceSAndroid Build Coastguard Worker }
3416*35238bceSAndroid Build Coastguard Worker
testBufferUpload(UploadSampleResult<MapBufferRangeFlushDuration> & result,int bufferSize)3417*35238bceSAndroid Build Coastguard Worker void MapBufferRangeFlushCase::testBufferUpload(UploadSampleResult<MapBufferRangeFlushDuration> &result, int bufferSize)
3418*35238bceSAndroid Build Coastguard Worker {
3419*35238bceSAndroid Build Coastguard Worker const int unmapFailureThreshold = 4;
3420*35238bceSAndroid Build Coastguard Worker
3421*35238bceSAndroid Build Coastguard Worker for (; m_unmapFailures < unmapFailureThreshold; ++m_unmapFailures)
3422*35238bceSAndroid Build Coastguard Worker {
3423*35238bceSAndroid Build Coastguard Worker try
3424*35238bceSAndroid Build Coastguard Worker {
3425*35238bceSAndroid Build Coastguard Worker attemptBufferMap(result, bufferSize);
3426*35238bceSAndroid Build Coastguard Worker return;
3427*35238bceSAndroid Build Coastguard Worker }
3428*35238bceSAndroid Build Coastguard Worker catch (UnmapFailureError &)
3429*35238bceSAndroid Build Coastguard Worker {
3430*35238bceSAndroid Build Coastguard Worker }
3431*35238bceSAndroid Build Coastguard Worker }
3432*35238bceSAndroid Build Coastguard Worker
3433*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Unmapping failures exceeded limit");
3434*35238bceSAndroid Build Coastguard Worker }
3435*35238bceSAndroid Build Coastguard Worker
attemptBufferMap(UploadSampleResult<MapBufferRangeFlushDuration> & result,int bufferSize)3436*35238bceSAndroid Build Coastguard Worker void MapBufferRangeFlushCase::attemptBufferMap(UploadSampleResult<MapBufferRangeFlushDuration> &result, int bufferSize)
3437*35238bceSAndroid Build Coastguard Worker {
3438*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3439*35238bceSAndroid Build Coastguard Worker const int mappedSize = (m_fullUpload) ? (bufferSize) : (bufferSize / 2);
3440*35238bceSAndroid Build Coastguard Worker
3441*35238bceSAndroid Build Coastguard Worker if (m_fullUpload && !m_flushPartial)
3442*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize;
3443*35238bceSAndroid Build Coastguard Worker else
3444*35238bceSAndroid Build Coastguard Worker result.writtenSize = bufferSize / 2;
3445*35238bceSAndroid Build Coastguard Worker
3446*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
3447*35238bceSAndroid Build Coastguard Worker
3448*35238bceSAndroid Build Coastguard Worker // Create unused buffer
3449*35238bceSAndroid Build Coastguard Worker
3450*35238bceSAndroid Build Coastguard Worker if (m_useUnusedUnspecifiedBuffer)
3451*35238bceSAndroid Build Coastguard Worker {
3452*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3453*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3454*35238bceSAndroid Build Coastguard Worker
3455*35238bceSAndroid Build Coastguard Worker // Don't specify contents
3456*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3457*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, DE_NULL, m_bufferUsage);
3458*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3459*35238bceSAndroid Build Coastguard Worker
3460*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = endTime - startTime;
3461*35238bceSAndroid Build Coastguard Worker }
3462*35238bceSAndroid Build Coastguard Worker else if (m_useUnusedSpecifiedBuffer)
3463*35238bceSAndroid Build Coastguard Worker {
3464*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3465*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3466*35238bceSAndroid Build Coastguard Worker
3467*35238bceSAndroid Build Coastguard Worker // Specify buffer contents
3468*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3469*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &m_zeroData[0], m_bufferUsage);
3470*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3471*35238bceSAndroid Build Coastguard Worker
3472*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = endTime - startTime;
3473*35238bceSAndroid Build Coastguard Worker }
3474*35238bceSAndroid Build Coastguard Worker else
3475*35238bceSAndroid Build Coastguard Worker {
3476*35238bceSAndroid Build Coastguard Worker // No alloc, no time
3477*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration = 0;
3478*35238bceSAndroid Build Coastguard Worker }
3479*35238bceSAndroid Build Coastguard Worker
3480*35238bceSAndroid Build Coastguard Worker // upload
3481*35238bceSAndroid Build Coastguard Worker {
3482*35238bceSAndroid Build Coastguard Worker void *mapPtr;
3483*35238bceSAndroid Build Coastguard Worker
3484*35238bceSAndroid Build Coastguard Worker // Map
3485*35238bceSAndroid Build Coastguard Worker {
3486*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3487*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3488*35238bceSAndroid Build Coastguard Worker
3489*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3490*35238bceSAndroid Build Coastguard Worker if (m_fullUpload)
3491*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, 0, mappedSize, m_mapFlags);
3492*35238bceSAndroid Build Coastguard Worker else
3493*35238bceSAndroid Build Coastguard Worker {
3494*35238bceSAndroid Build Coastguard Worker // upload to buffer center
3495*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, bufferSize / 4, mappedSize, m_mapFlags);
3496*35238bceSAndroid Build Coastguard Worker }
3497*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3498*35238bceSAndroid Build Coastguard Worker
3499*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
3500*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
3501*35238bceSAndroid Build Coastguard Worker
3502*35238bceSAndroid Build Coastguard Worker result.duration.mapDuration = endTime - startTime;
3503*35238bceSAndroid Build Coastguard Worker }
3504*35238bceSAndroid Build Coastguard Worker
3505*35238bceSAndroid Build Coastguard Worker // Write
3506*35238bceSAndroid Build Coastguard Worker {
3507*35238bceSAndroid Build Coastguard Worker if (!m_flushPartial)
3508*35238bceSAndroid Build Coastguard Worker result.duration.writeDuration = medianTimeMemcpy(mapPtr, &m_zeroData[0], result.writtenSize);
3509*35238bceSAndroid Build Coastguard Worker else
3510*35238bceSAndroid Build Coastguard Worker result.duration.writeDuration =
3511*35238bceSAndroid Build Coastguard Worker medianTimeMemcpy((uint8_t *)mapPtr + bufferSize / 4, &m_zeroData[0], result.writtenSize);
3512*35238bceSAndroid Build Coastguard Worker }
3513*35238bceSAndroid Build Coastguard Worker
3514*35238bceSAndroid Build Coastguard Worker // Flush
3515*35238bceSAndroid Build Coastguard Worker {
3516*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3517*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3518*35238bceSAndroid Build Coastguard Worker
3519*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3520*35238bceSAndroid Build Coastguard Worker
3521*35238bceSAndroid Build Coastguard Worker if (m_flushPartial)
3522*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, mappedSize / 4, mappedSize / 2);
3523*35238bceSAndroid Build Coastguard Worker else if (!m_flushInParts)
3524*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, 0, mappedSize);
3525*35238bceSAndroid Build Coastguard Worker else
3526*35238bceSAndroid Build Coastguard Worker {
3527*35238bceSAndroid Build Coastguard Worker const int p1 = 0;
3528*35238bceSAndroid Build Coastguard Worker const int p2 = mappedSize / 3;
3529*35238bceSAndroid Build Coastguard Worker const int p3 = mappedSize / 2;
3530*35238bceSAndroid Build Coastguard Worker const int p4 = mappedSize * 2 / 4;
3531*35238bceSAndroid Build Coastguard Worker const int p5 = mappedSize;
3532*35238bceSAndroid Build Coastguard Worker
3533*35238bceSAndroid Build Coastguard Worker // flush in mixed order
3534*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, p2, p3 - p2);
3535*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, p1, p2 - p1);
3536*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, p4, p5 - p4);
3537*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, p3, p4 - p3);
3538*35238bceSAndroid Build Coastguard Worker }
3539*35238bceSAndroid Build Coastguard Worker
3540*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3541*35238bceSAndroid Build Coastguard Worker
3542*35238bceSAndroid Build Coastguard Worker result.duration.flushDuration = endTime - startTime;
3543*35238bceSAndroid Build Coastguard Worker }
3544*35238bceSAndroid Build Coastguard Worker
3545*35238bceSAndroid Build Coastguard Worker // Unmap
3546*35238bceSAndroid Build Coastguard Worker {
3547*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3548*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3549*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
3550*35238bceSAndroid Build Coastguard Worker
3551*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3552*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(GL_ARRAY_BUFFER);
3553*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3554*35238bceSAndroid Build Coastguard Worker
3555*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
3556*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
3557*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
3558*35238bceSAndroid Build Coastguard Worker
3559*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration = endTime - startTime;
3560*35238bceSAndroid Build Coastguard Worker }
3561*35238bceSAndroid Build Coastguard Worker
3562*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = result.duration.mapDuration + result.duration.writeDuration +
3563*35238bceSAndroid Build Coastguard Worker result.duration.flushDuration + result.duration.unmapDuration +
3564*35238bceSAndroid Build Coastguard Worker result.duration.allocDuration;
3565*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
3566*35238bceSAndroid Build Coastguard Worker }
3567*35238bceSAndroid Build Coastguard Worker }
3568*35238bceSAndroid Build Coastguard Worker
3569*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
3570*35238bceSAndroid Build Coastguard Worker class ModifyAfterBasicCase : public BasicBufferCase<SampleType>
3571*35238bceSAndroid Build Coastguard Worker {
3572*35238bceSAndroid Build Coastguard Worker public:
3573*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase(Context &context, const char *name, const char *description, int bufferSizeMin,
3574*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, bool bufferUnspecifiedAfterTest);
3575*35238bceSAndroid Build Coastguard Worker ~ModifyAfterBasicCase(void);
3576*35238bceSAndroid Build Coastguard Worker
3577*35238bceSAndroid Build Coastguard Worker void init(void);
3578*35238bceSAndroid Build Coastguard Worker void deinit(void);
3579*35238bceSAndroid Build Coastguard Worker
3580*35238bceSAndroid Build Coastguard Worker protected:
3581*35238bceSAndroid Build Coastguard Worker void drawBufferRange(int begin, int end);
3582*35238bceSAndroid Build Coastguard Worker
3583*35238bceSAndroid Build Coastguard Worker private:
3584*35238bceSAndroid Build Coastguard Worker enum
3585*35238bceSAndroid Build Coastguard Worker {
3586*35238bceSAndroid Build Coastguard Worker NUM_SAMPLES = 20,
3587*35238bceSAndroid Build Coastguard Worker };
3588*35238bceSAndroid Build Coastguard Worker
3589*35238bceSAndroid Build Coastguard Worker bool runSample(int iteration, UploadSampleResult<SampleType> &sample);
3590*35238bceSAndroid Build Coastguard Worker bool prepareAndRunTest(int iteration, UploadSampleResult<SampleType> &result, int bufferSize);
3591*35238bceSAndroid Build Coastguard Worker void logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> &results);
3592*35238bceSAndroid Build Coastguard Worker
3593*35238bceSAndroid Build Coastguard Worker virtual void testWithBufferSize(UploadSampleResult<SampleType> &result, int bufferSize) = 0;
3594*35238bceSAndroid Build Coastguard Worker
3595*35238bceSAndroid Build Coastguard Worker int m_unmappingErrors;
3596*35238bceSAndroid Build Coastguard Worker
3597*35238bceSAndroid Build Coastguard Worker protected:
3598*35238bceSAndroid Build Coastguard Worker const bool m_bufferUnspecifiedAfterTest;
3599*35238bceSAndroid Build Coastguard Worker const uint32_t m_bufferUsage;
3600*35238bceSAndroid Build Coastguard Worker std::vector<uint8_t> m_zeroData;
3601*35238bceSAndroid Build Coastguard Worker
3602*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_testCtx;
3603*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_context;
3604*35238bceSAndroid Build Coastguard Worker
3605*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::UNUSED_RENDER_AREA_SIZE;
3606*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_minimalProgram;
3607*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_minimalProgramPosLoc;
3608*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferID;
3609*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_numSamples;
3610*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferSizeMin;
3611*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_bufferSizeMax;
3612*35238bceSAndroid Build Coastguard Worker using BasicBufferCase<SampleType>::m_allocateLargerBuffer;
3613*35238bceSAndroid Build Coastguard Worker };
3614*35238bceSAndroid Build Coastguard Worker
3615*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
ModifyAfterBasicCase(Context & context,const char * name,const char * description,int bufferSizeMin,int bufferSizeMax,uint32_t usage,bool bufferUnspecifiedAfterTest)3616*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SampleType>::ModifyAfterBasicCase(Context &context, const char *name, const char *description,
3617*35238bceSAndroid Build Coastguard Worker int bufferSizeMin, int bufferSizeMax, uint32_t usage,
3618*35238bceSAndroid Build Coastguard Worker bool bufferUnspecifiedAfterTest)
3619*35238bceSAndroid Build Coastguard Worker : BasicBufferCase<SampleType>(context, name, description, bufferSizeMin, bufferSizeMax, NUM_SAMPLES, 0)
3620*35238bceSAndroid Build Coastguard Worker , m_unmappingErrors(0)
3621*35238bceSAndroid Build Coastguard Worker , m_bufferUnspecifiedAfterTest(bufferUnspecifiedAfterTest)
3622*35238bceSAndroid Build Coastguard Worker , m_bufferUsage(usage)
3623*35238bceSAndroid Build Coastguard Worker , m_zeroData()
3624*35238bceSAndroid Build Coastguard Worker {
3625*35238bceSAndroid Build Coastguard Worker }
3626*35238bceSAndroid Build Coastguard Worker
3627*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
~ModifyAfterBasicCase(void)3628*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SampleType>::~ModifyAfterBasicCase(void)
3629*35238bceSAndroid Build Coastguard Worker {
3630*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::deinit();
3631*35238bceSAndroid Build Coastguard Worker }
3632*35238bceSAndroid Build Coastguard Worker
3633*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
init(void)3634*35238bceSAndroid Build Coastguard Worker void ModifyAfterBasicCase<SampleType>::init(void)
3635*35238bceSAndroid Build Coastguard Worker {
3636*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3637*35238bceSAndroid Build Coastguard Worker
3638*35238bceSAndroid Build Coastguard Worker // init parent
3639*35238bceSAndroid Build Coastguard Worker
3640*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::init();
3641*35238bceSAndroid Build Coastguard Worker
3642*35238bceSAndroid Build Coastguard Worker // upload source
3643*35238bceSAndroid Build Coastguard Worker m_zeroData.resize(m_bufferSizeMax, 0x00);
3644*35238bceSAndroid Build Coastguard Worker
3645*35238bceSAndroid Build Coastguard Worker // log basic info
3646*35238bceSAndroid Build Coastguard Worker
3647*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Testing performance with " << (int)NUM_SAMPLES
3648*35238bceSAndroid Build Coastguard Worker << " test samples. Sample order is randomized. All samples at even positions (first = 0) are "
3649*35238bceSAndroid Build Coastguard Worker "tested before samples at odd positions.\n"
3650*35238bceSAndroid Build Coastguard Worker << "Buffer sizes are in range [" << getHumanReadableByteSize(m_bufferSizeMin) << ", "
3651*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(m_bufferSizeMax) << "]." << tcu::TestLog::EndMessage;
3652*35238bceSAndroid Build Coastguard Worker
3653*35238bceSAndroid Build Coastguard Worker // log which transfer rate is the test result and buffer info
3654*35238bceSAndroid Build Coastguard Worker
3655*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Test result is the median transfer rate of the test samples.\n"
3656*35238bceSAndroid Build Coastguard Worker << "Buffer usage = " << glu::getUsageName(m_bufferUsage) << tcu::TestLog::EndMessage;
3657*35238bceSAndroid Build Coastguard Worker
3658*35238bceSAndroid Build Coastguard Worker // Set state for drawing so that we don't have to change these during the iteration
3659*35238bceSAndroid Build Coastguard Worker {
3660*35238bceSAndroid Build Coastguard Worker gl.useProgram(m_minimalProgram->getProgram());
3661*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, UNUSED_RENDER_AREA_SIZE, UNUSED_RENDER_AREA_SIZE);
3662*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_minimalProgramPosLoc);
3663*35238bceSAndroid Build Coastguard Worker }
3664*35238bceSAndroid Build Coastguard Worker }
3665*35238bceSAndroid Build Coastguard Worker
3666*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
deinit(void)3667*35238bceSAndroid Build Coastguard Worker void ModifyAfterBasicCase<SampleType>::deinit(void)
3668*35238bceSAndroid Build Coastguard Worker {
3669*35238bceSAndroid Build Coastguard Worker m_zeroData = std::vector<uint8_t>();
3670*35238bceSAndroid Build Coastguard Worker
3671*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::deinit();
3672*35238bceSAndroid Build Coastguard Worker }
3673*35238bceSAndroid Build Coastguard Worker
3674*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
drawBufferRange(int begin,int end)3675*35238bceSAndroid Build Coastguard Worker void ModifyAfterBasicCase<SampleType>::drawBufferRange(int begin, int end)
3676*35238bceSAndroid Build Coastguard Worker {
3677*35238bceSAndroid Build Coastguard Worker DE_ASSERT(begin % (int)sizeof(float[4]) == 0);
3678*35238bceSAndroid Build Coastguard Worker DE_ASSERT(end % (int)sizeof(float[4]) == 0);
3679*35238bceSAndroid Build Coastguard Worker
3680*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3681*35238bceSAndroid Build Coastguard Worker
3682*35238bceSAndroid Build Coastguard Worker // use given range
3683*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, begin / (int)sizeof(float[4]), 1);
3684*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_POINTS, end / (int)sizeof(float[4]) - 1, 1);
3685*35238bceSAndroid Build Coastguard Worker }
3686*35238bceSAndroid Build Coastguard Worker
3687*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
runSample(int iteration,UploadSampleResult<SampleType> & sample)3688*35238bceSAndroid Build Coastguard Worker bool ModifyAfterBasicCase<SampleType>::runSample(int iteration, UploadSampleResult<SampleType> &sample)
3689*35238bceSAndroid Build Coastguard Worker {
3690*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3691*35238bceSAndroid Build Coastguard Worker const int bufferSize = sample.bufferSize;
3692*35238bceSAndroid Build Coastguard Worker bool testOk;
3693*35238bceSAndroid Build Coastguard Worker
3694*35238bceSAndroid Build Coastguard Worker testOk = prepareAndRunTest(iteration, sample, bufferSize);
3695*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Buffer upload sample");
3696*35238bceSAndroid Build Coastguard Worker
3697*35238bceSAndroid Build Coastguard Worker if (!testOk)
3698*35238bceSAndroid Build Coastguard Worker {
3699*35238bceSAndroid Build Coastguard Worker const int unmapFailureThreshold = 4;
3700*35238bceSAndroid Build Coastguard Worker
3701*35238bceSAndroid Build Coastguard Worker // only unmapping error can cause iteration failure
3702*35238bceSAndroid Build Coastguard Worker if (++m_unmappingErrors >= unmapFailureThreshold)
3703*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Too many unmapping errors, cannot continue.");
3704*35238bceSAndroid Build Coastguard Worker
3705*35238bceSAndroid Build Coastguard Worker // just try again
3706*35238bceSAndroid Build Coastguard Worker return false;
3707*35238bceSAndroid Build Coastguard Worker }
3708*35238bceSAndroid Build Coastguard Worker
3709*35238bceSAndroid Build Coastguard Worker return true;
3710*35238bceSAndroid Build Coastguard Worker }
3711*35238bceSAndroid Build Coastguard Worker
3712*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
prepareAndRunTest(int iteration,UploadSampleResult<SampleType> & result,int bufferSize)3713*35238bceSAndroid Build Coastguard Worker bool ModifyAfterBasicCase<SampleType>::prepareAndRunTest(int iteration, UploadSampleResult<SampleType> &result,
3714*35238bceSAndroid Build Coastguard Worker int bufferSize)
3715*35238bceSAndroid Build Coastguard Worker {
3716*35238bceSAndroid Build Coastguard Worker DE_UNREF(iteration);
3717*35238bceSAndroid Build Coastguard Worker
3718*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_bufferID);
3719*35238bceSAndroid Build Coastguard Worker DE_ASSERT(deIsAligned32(bufferSize, 4 * 4)); // aligned to vec4
3720*35238bceSAndroid Build Coastguard Worker
3721*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3722*35238bceSAndroid Build Coastguard Worker bool testRunOk = true;
3723*35238bceSAndroid Build Coastguard Worker bool unmappingFailed = false;
3724*35238bceSAndroid Build Coastguard Worker
3725*35238bceSAndroid Build Coastguard Worker // Upload initial buffer to the GPU...
3726*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_bufferID);
3727*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_bufferID);
3728*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &m_zeroData[0], m_bufferUsage);
3729*35238bceSAndroid Build Coastguard Worker
3730*35238bceSAndroid Build Coastguard Worker // ...use it...
3731*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_minimalProgramPosLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
3732*35238bceSAndroid Build Coastguard Worker drawBufferRange(0, bufferSize);
3733*35238bceSAndroid Build Coastguard Worker
3734*35238bceSAndroid Build Coastguard Worker // ..and make sure it is uploaded
3735*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::waitGLResults();
3736*35238bceSAndroid Build Coastguard Worker
3737*35238bceSAndroid Build Coastguard Worker // warmup CPU before the test to make sure the power management governor
3738*35238bceSAndroid Build Coastguard Worker // keeps us in the "high performance" mode
3739*35238bceSAndroid Build Coastguard Worker {
3740*35238bceSAndroid Build Coastguard Worker deYield();
3741*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
3742*35238bceSAndroid Build Coastguard Worker deYield();
3743*35238bceSAndroid Build Coastguard Worker }
3744*35238bceSAndroid Build Coastguard Worker
3745*35238bceSAndroid Build Coastguard Worker // test
3746*35238bceSAndroid Build Coastguard Worker try
3747*35238bceSAndroid Build Coastguard Worker {
3748*35238bceSAndroid Build Coastguard Worker // buffer is uploaded to the GPU. Draw from it.
3749*35238bceSAndroid Build Coastguard Worker drawBufferRange(0, bufferSize);
3750*35238bceSAndroid Build Coastguard Worker
3751*35238bceSAndroid Build Coastguard Worker // and test upload
3752*35238bceSAndroid Build Coastguard Worker testWithBufferSize(result, bufferSize);
3753*35238bceSAndroid Build Coastguard Worker }
3754*35238bceSAndroid Build Coastguard Worker catch (UnmapFailureError &)
3755*35238bceSAndroid Build Coastguard Worker {
3756*35238bceSAndroid Build Coastguard Worker testRunOk = false;
3757*35238bceSAndroid Build Coastguard Worker unmappingFailed = true;
3758*35238bceSAndroid Build Coastguard Worker }
3759*35238bceSAndroid Build Coastguard Worker
3760*35238bceSAndroid Build Coastguard Worker // clean up: make sure buffer is not in upload queue and delete it
3761*35238bceSAndroid Build Coastguard Worker
3762*35238bceSAndroid Build Coastguard Worker // sourcing unspecified data causes undefined results, possibly program termination
3763*35238bceSAndroid Build Coastguard Worker if (m_bufferUnspecifiedAfterTest || unmappingFailed)
3764*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, bufferSize, &m_zeroData[0], m_bufferUsage);
3765*35238bceSAndroid Build Coastguard Worker
3766*35238bceSAndroid Build Coastguard Worker drawBufferRange(0, bufferSize);
3767*35238bceSAndroid Build Coastguard Worker BasicBufferCase<SampleType>::waitGLResults();
3768*35238bceSAndroid Build Coastguard Worker
3769*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &m_bufferID);
3770*35238bceSAndroid Build Coastguard Worker m_bufferID = 0;
3771*35238bceSAndroid Build Coastguard Worker
3772*35238bceSAndroid Build Coastguard Worker return testRunOk;
3773*35238bceSAndroid Build Coastguard Worker }
3774*35238bceSAndroid Build Coastguard Worker
3775*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> & results)3776*35238bceSAndroid Build Coastguard Worker void ModifyAfterBasicCase<SampleType>::logAndSetTestResult(const std::vector<UploadSampleResult<SampleType>> &results)
3777*35238bceSAndroid Build Coastguard Worker {
3778*35238bceSAndroid Build Coastguard Worker const UploadSampleAnalyzeResult analysis = analyzeSampleResults(m_testCtx.getLog(), results, false);
3779*35238bceSAndroid Build Coastguard Worker
3780*35238bceSAndroid Build Coastguard Worker // Return median transfer rate of the samples
3781*35238bceSAndroid Build Coastguard Worker
3782*35238bceSAndroid Build Coastguard Worker if (analysis.transferRateMedian == std::numeric_limits<float>::infinity())
3783*35238bceSAndroid Build Coastguard Worker {
3784*35238bceSAndroid Build Coastguard Worker // sample times are 1) invalid or 2) timer resolution too low
3785*35238bceSAndroid Build Coastguard Worker // report speed 0 bytes / s since real value cannot be determined
3786*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(0.0f, 2).c_str());
3787*35238bceSAndroid Build Coastguard Worker }
3788*35238bceSAndroid Build Coastguard Worker else
3789*35238bceSAndroid Build Coastguard Worker {
3790*35238bceSAndroid Build Coastguard Worker // report transfer rate in MB / s
3791*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS,
3792*35238bceSAndroid Build Coastguard Worker de::floatToString(analysis.transferRateMedian / 1024.0f / 1024.0f, 2).c_str());
3793*35238bceSAndroid Build Coastguard Worker }
3794*35238bceSAndroid Build Coastguard Worker }
3795*35238bceSAndroid Build Coastguard Worker
3796*35238bceSAndroid Build Coastguard Worker class ModifyAfterWithBufferDataCase : public ModifyAfterBasicCase<SingleOperationDuration>
3797*35238bceSAndroid Build Coastguard Worker {
3798*35238bceSAndroid Build Coastguard Worker public:
3799*35238bceSAndroid Build Coastguard Worker enum CaseFlags
3800*35238bceSAndroid Build Coastguard Worker {
3801*35238bceSAndroid Build Coastguard Worker FLAG_RESPECIFY_SIZE = 0x1,
3802*35238bceSAndroid Build Coastguard Worker FLAG_UPLOAD_REPEATED = 0x2,
3803*35238bceSAndroid Build Coastguard Worker };
3804*35238bceSAndroid Build Coastguard Worker
3805*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferDataCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
3806*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags);
3807*35238bceSAndroid Build Coastguard Worker ~ModifyAfterWithBufferDataCase(void);
3808*35238bceSAndroid Build Coastguard Worker
3809*35238bceSAndroid Build Coastguard Worker void init(void);
3810*35238bceSAndroid Build Coastguard Worker void deinit(void);
3811*35238bceSAndroid Build Coastguard Worker
3812*35238bceSAndroid Build Coastguard Worker private:
3813*35238bceSAndroid Build Coastguard Worker void testWithBufferSize(UploadSampleResult<SingleOperationDuration> &result, int bufferSize);
3814*35238bceSAndroid Build Coastguard Worker
3815*35238bceSAndroid Build Coastguard Worker enum
3816*35238bceSAndroid Build Coastguard Worker {
3817*35238bceSAndroid Build Coastguard Worker NUM_REPEATS = 2
3818*35238bceSAndroid Build Coastguard Worker };
3819*35238bceSAndroid Build Coastguard Worker
3820*35238bceSAndroid Build Coastguard Worker const bool m_respecifySize;
3821*35238bceSAndroid Build Coastguard Worker const bool m_repeatedUpload;
3822*35238bceSAndroid Build Coastguard Worker const float m_sizeDifferenceFactor;
3823*35238bceSAndroid Build Coastguard Worker };
3824*35238bceSAndroid Build Coastguard Worker
ModifyAfterWithBufferDataCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,uint32_t usage,int flags)3825*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferDataCase::ModifyAfterWithBufferDataCase(Context &context, const char *name, const char *desc,
3826*35238bceSAndroid Build Coastguard Worker int bufferSizeMin, int bufferSizeMax, uint32_t usage,
3827*35238bceSAndroid Build Coastguard Worker int flags)
3828*35238bceSAndroid Build Coastguard Worker : ModifyAfterBasicCase<SingleOperationDuration>(context, name, desc, bufferSizeMin, bufferSizeMax, usage, false)
3829*35238bceSAndroid Build Coastguard Worker , m_respecifySize((flags & FLAG_RESPECIFY_SIZE) != 0)
3830*35238bceSAndroid Build Coastguard Worker , m_repeatedUpload((flags & FLAG_UPLOAD_REPEATED) != 0)
3831*35238bceSAndroid Build Coastguard Worker , m_sizeDifferenceFactor(1.3f)
3832*35238bceSAndroid Build Coastguard Worker {
3833*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!(m_repeatedUpload && m_respecifySize));
3834*35238bceSAndroid Build Coastguard Worker }
3835*35238bceSAndroid Build Coastguard Worker
~ModifyAfterWithBufferDataCase(void)3836*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferDataCase::~ModifyAfterWithBufferDataCase(void)
3837*35238bceSAndroid Build Coastguard Worker {
3838*35238bceSAndroid Build Coastguard Worker deinit();
3839*35238bceSAndroid Build Coastguard Worker }
3840*35238bceSAndroid Build Coastguard Worker
init(void)3841*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferDataCase::init(void)
3842*35238bceSAndroid Build Coastguard Worker {
3843*35238bceSAndroid Build Coastguard Worker // Log the purpose of the test
3844*35238bceSAndroid Build Coastguard Worker
3845*35238bceSAndroid Build Coastguard Worker if (m_repeatedUpload)
3846*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3847*35238bceSAndroid Build Coastguard Worker << "Testing performance of BufferData() command after \"specify buffer contents - draw "
3848*35238bceSAndroid Build Coastguard Worker "buffer\" command pair is repeated "
3849*35238bceSAndroid Build Coastguard Worker << (int)NUM_REPEATS << " times." << tcu::TestLog::EndMessage;
3850*35238bceSAndroid Build Coastguard Worker else
3851*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3852*35238bceSAndroid Build Coastguard Worker << "Testing performance of BufferData() command after a draw command that sources data from "
3853*35238bceSAndroid Build Coastguard Worker "the target buffer."
3854*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3855*35238bceSAndroid Build Coastguard Worker
3856*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3857*35238bceSAndroid Build Coastguard Worker << ((m_respecifySize) ?
3858*35238bceSAndroid Build Coastguard Worker ("Buffer size is increased and contents are modified with BufferData().\n") :
3859*35238bceSAndroid Build Coastguard Worker ("Buffer contents are modified with BufferData().\n"))
3860*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3861*35238bceSAndroid Build Coastguard Worker
3862*35238bceSAndroid Build Coastguard Worker // init parent
3863*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SingleOperationDuration>::init();
3864*35238bceSAndroid Build Coastguard Worker
3865*35238bceSAndroid Build Coastguard Worker // make sure our zeroBuffer is large enough
3866*35238bceSAndroid Build Coastguard Worker if (m_respecifySize)
3867*35238bceSAndroid Build Coastguard Worker {
3868*35238bceSAndroid Build Coastguard Worker const int largerBufferSize = deAlign32((int)((float)m_bufferSizeMax * m_sizeDifferenceFactor), 4 * 4);
3869*35238bceSAndroid Build Coastguard Worker m_zeroData.resize(largerBufferSize, 0x00);
3870*35238bceSAndroid Build Coastguard Worker }
3871*35238bceSAndroid Build Coastguard Worker }
3872*35238bceSAndroid Build Coastguard Worker
deinit(void)3873*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferDataCase::deinit(void)
3874*35238bceSAndroid Build Coastguard Worker {
3875*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SingleOperationDuration>::deinit();
3876*35238bceSAndroid Build Coastguard Worker }
3877*35238bceSAndroid Build Coastguard Worker
testWithBufferSize(UploadSampleResult<SingleOperationDuration> & result,int bufferSize)3878*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferDataCase::testWithBufferSize(UploadSampleResult<SingleOperationDuration> &result,
3879*35238bceSAndroid Build Coastguard Worker int bufferSize)
3880*35238bceSAndroid Build Coastguard Worker {
3881*35238bceSAndroid Build Coastguard Worker // always draw the same amount to make compares between cases sensible
3882*35238bceSAndroid Build Coastguard Worker const int drawStart = deAlign32(bufferSize / 4, 4 * 4);
3883*35238bceSAndroid Build Coastguard Worker const int drawEnd = deAlign32(bufferSize * 3 / 4, 4 * 4);
3884*35238bceSAndroid Build Coastguard Worker
3885*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3886*35238bceSAndroid Build Coastguard Worker const int largerBufferSize = deAlign32((int)((float)bufferSize * m_sizeDifferenceFactor), 4 * 4);
3887*35238bceSAndroid Build Coastguard Worker const int newBufferSize = (m_respecifySize) ? (largerBufferSize) : (bufferSize);
3888*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3889*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3890*35238bceSAndroid Build Coastguard Worker
3891*35238bceSAndroid Build Coastguard Worker // repeat upload-draw
3892*35238bceSAndroid Build Coastguard Worker if (m_repeatedUpload)
3893*35238bceSAndroid Build Coastguard Worker {
3894*35238bceSAndroid Build Coastguard Worker for (int repeatNdx = 0; repeatNdx < NUM_REPEATS; ++repeatNdx)
3895*35238bceSAndroid Build Coastguard Worker {
3896*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, newBufferSize, &m_zeroData[0], m_bufferUsage);
3897*35238bceSAndroid Build Coastguard Worker drawBufferRange(drawStart, drawEnd);
3898*35238bceSAndroid Build Coastguard Worker }
3899*35238bceSAndroid Build Coastguard Worker }
3900*35238bceSAndroid Build Coastguard Worker
3901*35238bceSAndroid Build Coastguard Worker // test upload
3902*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
3903*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, newBufferSize, &m_zeroData[0], m_bufferUsage);
3904*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
3905*35238bceSAndroid Build Coastguard Worker
3906*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = endTime - startTime;
3907*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
3908*35238bceSAndroid Build Coastguard Worker result.writtenSize = newBufferSize;
3909*35238bceSAndroid Build Coastguard Worker }
3910*35238bceSAndroid Build Coastguard Worker
3911*35238bceSAndroid Build Coastguard Worker class ModifyAfterWithBufferSubDataCase : public ModifyAfterBasicCase<SingleOperationDuration>
3912*35238bceSAndroid Build Coastguard Worker {
3913*35238bceSAndroid Build Coastguard Worker public:
3914*35238bceSAndroid Build Coastguard Worker enum CaseFlags
3915*35238bceSAndroid Build Coastguard Worker {
3916*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL = 0x1,
3917*35238bceSAndroid Build Coastguard Worker FLAG_UPLOAD_REPEATED = 0x2,
3918*35238bceSAndroid Build Coastguard Worker };
3919*35238bceSAndroid Build Coastguard Worker
3920*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
3921*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags);
3922*35238bceSAndroid Build Coastguard Worker ~ModifyAfterWithBufferSubDataCase(void);
3923*35238bceSAndroid Build Coastguard Worker
3924*35238bceSAndroid Build Coastguard Worker void init(void);
3925*35238bceSAndroid Build Coastguard Worker void deinit(void);
3926*35238bceSAndroid Build Coastguard Worker
3927*35238bceSAndroid Build Coastguard Worker private:
3928*35238bceSAndroid Build Coastguard Worker void testWithBufferSize(UploadSampleResult<SingleOperationDuration> &result, int bufferSize);
3929*35238bceSAndroid Build Coastguard Worker
3930*35238bceSAndroid Build Coastguard Worker enum
3931*35238bceSAndroid Build Coastguard Worker {
3932*35238bceSAndroid Build Coastguard Worker NUM_REPEATS = 2
3933*35238bceSAndroid Build Coastguard Worker };
3934*35238bceSAndroid Build Coastguard Worker
3935*35238bceSAndroid Build Coastguard Worker const bool m_partialUpload;
3936*35238bceSAndroid Build Coastguard Worker const bool m_repeatedUpload;
3937*35238bceSAndroid Build Coastguard Worker };
3938*35238bceSAndroid Build Coastguard Worker
ModifyAfterWithBufferSubDataCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,uint32_t usage,int flags)3939*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase::ModifyAfterWithBufferSubDataCase(Context &context, const char *name, const char *desc,
3940*35238bceSAndroid Build Coastguard Worker int bufferSizeMin, int bufferSizeMax, uint32_t usage,
3941*35238bceSAndroid Build Coastguard Worker int flags)
3942*35238bceSAndroid Build Coastguard Worker : ModifyAfterBasicCase<SingleOperationDuration>(context, name, desc, bufferSizeMin, bufferSizeMax, usage, false)
3943*35238bceSAndroid Build Coastguard Worker , m_partialUpload((flags & FLAG_PARTIAL) != 0)
3944*35238bceSAndroid Build Coastguard Worker , m_repeatedUpload((flags & FLAG_UPLOAD_REPEATED) != 0)
3945*35238bceSAndroid Build Coastguard Worker {
3946*35238bceSAndroid Build Coastguard Worker }
3947*35238bceSAndroid Build Coastguard Worker
~ModifyAfterWithBufferSubDataCase(void)3948*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase::~ModifyAfterWithBufferSubDataCase(void)
3949*35238bceSAndroid Build Coastguard Worker {
3950*35238bceSAndroid Build Coastguard Worker deinit();
3951*35238bceSAndroid Build Coastguard Worker }
3952*35238bceSAndroid Build Coastguard Worker
init(void)3953*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferSubDataCase::init(void)
3954*35238bceSAndroid Build Coastguard Worker {
3955*35238bceSAndroid Build Coastguard Worker // Log the purpose of the test
3956*35238bceSAndroid Build Coastguard Worker
3957*35238bceSAndroid Build Coastguard Worker if (m_repeatedUpload)
3958*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3959*35238bceSAndroid Build Coastguard Worker << "Testing performance of BufferSubData() command after \"specify buffer contents - draw "
3960*35238bceSAndroid Build Coastguard Worker "buffer\" command pair is repeated "
3961*35238bceSAndroid Build Coastguard Worker << (int)NUM_REPEATS << " times." << tcu::TestLog::EndMessage;
3962*35238bceSAndroid Build Coastguard Worker else
3963*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3964*35238bceSAndroid Build Coastguard Worker << "Testing performance of BufferSubData() command after a draw command that sources data "
3965*35238bceSAndroid Build Coastguard Worker "from the target buffer."
3966*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3967*35238bceSAndroid Build Coastguard Worker
3968*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
3969*35238bceSAndroid Build Coastguard Worker << ((m_partialUpload) ? ("Half of the buffer contents are modified.\n") :
3970*35238bceSAndroid Build Coastguard Worker ("Buffer contents are fully respecified.\n"))
3971*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
3972*35238bceSAndroid Build Coastguard Worker
3973*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SingleOperationDuration>::init();
3974*35238bceSAndroid Build Coastguard Worker }
3975*35238bceSAndroid Build Coastguard Worker
deinit(void)3976*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferSubDataCase::deinit(void)
3977*35238bceSAndroid Build Coastguard Worker {
3978*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<SingleOperationDuration>::deinit();
3979*35238bceSAndroid Build Coastguard Worker }
3980*35238bceSAndroid Build Coastguard Worker
testWithBufferSize(UploadSampleResult<SingleOperationDuration> & result,int bufferSize)3981*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithBufferSubDataCase::testWithBufferSize(UploadSampleResult<SingleOperationDuration> &result,
3982*35238bceSAndroid Build Coastguard Worker int bufferSize)
3983*35238bceSAndroid Build Coastguard Worker {
3984*35238bceSAndroid Build Coastguard Worker // always draw the same amount to make compares between cases sensible
3985*35238bceSAndroid Build Coastguard Worker const int drawStart = deAlign32(bufferSize / 4, 4 * 4);
3986*35238bceSAndroid Build Coastguard Worker const int drawEnd = deAlign32(bufferSize * 3 / 4, 4 * 4);
3987*35238bceSAndroid Build Coastguard Worker
3988*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
3989*35238bceSAndroid Build Coastguard Worker const int subdataOffset = deAlign32((m_partialUpload) ? (bufferSize / 4) : (0), 4 * 4);
3990*35238bceSAndroid Build Coastguard Worker const int subdataSize = deAlign32((m_partialUpload) ? (bufferSize / 2) : (bufferSize), 4 * 4);
3991*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
3992*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
3993*35238bceSAndroid Build Coastguard Worker
3994*35238bceSAndroid Build Coastguard Worker // make upload-draw stream
3995*35238bceSAndroid Build Coastguard Worker if (m_repeatedUpload)
3996*35238bceSAndroid Build Coastguard Worker {
3997*35238bceSAndroid Build Coastguard Worker for (int repeatNdx = 0; repeatNdx < NUM_REPEATS; ++repeatNdx)
3998*35238bceSAndroid Build Coastguard Worker {
3999*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(GL_ARRAY_BUFFER, subdataOffset, subdataSize, &m_zeroData[0]);
4000*35238bceSAndroid Build Coastguard Worker drawBufferRange(drawStart, drawEnd);
4001*35238bceSAndroid Build Coastguard Worker }
4002*35238bceSAndroid Build Coastguard Worker }
4003*35238bceSAndroid Build Coastguard Worker
4004*35238bceSAndroid Build Coastguard Worker // test upload
4005*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4006*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(GL_ARRAY_BUFFER, subdataOffset, subdataSize, &m_zeroData[0]);
4007*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4008*35238bceSAndroid Build Coastguard Worker
4009*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = endTime - startTime;
4010*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
4011*35238bceSAndroid Build Coastguard Worker result.writtenSize = subdataSize;
4012*35238bceSAndroid Build Coastguard Worker }
4013*35238bceSAndroid Build Coastguard Worker
4014*35238bceSAndroid Build Coastguard Worker class ModifyAfterWithMapBufferRangeCase : public ModifyAfterBasicCase<MapBufferRangeDurationNoAlloc>
4015*35238bceSAndroid Build Coastguard Worker {
4016*35238bceSAndroid Build Coastguard Worker public:
4017*35238bceSAndroid Build Coastguard Worker enum CaseFlags
4018*35238bceSAndroid Build Coastguard Worker {
4019*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL = 0x1,
4020*35238bceSAndroid Build Coastguard Worker };
4021*35238bceSAndroid Build Coastguard Worker
4022*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferRangeCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
4023*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags, uint32_t glMapFlags);
4024*35238bceSAndroid Build Coastguard Worker ~ModifyAfterWithMapBufferRangeCase(void);
4025*35238bceSAndroid Build Coastguard Worker
4026*35238bceSAndroid Build Coastguard Worker void init(void);
4027*35238bceSAndroid Build Coastguard Worker void deinit(void);
4028*35238bceSAndroid Build Coastguard Worker
4029*35238bceSAndroid Build Coastguard Worker private:
4030*35238bceSAndroid Build Coastguard Worker static bool isBufferUnspecifiedAfterUpload(int flags, uint32_t mapFlags);
4031*35238bceSAndroid Build Coastguard Worker void testWithBufferSize(UploadSampleResult<MapBufferRangeDurationNoAlloc> &result, int bufferSize);
4032*35238bceSAndroid Build Coastguard Worker
4033*35238bceSAndroid Build Coastguard Worker const bool m_partialUpload;
4034*35238bceSAndroid Build Coastguard Worker const uint32_t m_mapFlags;
4035*35238bceSAndroid Build Coastguard Worker };
4036*35238bceSAndroid Build Coastguard Worker
ModifyAfterWithMapBufferRangeCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,uint32_t usage,int flags,uint32_t glMapFlags)4037*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferRangeCase::ModifyAfterWithMapBufferRangeCase(Context &context, const char *name,
4038*35238bceSAndroid Build Coastguard Worker const char *desc, int bufferSizeMin,
4039*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags,
4040*35238bceSAndroid Build Coastguard Worker uint32_t glMapFlags)
4041*35238bceSAndroid Build Coastguard Worker : ModifyAfterBasicCase<MapBufferRangeDurationNoAlloc>(context, name, desc, bufferSizeMin, bufferSizeMax, usage,
4042*35238bceSAndroid Build Coastguard Worker isBufferUnspecifiedAfterUpload(flags, glMapFlags))
4043*35238bceSAndroid Build Coastguard Worker , m_partialUpload((flags & FLAG_PARTIAL) != 0)
4044*35238bceSAndroid Build Coastguard Worker , m_mapFlags(glMapFlags)
4045*35238bceSAndroid Build Coastguard Worker {
4046*35238bceSAndroid Build Coastguard Worker }
4047*35238bceSAndroid Build Coastguard Worker
~ModifyAfterWithMapBufferRangeCase(void)4048*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferRangeCase::~ModifyAfterWithMapBufferRangeCase(void)
4049*35238bceSAndroid Build Coastguard Worker {
4050*35238bceSAndroid Build Coastguard Worker deinit();
4051*35238bceSAndroid Build Coastguard Worker }
4052*35238bceSAndroid Build Coastguard Worker
init(void)4053*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferRangeCase::init(void)
4054*35238bceSAndroid Build Coastguard Worker {
4055*35238bceSAndroid Build Coastguard Worker // Log the purpose of the test
4056*35238bceSAndroid Build Coastguard Worker
4057*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
4058*35238bceSAndroid Build Coastguard Worker << "Testing performance of MapBufferRange() command after a draw command that sources data from "
4059*35238bceSAndroid Build Coastguard Worker "the target buffer.\n"
4060*35238bceSAndroid Build Coastguard Worker << ((m_partialUpload) ? ("Half of the buffer is mapped.\n") : ("Whole buffer is mapped.\n"))
4061*35238bceSAndroid Build Coastguard Worker << "Map bits:\n"
4062*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_WRITE_BIT) ? ("\tGL_MAP_WRITE_BIT\n") : (""))
4063*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_READ_BIT) ? ("\tGL_MAP_READ_BIT\n") : (""))
4064*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_RANGE_BIT) ? ("\tGL_MAP_INVALIDATE_RANGE_BIT\n") : (""))
4065*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) ? ("\tGL_MAP_INVALIDATE_BUFFER_BIT\n") : (""))
4066*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_UNSYNCHRONIZED_BIT) ? ("\tGL_MAP_UNSYNCHRONIZED_BIT\n") : (""))
4067*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_FLUSH_EXPLICIT_BIT) ? ("\tGL_MAP_FLUSH_EXPLICIT_BIT\n") : (""))
4068*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
4069*35238bceSAndroid Build Coastguard Worker
4070*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<MapBufferRangeDurationNoAlloc>::init();
4071*35238bceSAndroid Build Coastguard Worker }
4072*35238bceSAndroid Build Coastguard Worker
deinit(void)4073*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferRangeCase::deinit(void)
4074*35238bceSAndroid Build Coastguard Worker {
4075*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<MapBufferRangeDurationNoAlloc>::deinit();
4076*35238bceSAndroid Build Coastguard Worker }
4077*35238bceSAndroid Build Coastguard Worker
isBufferUnspecifiedAfterUpload(int flags,uint32_t mapFlags)4078*35238bceSAndroid Build Coastguard Worker bool ModifyAfterWithMapBufferRangeCase::isBufferUnspecifiedAfterUpload(int flags, uint32_t mapFlags)
4079*35238bceSAndroid Build Coastguard Worker {
4080*35238bceSAndroid Build Coastguard Worker if ((flags & FLAG_PARTIAL) != 0 && ((mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) != 0))
4081*35238bceSAndroid Build Coastguard Worker return true;
4082*35238bceSAndroid Build Coastguard Worker
4083*35238bceSAndroid Build Coastguard Worker return false;
4084*35238bceSAndroid Build Coastguard Worker }
4085*35238bceSAndroid Build Coastguard Worker
testWithBufferSize(UploadSampleResult<MapBufferRangeDurationNoAlloc> & result,int bufferSize)4086*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferRangeCase::testWithBufferSize(UploadSampleResult<MapBufferRangeDurationNoAlloc> &result,
4087*35238bceSAndroid Build Coastguard Worker int bufferSize)
4088*35238bceSAndroid Build Coastguard Worker {
4089*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4090*35238bceSAndroid Build Coastguard Worker const int subdataOffset = deAlign32((m_partialUpload) ? (bufferSize / 4) : (0), 4 * 4);
4091*35238bceSAndroid Build Coastguard Worker const int subdataSize = deAlign32((m_partialUpload) ? (bufferSize / 2) : (bufferSize), 4 * 4);
4092*35238bceSAndroid Build Coastguard Worker void *mapPtr;
4093*35238bceSAndroid Build Coastguard Worker
4094*35238bceSAndroid Build Coastguard Worker // map
4095*35238bceSAndroid Build Coastguard Worker {
4096*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4097*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4098*35238bceSAndroid Build Coastguard Worker
4099*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4100*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, subdataOffset, subdataSize, m_mapFlags);
4101*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4102*35238bceSAndroid Build Coastguard Worker
4103*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
4104*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("mapBufferRange returned null");
4105*35238bceSAndroid Build Coastguard Worker
4106*35238bceSAndroid Build Coastguard Worker result.duration.mapDuration = endTime - startTime;
4107*35238bceSAndroid Build Coastguard Worker }
4108*35238bceSAndroid Build Coastguard Worker
4109*35238bceSAndroid Build Coastguard Worker // write
4110*35238bceSAndroid Build Coastguard Worker {
4111*35238bceSAndroid Build Coastguard Worker result.duration.writeDuration = medianTimeMemcpy(mapPtr, &m_zeroData[0], subdataSize);
4112*35238bceSAndroid Build Coastguard Worker }
4113*35238bceSAndroid Build Coastguard Worker
4114*35238bceSAndroid Build Coastguard Worker // unmap
4115*35238bceSAndroid Build Coastguard Worker {
4116*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4117*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4118*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSucceeded;
4119*35238bceSAndroid Build Coastguard Worker
4120*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4121*35238bceSAndroid Build Coastguard Worker unmapSucceeded = gl.unmapBuffer(GL_ARRAY_BUFFER);
4122*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4123*35238bceSAndroid Build Coastguard Worker
4124*35238bceSAndroid Build Coastguard Worker if (unmapSucceeded != GL_TRUE)
4125*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
4126*35238bceSAndroid Build Coastguard Worker
4127*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration = endTime - startTime;
4128*35238bceSAndroid Build Coastguard Worker }
4129*35238bceSAndroid Build Coastguard Worker
4130*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration =
4131*35238bceSAndroid Build Coastguard Worker result.duration.mapDuration + result.duration.writeDuration + result.duration.unmapDuration;
4132*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
4133*35238bceSAndroid Build Coastguard Worker result.writtenSize = subdataSize;
4134*35238bceSAndroid Build Coastguard Worker }
4135*35238bceSAndroid Build Coastguard Worker
4136*35238bceSAndroid Build Coastguard Worker class ModifyAfterWithMapBufferFlushCase : public ModifyAfterBasicCase<MapBufferRangeFlushDurationNoAlloc>
4137*35238bceSAndroid Build Coastguard Worker {
4138*35238bceSAndroid Build Coastguard Worker public:
4139*35238bceSAndroid Build Coastguard Worker enum CaseFlags
4140*35238bceSAndroid Build Coastguard Worker {
4141*35238bceSAndroid Build Coastguard Worker FLAG_PARTIAL = 0x1,
4142*35238bceSAndroid Build Coastguard Worker };
4143*35238bceSAndroid Build Coastguard Worker
4144*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferFlushCase(Context &context, const char *name, const char *desc, int bufferSizeMin,
4145*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags, uint32_t glMapFlags);
4146*35238bceSAndroid Build Coastguard Worker ~ModifyAfterWithMapBufferFlushCase(void);
4147*35238bceSAndroid Build Coastguard Worker
4148*35238bceSAndroid Build Coastguard Worker void init(void);
4149*35238bceSAndroid Build Coastguard Worker void deinit(void);
4150*35238bceSAndroid Build Coastguard Worker
4151*35238bceSAndroid Build Coastguard Worker private:
4152*35238bceSAndroid Build Coastguard Worker static bool isBufferUnspecifiedAfterUpload(int flags, uint32_t mapFlags);
4153*35238bceSAndroid Build Coastguard Worker void testWithBufferSize(UploadSampleResult<MapBufferRangeFlushDurationNoAlloc> &result, int bufferSize);
4154*35238bceSAndroid Build Coastguard Worker
4155*35238bceSAndroid Build Coastguard Worker const bool m_partialUpload;
4156*35238bceSAndroid Build Coastguard Worker const uint32_t m_mapFlags;
4157*35238bceSAndroid Build Coastguard Worker };
4158*35238bceSAndroid Build Coastguard Worker
ModifyAfterWithMapBufferFlushCase(Context & context,const char * name,const char * desc,int bufferSizeMin,int bufferSizeMax,uint32_t usage,int flags,uint32_t glMapFlags)4159*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferFlushCase::ModifyAfterWithMapBufferFlushCase(Context &context, const char *name,
4160*35238bceSAndroid Build Coastguard Worker const char *desc, int bufferSizeMin,
4161*35238bceSAndroid Build Coastguard Worker int bufferSizeMax, uint32_t usage, int flags,
4162*35238bceSAndroid Build Coastguard Worker uint32_t glMapFlags)
4163*35238bceSAndroid Build Coastguard Worker : ModifyAfterBasicCase<MapBufferRangeFlushDurationNoAlloc>(context, name, desc, bufferSizeMin, bufferSizeMax, usage,
4164*35238bceSAndroid Build Coastguard Worker isBufferUnspecifiedAfterUpload(flags, glMapFlags))
4165*35238bceSAndroid Build Coastguard Worker , m_partialUpload((flags & FLAG_PARTIAL) != 0)
4166*35238bceSAndroid Build Coastguard Worker , m_mapFlags(glMapFlags)
4167*35238bceSAndroid Build Coastguard Worker {
4168*35238bceSAndroid Build Coastguard Worker }
4169*35238bceSAndroid Build Coastguard Worker
~ModifyAfterWithMapBufferFlushCase(void)4170*35238bceSAndroid Build Coastguard Worker ModifyAfterWithMapBufferFlushCase::~ModifyAfterWithMapBufferFlushCase(void)
4171*35238bceSAndroid Build Coastguard Worker {
4172*35238bceSAndroid Build Coastguard Worker deinit();
4173*35238bceSAndroid Build Coastguard Worker }
4174*35238bceSAndroid Build Coastguard Worker
init(void)4175*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferFlushCase::init(void)
4176*35238bceSAndroid Build Coastguard Worker {
4177*35238bceSAndroid Build Coastguard Worker // Log the purpose of the test
4178*35238bceSAndroid Build Coastguard Worker
4179*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
4180*35238bceSAndroid Build Coastguard Worker << "Testing performance of MapBufferRange() command after a draw command that sources data from "
4181*35238bceSAndroid Build Coastguard Worker "the target buffer.\n"
4182*35238bceSAndroid Build Coastguard Worker << ((m_partialUpload) ? ("Half of the buffer is mapped.\n") : ("Whole buffer is mapped.\n"))
4183*35238bceSAndroid Build Coastguard Worker << "Map bits:\n"
4184*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_WRITE_BIT) ? ("\tGL_MAP_WRITE_BIT\n") : (""))
4185*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_READ_BIT) ? ("\tGL_MAP_READ_BIT\n") : (""))
4186*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_RANGE_BIT) ? ("\tGL_MAP_INVALIDATE_RANGE_BIT\n") : (""))
4187*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) ? ("\tGL_MAP_INVALIDATE_BUFFER_BIT\n") : (""))
4188*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_UNSYNCHRONIZED_BIT) ? ("\tGL_MAP_UNSYNCHRONIZED_BIT\n") : (""))
4189*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags & GL_MAP_FLUSH_EXPLICIT_BIT) ? ("\tGL_MAP_FLUSH_EXPLICIT_BIT\n") : (""))
4190*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
4191*35238bceSAndroid Build Coastguard Worker
4192*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<MapBufferRangeFlushDurationNoAlloc>::init();
4193*35238bceSAndroid Build Coastguard Worker }
4194*35238bceSAndroid Build Coastguard Worker
deinit(void)4195*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferFlushCase::deinit(void)
4196*35238bceSAndroid Build Coastguard Worker {
4197*35238bceSAndroid Build Coastguard Worker ModifyAfterBasicCase<MapBufferRangeFlushDurationNoAlloc>::deinit();
4198*35238bceSAndroid Build Coastguard Worker }
4199*35238bceSAndroid Build Coastguard Worker
isBufferUnspecifiedAfterUpload(int flags,uint32_t mapFlags)4200*35238bceSAndroid Build Coastguard Worker bool ModifyAfterWithMapBufferFlushCase::isBufferUnspecifiedAfterUpload(int flags, uint32_t mapFlags)
4201*35238bceSAndroid Build Coastguard Worker {
4202*35238bceSAndroid Build Coastguard Worker if ((flags & FLAG_PARTIAL) != 0 && ((mapFlags & GL_MAP_INVALIDATE_BUFFER_BIT) != 0))
4203*35238bceSAndroid Build Coastguard Worker return true;
4204*35238bceSAndroid Build Coastguard Worker
4205*35238bceSAndroid Build Coastguard Worker return false;
4206*35238bceSAndroid Build Coastguard Worker }
4207*35238bceSAndroid Build Coastguard Worker
testWithBufferSize(UploadSampleResult<MapBufferRangeFlushDurationNoAlloc> & result,int bufferSize)4208*35238bceSAndroid Build Coastguard Worker void ModifyAfterWithMapBufferFlushCase::testWithBufferSize(
4209*35238bceSAndroid Build Coastguard Worker UploadSampleResult<MapBufferRangeFlushDurationNoAlloc> &result, int bufferSize)
4210*35238bceSAndroid Build Coastguard Worker {
4211*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4212*35238bceSAndroid Build Coastguard Worker const int subdataOffset = deAlign32((m_partialUpload) ? (bufferSize / 4) : (0), 4 * 4);
4213*35238bceSAndroid Build Coastguard Worker const int subdataSize = deAlign32((m_partialUpload) ? (bufferSize / 2) : (bufferSize), 4 * 4);
4214*35238bceSAndroid Build Coastguard Worker void *mapPtr;
4215*35238bceSAndroid Build Coastguard Worker
4216*35238bceSAndroid Build Coastguard Worker // map
4217*35238bceSAndroid Build Coastguard Worker {
4218*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4219*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4220*35238bceSAndroid Build Coastguard Worker
4221*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4222*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, subdataOffset, subdataSize, m_mapFlags);
4223*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4224*35238bceSAndroid Build Coastguard Worker
4225*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
4226*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("mapBufferRange returned null");
4227*35238bceSAndroid Build Coastguard Worker
4228*35238bceSAndroid Build Coastguard Worker result.duration.mapDuration = endTime - startTime;
4229*35238bceSAndroid Build Coastguard Worker }
4230*35238bceSAndroid Build Coastguard Worker
4231*35238bceSAndroid Build Coastguard Worker // write
4232*35238bceSAndroid Build Coastguard Worker {
4233*35238bceSAndroid Build Coastguard Worker result.duration.writeDuration = medianTimeMemcpy(mapPtr, &m_zeroData[0], subdataSize);
4234*35238bceSAndroid Build Coastguard Worker }
4235*35238bceSAndroid Build Coastguard Worker
4236*35238bceSAndroid Build Coastguard Worker // flush
4237*35238bceSAndroid Build Coastguard Worker {
4238*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4239*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4240*35238bceSAndroid Build Coastguard Worker
4241*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4242*35238bceSAndroid Build Coastguard Worker gl.flushMappedBufferRange(GL_ARRAY_BUFFER, 0, subdataSize);
4243*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4244*35238bceSAndroid Build Coastguard Worker
4245*35238bceSAndroid Build Coastguard Worker result.duration.flushDuration = endTime - startTime;
4246*35238bceSAndroid Build Coastguard Worker }
4247*35238bceSAndroid Build Coastguard Worker
4248*35238bceSAndroid Build Coastguard Worker // unmap
4249*35238bceSAndroid Build Coastguard Worker {
4250*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4251*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4252*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSucceeded;
4253*35238bceSAndroid Build Coastguard Worker
4254*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4255*35238bceSAndroid Build Coastguard Worker unmapSucceeded = gl.unmapBuffer(GL_ARRAY_BUFFER);
4256*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4257*35238bceSAndroid Build Coastguard Worker
4258*35238bceSAndroid Build Coastguard Worker if (unmapSucceeded != GL_TRUE)
4259*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
4260*35238bceSAndroid Build Coastguard Worker
4261*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration = endTime - startTime;
4262*35238bceSAndroid Build Coastguard Worker }
4263*35238bceSAndroid Build Coastguard Worker
4264*35238bceSAndroid Build Coastguard Worker result.duration.totalDuration = result.duration.mapDuration + result.duration.writeDuration +
4265*35238bceSAndroid Build Coastguard Worker result.duration.unmapDuration + result.duration.flushDuration;
4266*35238bceSAndroid Build Coastguard Worker result.duration.fitResponseDuration = result.duration.totalDuration;
4267*35238bceSAndroid Build Coastguard Worker result.writtenSize = subdataSize;
4268*35238bceSAndroid Build Coastguard Worker }
4269*35238bceSAndroid Build Coastguard Worker
4270*35238bceSAndroid Build Coastguard Worker enum DrawMethod
4271*35238bceSAndroid Build Coastguard Worker {
4272*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS = 0,
4273*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS,
4274*35238bceSAndroid Build Coastguard Worker
4275*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_LAST
4276*35238bceSAndroid Build Coastguard Worker };
4277*35238bceSAndroid Build Coastguard Worker
4278*35238bceSAndroid Build Coastguard Worker enum TargetBuffer
4279*35238bceSAndroid Build Coastguard Worker {
4280*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_VERTEX = 0,
4281*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_INDEX,
4282*35238bceSAndroid Build Coastguard Worker
4283*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_LAST
4284*35238bceSAndroid Build Coastguard Worker };
4285*35238bceSAndroid Build Coastguard Worker
4286*35238bceSAndroid Build Coastguard Worker enum BufferState
4287*35238bceSAndroid Build Coastguard Worker {
4288*35238bceSAndroid Build Coastguard Worker BUFFERSTATE_NEW = 0,
4289*35238bceSAndroid Build Coastguard Worker BUFFERSTATE_EXISTING,
4290*35238bceSAndroid Build Coastguard Worker
4291*35238bceSAndroid Build Coastguard Worker BUFFERSTATE_LAST
4292*35238bceSAndroid Build Coastguard Worker };
4293*35238bceSAndroid Build Coastguard Worker
4294*35238bceSAndroid Build Coastguard Worker enum UploadMethod
4295*35238bceSAndroid Build Coastguard Worker {
4296*35238bceSAndroid Build Coastguard Worker UPLOADMETHOD_BUFFER_DATA = 0,
4297*35238bceSAndroid Build Coastguard Worker UPLOADMETHOD_BUFFER_SUB_DATA,
4298*35238bceSAndroid Build Coastguard Worker UPLOADMETHOD_MAP_BUFFER_RANGE,
4299*35238bceSAndroid Build Coastguard Worker
4300*35238bceSAndroid Build Coastguard Worker UPLOADMETHOD_LAST
4301*35238bceSAndroid Build Coastguard Worker };
4302*35238bceSAndroid Build Coastguard Worker
4303*35238bceSAndroid Build Coastguard Worker enum UnrelatedBufferType
4304*35238bceSAndroid Build Coastguard Worker {
4305*35238bceSAndroid Build Coastguard Worker UNRELATEDBUFFERTYPE_NONE = 0,
4306*35238bceSAndroid Build Coastguard Worker UNRELATEDBUFFERTYPE_VERTEX,
4307*35238bceSAndroid Build Coastguard Worker
4308*35238bceSAndroid Build Coastguard Worker UNRELATEDBUFFERTYPE_LAST
4309*35238bceSAndroid Build Coastguard Worker };
4310*35238bceSAndroid Build Coastguard Worker
4311*35238bceSAndroid Build Coastguard Worker enum UploadRange
4312*35238bceSAndroid Build Coastguard Worker {
4313*35238bceSAndroid Build Coastguard Worker UPLOADRANGE_FULL = 0,
4314*35238bceSAndroid Build Coastguard Worker UPLOADRANGE_PARTIAL,
4315*35238bceSAndroid Build Coastguard Worker
4316*35238bceSAndroid Build Coastguard Worker UPLOADRANGE_LAST
4317*35238bceSAndroid Build Coastguard Worker };
4318*35238bceSAndroid Build Coastguard Worker
4319*35238bceSAndroid Build Coastguard Worker struct LayeredGridSpec
4320*35238bceSAndroid Build Coastguard Worker {
4321*35238bceSAndroid Build Coastguard Worker int gridWidth;
4322*35238bceSAndroid Build Coastguard Worker int gridHeight;
4323*35238bceSAndroid Build Coastguard Worker int gridLayers;
4324*35238bceSAndroid Build Coastguard Worker };
4325*35238bceSAndroid Build Coastguard Worker
getLayeredGridNumVertices(const LayeredGridSpec & scene)4326*35238bceSAndroid Build Coastguard Worker static int getLayeredGridNumVertices(const LayeredGridSpec &scene)
4327*35238bceSAndroid Build Coastguard Worker {
4328*35238bceSAndroid Build Coastguard Worker return scene.gridWidth * scene.gridHeight * scene.gridLayers * 6;
4329*35238bceSAndroid Build Coastguard Worker }
4330*35238bceSAndroid Build Coastguard Worker
generateLayeredGridVertexAttribData4C4V(std::vector<tcu::Vec4> & vertexData,const LayeredGridSpec & scene)4331*35238bceSAndroid Build Coastguard Worker static void generateLayeredGridVertexAttribData4C4V(std::vector<tcu::Vec4> &vertexData, const LayeredGridSpec &scene)
4332*35238bceSAndroid Build Coastguard Worker {
4333*35238bceSAndroid Build Coastguard Worker // interleave color & vertex data
4334*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 green(0.0f, 1.0f, 0.0f, 0.7f);
4335*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 yellow(1.0f, 1.0f, 0.0f, 0.8f);
4336*35238bceSAndroid Build Coastguard Worker
4337*35238bceSAndroid Build Coastguard Worker vertexData.resize(getLayeredGridNumVertices(scene) * 2);
4338*35238bceSAndroid Build Coastguard Worker
4339*35238bceSAndroid Build Coastguard Worker for (int cellY = 0; cellY < scene.gridHeight; ++cellY)
4340*35238bceSAndroid Build Coastguard Worker for (int cellX = 0; cellX < scene.gridWidth; ++cellX)
4341*35238bceSAndroid Build Coastguard Worker for (int cellZ = 0; cellZ < scene.gridLayers; ++cellZ)
4342*35238bceSAndroid Build Coastguard Worker {
4343*35238bceSAndroid Build Coastguard Worker const tcu::Vec4 color = (((cellX + cellY + cellZ) % 2) == 0) ? (green) : (yellow);
4344*35238bceSAndroid Build Coastguard Worker const float cellLeft = (float(cellX) / (float)scene.gridWidth - 0.5f) * 2.0f;
4345*35238bceSAndroid Build Coastguard Worker const float cellRight = (float(cellX + 1) / (float)scene.gridWidth - 0.5f) * 2.0f;
4346*35238bceSAndroid Build Coastguard Worker const float cellTop = (float(cellY + 1) / (float)scene.gridHeight - 0.5f) * 2.0f;
4347*35238bceSAndroid Build Coastguard Worker const float cellBottom = (float(cellY) / (float)scene.gridHeight - 0.5f) * 2.0f;
4348*35238bceSAndroid Build Coastguard Worker
4349*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 0] =
4350*35238bceSAndroid Build Coastguard Worker color;
4351*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 1] =
4352*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellLeft, cellTop, 0.0f, 1.0f);
4353*35238bceSAndroid Build Coastguard Worker
4354*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 2] =
4355*35238bceSAndroid Build Coastguard Worker color;
4356*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 3] =
4357*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellLeft, cellBottom, 0.0f, 1.0f);
4358*35238bceSAndroid Build Coastguard Worker
4359*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 4] =
4360*35238bceSAndroid Build Coastguard Worker color;
4361*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 5] =
4362*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellRight, cellBottom, 0.0f, 1.0f);
4363*35238bceSAndroid Build Coastguard Worker
4364*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 6] =
4365*35238bceSAndroid Build Coastguard Worker color;
4366*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 7] =
4367*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellLeft, cellTop, 0.0f, 1.0f);
4368*35238bceSAndroid Build Coastguard Worker
4369*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 8] =
4370*35238bceSAndroid Build Coastguard Worker color;
4371*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 9] =
4372*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellRight, cellBottom, 0.0f, 1.0f);
4373*35238bceSAndroid Build Coastguard Worker
4374*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 10] =
4375*35238bceSAndroid Build Coastguard Worker color;
4376*35238bceSAndroid Build Coastguard Worker vertexData[(cellY * scene.gridWidth * scene.gridLayers + cellX * scene.gridLayers + cellZ) * 12 + 11] =
4377*35238bceSAndroid Build Coastguard Worker tcu::Vec4(cellRight, cellTop, 0.0f, 1.0f);
4378*35238bceSAndroid Build Coastguard Worker }
4379*35238bceSAndroid Build Coastguard Worker }
4380*35238bceSAndroid Build Coastguard Worker
generateLayeredGridIndexData(std::vector<uint32_t> & indexData,const LayeredGridSpec & scene)4381*35238bceSAndroid Build Coastguard Worker static void generateLayeredGridIndexData(std::vector<uint32_t> &indexData, const LayeredGridSpec &scene)
4382*35238bceSAndroid Build Coastguard Worker {
4383*35238bceSAndroid Build Coastguard Worker indexData.resize(getLayeredGridNumVertices(scene) * 2);
4384*35238bceSAndroid Build Coastguard Worker
4385*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < scene.gridLayers * scene.gridHeight * scene.gridWidth * 6; ++ndx)
4386*35238bceSAndroid Build Coastguard Worker indexData[ndx] = ndx;
4387*35238bceSAndroid Build Coastguard Worker }
4388*35238bceSAndroid Build Coastguard Worker
4389*35238bceSAndroid Build Coastguard Worker class RenderPerformanceTestBase : public TestCase
4390*35238bceSAndroid Build Coastguard Worker {
4391*35238bceSAndroid Build Coastguard Worker public:
4392*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase(Context &context, const char *name, const char *description);
4393*35238bceSAndroid Build Coastguard Worker ~RenderPerformanceTestBase(void);
4394*35238bceSAndroid Build Coastguard Worker
4395*35238bceSAndroid Build Coastguard Worker protected:
4396*35238bceSAndroid Build Coastguard Worker void init(void);
4397*35238bceSAndroid Build Coastguard Worker void deinit(void);
4398*35238bceSAndroid Build Coastguard Worker
4399*35238bceSAndroid Build Coastguard Worker void waitGLResults(void) const;
4400*35238bceSAndroid Build Coastguard Worker void setupVertexAttribs(void) const;
4401*35238bceSAndroid Build Coastguard Worker
4402*35238bceSAndroid Build Coastguard Worker enum
4403*35238bceSAndroid Build Coastguard Worker {
4404*35238bceSAndroid Build Coastguard Worker RENDER_AREA_SIZE = 128
4405*35238bceSAndroid Build Coastguard Worker };
4406*35238bceSAndroid Build Coastguard Worker
4407*35238bceSAndroid Build Coastguard Worker private:
4408*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_renderProgram;
4409*35238bceSAndroid Build Coastguard Worker int m_colorLoc;
4410*35238bceSAndroid Build Coastguard Worker int m_positionLoc;
4411*35238bceSAndroid Build Coastguard Worker };
4412*35238bceSAndroid Build Coastguard Worker
RenderPerformanceTestBase(Context & context,const char * name,const char * description)4413*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::RenderPerformanceTestBase(Context &context, const char *name, const char *description)
4414*35238bceSAndroid Build Coastguard Worker : TestCase(context, tcu::NODETYPE_PERFORMANCE, name, description)
4415*35238bceSAndroid Build Coastguard Worker , m_renderProgram(DE_NULL)
4416*35238bceSAndroid Build Coastguard Worker , m_colorLoc(0)
4417*35238bceSAndroid Build Coastguard Worker , m_positionLoc(0)
4418*35238bceSAndroid Build Coastguard Worker {
4419*35238bceSAndroid Build Coastguard Worker }
4420*35238bceSAndroid Build Coastguard Worker
~RenderPerformanceTestBase(void)4421*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::~RenderPerformanceTestBase(void)
4422*35238bceSAndroid Build Coastguard Worker {
4423*35238bceSAndroid Build Coastguard Worker deinit();
4424*35238bceSAndroid Build Coastguard Worker }
4425*35238bceSAndroid Build Coastguard Worker
init(void)4426*35238bceSAndroid Build Coastguard Worker void RenderPerformanceTestBase::init(void)
4427*35238bceSAndroid Build Coastguard Worker {
4428*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4429*35238bceSAndroid Build Coastguard Worker
4430*35238bceSAndroid Build Coastguard Worker m_renderProgram = new glu::ShaderProgram(m_context.getRenderContext(),
4431*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::VertexSource(s_colorVertexShader)
4432*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(s_colorFragmentShader));
4433*35238bceSAndroid Build Coastguard Worker if (!m_renderProgram->isOk())
4434*35238bceSAndroid Build Coastguard Worker {
4435*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << *m_renderProgram;
4436*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("could not build program");
4437*35238bceSAndroid Build Coastguard Worker }
4438*35238bceSAndroid Build Coastguard Worker
4439*35238bceSAndroid Build Coastguard Worker m_colorLoc = gl.getAttribLocation(m_renderProgram->getProgram(), "a_color");
4440*35238bceSAndroid Build Coastguard Worker m_positionLoc = gl.getAttribLocation(m_renderProgram->getProgram(), "a_position");
4441*35238bceSAndroid Build Coastguard Worker
4442*35238bceSAndroid Build Coastguard Worker if (m_colorLoc == -1)
4443*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Location of attribute a_color was -1");
4444*35238bceSAndroid Build Coastguard Worker if (m_positionLoc == -1)
4445*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Location of attribute a_position was -1");
4446*35238bceSAndroid Build Coastguard Worker }
4447*35238bceSAndroid Build Coastguard Worker
deinit(void)4448*35238bceSAndroid Build Coastguard Worker void RenderPerformanceTestBase::deinit(void)
4449*35238bceSAndroid Build Coastguard Worker {
4450*35238bceSAndroid Build Coastguard Worker delete m_renderProgram;
4451*35238bceSAndroid Build Coastguard Worker m_renderProgram = DE_NULL;
4452*35238bceSAndroid Build Coastguard Worker }
4453*35238bceSAndroid Build Coastguard Worker
setupVertexAttribs(void) const4454*35238bceSAndroid Build Coastguard Worker void RenderPerformanceTestBase::setupVertexAttribs(void) const
4455*35238bceSAndroid Build Coastguard Worker {
4456*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4457*35238bceSAndroid Build Coastguard Worker
4458*35238bceSAndroid Build Coastguard Worker // buffers are bound
4459*35238bceSAndroid Build Coastguard Worker
4460*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_colorLoc);
4461*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_positionLoc);
4462*35238bceSAndroid Build Coastguard Worker
4463*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_colorLoc, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(8 * sizeof(float)),
4464*35238bceSAndroid Build Coastguard Worker glu::BufferOffsetAsPointer(0 * sizeof(tcu::Vec4)));
4465*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_positionLoc, 4, GL_FLOAT, GL_FALSE, (glw::GLsizei)(8 * sizeof(float)),
4466*35238bceSAndroid Build Coastguard Worker glu::BufferOffsetAsPointer(1 * sizeof(tcu::Vec4)));
4467*35238bceSAndroid Build Coastguard Worker
4468*35238bceSAndroid Build Coastguard Worker gl.useProgram(m_renderProgram->getProgram());
4469*35238bceSAndroid Build Coastguard Worker
4470*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "set up rendering");
4471*35238bceSAndroid Build Coastguard Worker }
4472*35238bceSAndroid Build Coastguard Worker
waitGLResults(void) const4473*35238bceSAndroid Build Coastguard Worker void RenderPerformanceTestBase::waitGLResults(void) const
4474*35238bceSAndroid Build Coastguard Worker {
4475*35238bceSAndroid Build Coastguard Worker tcu::Surface unusedSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
4476*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, unusedSurface.getAccess());
4477*35238bceSAndroid Build Coastguard Worker }
4478*35238bceSAndroid Build Coastguard Worker
4479*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
4480*35238bceSAndroid Build Coastguard Worker class RenderCase : public RenderPerformanceTestBase
4481*35238bceSAndroid Build Coastguard Worker {
4482*35238bceSAndroid Build Coastguard Worker public:
4483*35238bceSAndroid Build Coastguard Worker RenderCase(Context &context, const char *name, const char *description, DrawMethod drawMethod);
4484*35238bceSAndroid Build Coastguard Worker ~RenderCase(void);
4485*35238bceSAndroid Build Coastguard Worker
4486*35238bceSAndroid Build Coastguard Worker protected:
4487*35238bceSAndroid Build Coastguard Worker void init(void);
4488*35238bceSAndroid Build Coastguard Worker void deinit(void);
4489*35238bceSAndroid Build Coastguard Worker
4490*35238bceSAndroid Build Coastguard Worker private:
4491*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
4492*35238bceSAndroid Build Coastguard Worker
4493*35238bceSAndroid Build Coastguard Worker protected:
4494*35238bceSAndroid Build Coastguard Worker struct SampleResult
4495*35238bceSAndroid Build Coastguard Worker {
4496*35238bceSAndroid Build Coastguard Worker LayeredGridSpec scene;
4497*35238bceSAndroid Build Coastguard Worker RenderSampleResult<SampleType> result;
4498*35238bceSAndroid Build Coastguard Worker };
4499*35238bceSAndroid Build Coastguard Worker
4500*35238bceSAndroid Build Coastguard Worker int getMinWorkloadSize(void) const;
4501*35238bceSAndroid Build Coastguard Worker int getMaxWorkloadSize(void) const;
4502*35238bceSAndroid Build Coastguard Worker int getMinWorkloadDataSize(void) const;
4503*35238bceSAndroid Build Coastguard Worker int getMaxWorkloadDataSize(void) const;
4504*35238bceSAndroid Build Coastguard Worker int getVertexDataSize(void) const;
4505*35238bceSAndroid Build Coastguard Worker int getNumSamples(void) const;
4506*35238bceSAndroid Build Coastguard Worker void uploadScene(const LayeredGridSpec &scene);
4507*35238bceSAndroid Build Coastguard Worker
4508*35238bceSAndroid Build Coastguard Worker virtual void runSample(SampleResult &sample) = 0;
4509*35238bceSAndroid Build Coastguard Worker virtual void logAndSetTestResult(const std::vector<SampleResult> &results);
4510*35238bceSAndroid Build Coastguard Worker
4511*35238bceSAndroid Build Coastguard Worker void mapResultsToRenderRateFormat(std::vector<RenderSampleResult<SampleType>> &dst,
4512*35238bceSAndroid Build Coastguard Worker const std::vector<SampleResult> &src) const;
4513*35238bceSAndroid Build Coastguard Worker
4514*35238bceSAndroid Build Coastguard Worker const DrawMethod m_drawMethod;
4515*35238bceSAndroid Build Coastguard Worker
4516*35238bceSAndroid Build Coastguard Worker private:
4517*35238bceSAndroid Build Coastguard Worker glw::GLuint m_attributeBufferID;
4518*35238bceSAndroid Build Coastguard Worker glw::GLuint m_indexBufferID;
4519*35238bceSAndroid Build Coastguard Worker int m_iterationNdx;
4520*35238bceSAndroid Build Coastguard Worker std::vector<int> m_iterationOrder;
4521*35238bceSAndroid Build Coastguard Worker std::vector<SampleResult> m_results;
4522*35238bceSAndroid Build Coastguard Worker int m_numUnmapFailures;
4523*35238bceSAndroid Build Coastguard Worker };
4524*35238bceSAndroid Build Coastguard Worker
4525*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
RenderCase(Context & context,const char * name,const char * description,DrawMethod drawMethod)4526*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::RenderCase(Context &context, const char *name, const char *description, DrawMethod drawMethod)
4527*35238bceSAndroid Build Coastguard Worker : RenderPerformanceTestBase(context, name, description)
4528*35238bceSAndroid Build Coastguard Worker , m_drawMethod(drawMethod)
4529*35238bceSAndroid Build Coastguard Worker , m_attributeBufferID(0)
4530*35238bceSAndroid Build Coastguard Worker , m_indexBufferID(0)
4531*35238bceSAndroid Build Coastguard Worker , m_iterationNdx(0)
4532*35238bceSAndroid Build Coastguard Worker , m_numUnmapFailures(0)
4533*35238bceSAndroid Build Coastguard Worker {
4534*35238bceSAndroid Build Coastguard Worker DE_ASSERT(drawMethod < DRAWMETHOD_LAST);
4535*35238bceSAndroid Build Coastguard Worker }
4536*35238bceSAndroid Build Coastguard Worker
4537*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
~RenderCase(void)4538*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::~RenderCase(void)
4539*35238bceSAndroid Build Coastguard Worker {
4540*35238bceSAndroid Build Coastguard Worker deinit();
4541*35238bceSAndroid Build Coastguard Worker }
4542*35238bceSAndroid Build Coastguard Worker
4543*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
init(void)4544*35238bceSAndroid Build Coastguard Worker void RenderCase<SampleType>::init(void)
4545*35238bceSAndroid Build Coastguard Worker {
4546*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4547*35238bceSAndroid Build Coastguard Worker
4548*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::init();
4549*35238bceSAndroid Build Coastguard Worker
4550*35238bceSAndroid Build Coastguard Worker // requirements
4551*35238bceSAndroid Build Coastguard Worker
4552*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getWidth() < RENDER_AREA_SIZE ||
4553*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getHeight() < RENDER_AREA_SIZE)
4554*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test case requires " + de::toString<int>(RENDER_AREA_SIZE) + "x" +
4555*35238bceSAndroid Build Coastguard Worker de::toString<int>(RENDER_AREA_SIZE) + " render target");
4556*35238bceSAndroid Build Coastguard Worker
4557*35238bceSAndroid Build Coastguard Worker // gl state
4558*35238bceSAndroid Build Coastguard Worker
4559*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, RENDER_AREA_SIZE, RENDER_AREA_SIZE);
4560*35238bceSAndroid Build Coastguard Worker
4561*35238bceSAndroid Build Coastguard Worker // enable bleding to prevent grid layers from being discarded
4562*35238bceSAndroid Build Coastguard Worker gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4563*35238bceSAndroid Build Coastguard Worker gl.blendEquation(GL_FUNC_ADD);
4564*35238bceSAndroid Build Coastguard Worker gl.enable(GL_BLEND);
4565*35238bceSAndroid Build Coastguard Worker
4566*35238bceSAndroid Build Coastguard Worker // generate iterations
4567*35238bceSAndroid Build Coastguard Worker
4568*35238bceSAndroid Build Coastguard Worker {
4569*35238bceSAndroid Build Coastguard Worker const int gridSizes[] = {20, 26, 32, 38, 44, 50, 56, 62, 68, 74, 80, 86, 92, 98, 104, 110, 116, 122, 128};
4570*35238bceSAndroid Build Coastguard Worker
4571*35238bceSAndroid Build Coastguard Worker for (int gridNdx = 0; gridNdx < DE_LENGTH_OF_ARRAY(gridSizes); ++gridNdx)
4572*35238bceSAndroid Build Coastguard Worker {
4573*35238bceSAndroid Build Coastguard Worker m_results.push_back(SampleResult());
4574*35238bceSAndroid Build Coastguard Worker
4575*35238bceSAndroid Build Coastguard Worker m_results.back().scene.gridHeight = gridSizes[gridNdx];
4576*35238bceSAndroid Build Coastguard Worker m_results.back().scene.gridWidth = gridSizes[gridNdx];
4577*35238bceSAndroid Build Coastguard Worker m_results.back().scene.gridLayers = 5;
4578*35238bceSAndroid Build Coastguard Worker
4579*35238bceSAndroid Build Coastguard Worker m_results.back().result.numVertices = getLayeredGridNumVertices(m_results.back().scene);
4580*35238bceSAndroid Build Coastguard Worker
4581*35238bceSAndroid Build Coastguard Worker // test cases set these, initialize to unused values
4582*35238bceSAndroid Build Coastguard Worker m_results.back().result.renderDataSize = -1;
4583*35238bceSAndroid Build Coastguard Worker m_results.back().result.uploadedDataSize = -1;
4584*35238bceSAndroid Build Coastguard Worker m_results.back().result.unrelatedDataSize = -1;
4585*35238bceSAndroid Build Coastguard Worker }
4586*35238bceSAndroid Build Coastguard Worker }
4587*35238bceSAndroid Build Coastguard Worker
4588*35238bceSAndroid Build Coastguard Worker // randomize iteration order
4589*35238bceSAndroid Build Coastguard Worker {
4590*35238bceSAndroid Build Coastguard Worker m_iterationOrder.resize(m_results.size());
4591*35238bceSAndroid Build Coastguard Worker generateTwoPassRandomIterationOrder(m_iterationOrder, (int)m_iterationOrder.size());
4592*35238bceSAndroid Build Coastguard Worker }
4593*35238bceSAndroid Build Coastguard Worker }
4594*35238bceSAndroid Build Coastguard Worker
4595*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
deinit(void)4596*35238bceSAndroid Build Coastguard Worker void RenderCase<SampleType>::deinit(void)
4597*35238bceSAndroid Build Coastguard Worker {
4598*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::deinit();
4599*35238bceSAndroid Build Coastguard Worker
4600*35238bceSAndroid Build Coastguard Worker if (m_attributeBufferID)
4601*35238bceSAndroid Build Coastguard Worker {
4602*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_attributeBufferID);
4603*35238bceSAndroid Build Coastguard Worker m_attributeBufferID = 0;
4604*35238bceSAndroid Build Coastguard Worker }
4605*35238bceSAndroid Build Coastguard Worker
4606*35238bceSAndroid Build Coastguard Worker if (m_indexBufferID)
4607*35238bceSAndroid Build Coastguard Worker {
4608*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_indexBufferID);
4609*35238bceSAndroid Build Coastguard Worker m_indexBufferID = 0;
4610*35238bceSAndroid Build Coastguard Worker }
4611*35238bceSAndroid Build Coastguard Worker }
4612*35238bceSAndroid Build Coastguard Worker
4613*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
iterate(void)4614*35238bceSAndroid Build Coastguard Worker typename RenderCase<SampleType>::IterateResult RenderCase<SampleType>::iterate(void)
4615*35238bceSAndroid Build Coastguard Worker {
4616*35238bceSAndroid Build Coastguard Worker const int unmapFailureThreshold = 3;
4617*35238bceSAndroid Build Coastguard Worker const int currentIteration = m_iterationNdx;
4618*35238bceSAndroid Build Coastguard Worker const int currentConfigNdx = m_iterationOrder[currentIteration];
4619*35238bceSAndroid Build Coastguard Worker SampleResult ¤tSample = m_results[currentConfigNdx];
4620*35238bceSAndroid Build Coastguard Worker
4621*35238bceSAndroid Build Coastguard Worker try
4622*35238bceSAndroid Build Coastguard Worker {
4623*35238bceSAndroid Build Coastguard Worker runSample(currentSample);
4624*35238bceSAndroid Build Coastguard Worker ++m_iterationNdx;
4625*35238bceSAndroid Build Coastguard Worker }
4626*35238bceSAndroid Build Coastguard Worker catch (const UnmapFailureError &ex)
4627*35238bceSAndroid Build Coastguard Worker {
4628*35238bceSAndroid Build Coastguard Worker DE_UNREF(ex);
4629*35238bceSAndroid Build Coastguard Worker ++m_numUnmapFailures;
4630*35238bceSAndroid Build Coastguard Worker }
4631*35238bceSAndroid Build Coastguard Worker
4632*35238bceSAndroid Build Coastguard Worker if (m_numUnmapFailures > unmapFailureThreshold)
4633*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Got too many unmap errors");
4634*35238bceSAndroid Build Coastguard Worker
4635*35238bceSAndroid Build Coastguard Worker if (m_iterationNdx < (int)m_iterationOrder.size())
4636*35238bceSAndroid Build Coastguard Worker return CONTINUE;
4637*35238bceSAndroid Build Coastguard Worker
4638*35238bceSAndroid Build Coastguard Worker logAndSetTestResult(m_results);
4639*35238bceSAndroid Build Coastguard Worker return STOP;
4640*35238bceSAndroid Build Coastguard Worker }
4641*35238bceSAndroid Build Coastguard Worker
4642*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getMinWorkloadSize(void) const4643*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getMinWorkloadSize(void) const
4644*35238bceSAndroid Build Coastguard Worker {
4645*35238bceSAndroid Build Coastguard Worker int result = getLayeredGridNumVertices(m_results[0].scene);
4646*35238bceSAndroid Build Coastguard Worker
4647*35238bceSAndroid Build Coastguard Worker for (int ndx = 1; ndx < (int)m_results.size(); ++ndx)
4648*35238bceSAndroid Build Coastguard Worker {
4649*35238bceSAndroid Build Coastguard Worker const int workloadSize = getLayeredGridNumVertices(m_results[ndx].scene);
4650*35238bceSAndroid Build Coastguard Worker result = de::min(result, workloadSize);
4651*35238bceSAndroid Build Coastguard Worker }
4652*35238bceSAndroid Build Coastguard Worker
4653*35238bceSAndroid Build Coastguard Worker return result;
4654*35238bceSAndroid Build Coastguard Worker }
4655*35238bceSAndroid Build Coastguard Worker
4656*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getMaxWorkloadSize(void) const4657*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getMaxWorkloadSize(void) const
4658*35238bceSAndroid Build Coastguard Worker {
4659*35238bceSAndroid Build Coastguard Worker int result = getLayeredGridNumVertices(m_results[0].scene);
4660*35238bceSAndroid Build Coastguard Worker
4661*35238bceSAndroid Build Coastguard Worker for (int ndx = 1; ndx < (int)m_results.size(); ++ndx)
4662*35238bceSAndroid Build Coastguard Worker {
4663*35238bceSAndroid Build Coastguard Worker const int workloadSize = getLayeredGridNumVertices(m_results[ndx].scene);
4664*35238bceSAndroid Build Coastguard Worker result = de::max(result, workloadSize);
4665*35238bceSAndroid Build Coastguard Worker }
4666*35238bceSAndroid Build Coastguard Worker
4667*35238bceSAndroid Build Coastguard Worker return result;
4668*35238bceSAndroid Build Coastguard Worker }
4669*35238bceSAndroid Build Coastguard Worker
4670*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getMinWorkloadDataSize(void) const4671*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getMinWorkloadDataSize(void) const
4672*35238bceSAndroid Build Coastguard Worker {
4673*35238bceSAndroid Build Coastguard Worker return getMinWorkloadSize() * getVertexDataSize();
4674*35238bceSAndroid Build Coastguard Worker }
4675*35238bceSAndroid Build Coastguard Worker
4676*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getMaxWorkloadDataSize(void) const4677*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getMaxWorkloadDataSize(void) const
4678*35238bceSAndroid Build Coastguard Worker {
4679*35238bceSAndroid Build Coastguard Worker return getMaxWorkloadSize() * getVertexDataSize();
4680*35238bceSAndroid Build Coastguard Worker }
4681*35238bceSAndroid Build Coastguard Worker
4682*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getVertexDataSize(void) const4683*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getVertexDataSize(void) const
4684*35238bceSAndroid Build Coastguard Worker {
4685*35238bceSAndroid Build Coastguard Worker const int numVectors = 2;
4686*35238bceSAndroid Build Coastguard Worker const int vec4Size = 4 * sizeof(float);
4687*35238bceSAndroid Build Coastguard Worker
4688*35238bceSAndroid Build Coastguard Worker return numVectors * vec4Size;
4689*35238bceSAndroid Build Coastguard Worker }
4690*35238bceSAndroid Build Coastguard Worker
4691*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
getNumSamples(void) const4692*35238bceSAndroid Build Coastguard Worker int RenderCase<SampleType>::getNumSamples(void) const
4693*35238bceSAndroid Build Coastguard Worker {
4694*35238bceSAndroid Build Coastguard Worker return (int)m_results.size();
4695*35238bceSAndroid Build Coastguard Worker }
4696*35238bceSAndroid Build Coastguard Worker
4697*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
uploadScene(const LayeredGridSpec & scene)4698*35238bceSAndroid Build Coastguard Worker void RenderCase<SampleType>::uploadScene(const LayeredGridSpec &scene)
4699*35238bceSAndroid Build Coastguard Worker {
4700*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4701*35238bceSAndroid Build Coastguard Worker
4702*35238bceSAndroid Build Coastguard Worker // vertex buffer
4703*35238bceSAndroid Build Coastguard Worker {
4704*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
4705*35238bceSAndroid Build Coastguard Worker
4706*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, scene);
4707*35238bceSAndroid Build Coastguard Worker
4708*35238bceSAndroid Build Coastguard Worker if (m_attributeBufferID == 0)
4709*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_attributeBufferID);
4710*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_attributeBufferID);
4711*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (int)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0], GL_STATIC_DRAW);
4712*35238bceSAndroid Build Coastguard Worker }
4713*35238bceSAndroid Build Coastguard Worker
4714*35238bceSAndroid Build Coastguard Worker // index buffer
4715*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4716*35238bceSAndroid Build Coastguard Worker {
4717*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> indexData;
4718*35238bceSAndroid Build Coastguard Worker
4719*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(indexData, scene);
4720*35238bceSAndroid Build Coastguard Worker
4721*35238bceSAndroid Build Coastguard Worker if (m_indexBufferID == 0)
4722*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_indexBufferID);
4723*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferID);
4724*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (int)(indexData.size() * sizeof(uint32_t)), &indexData[0],
4725*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
4726*35238bceSAndroid Build Coastguard Worker }
4727*35238bceSAndroid Build Coastguard Worker
4728*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "create buffers");
4729*35238bceSAndroid Build Coastguard Worker }
4730*35238bceSAndroid Build Coastguard Worker
4731*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
logAndSetTestResult(const std::vector<SampleResult> & results)4732*35238bceSAndroid Build Coastguard Worker void RenderCase<SampleType>::logAndSetTestResult(const std::vector<SampleResult> &results)
4733*35238bceSAndroid Build Coastguard Worker {
4734*35238bceSAndroid Build Coastguard Worker std::vector<RenderSampleResult<SampleType>> mappedResults;
4735*35238bceSAndroid Build Coastguard Worker
4736*35238bceSAndroid Build Coastguard Worker mapResultsToRenderRateFormat(mappedResults, results);
4737*35238bceSAndroid Build Coastguard Worker
4738*35238bceSAndroid Build Coastguard Worker {
4739*35238bceSAndroid Build Coastguard Worker const RenderSampleAnalyzeResult analysis = analyzeSampleResults(m_testCtx.getLog(), mappedResults);
4740*35238bceSAndroid Build Coastguard Worker const float rate = analysis.renderRateAtRange;
4741*35238bceSAndroid Build Coastguard Worker
4742*35238bceSAndroid Build Coastguard Worker if (rate == std::numeric_limits<float>::infinity())
4743*35238bceSAndroid Build Coastguard Worker {
4744*35238bceSAndroid Build Coastguard Worker // sample times are 1) invalid or 2) timer resolution too low
4745*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(0.0f, 2).c_str());
4746*35238bceSAndroid Build Coastguard Worker }
4747*35238bceSAndroid Build Coastguard Worker else
4748*35238bceSAndroid Build Coastguard Worker {
4749*35238bceSAndroid Build Coastguard Worker // report transfer rate in millions of MiB/s
4750*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(rate / 1024.0f / 1024.0f, 2).c_str());
4751*35238bceSAndroid Build Coastguard Worker }
4752*35238bceSAndroid Build Coastguard Worker }
4753*35238bceSAndroid Build Coastguard Worker }
4754*35238bceSAndroid Build Coastguard Worker
4755*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
mapResultsToRenderRateFormat(std::vector<RenderSampleResult<SampleType>> & dst,const std::vector<SampleResult> & src) const4756*35238bceSAndroid Build Coastguard Worker void RenderCase<SampleType>::mapResultsToRenderRateFormat(std::vector<RenderSampleResult<SampleType>> &dst,
4757*35238bceSAndroid Build Coastguard Worker const std::vector<SampleResult> &src) const
4758*35238bceSAndroid Build Coastguard Worker {
4759*35238bceSAndroid Build Coastguard Worker dst.resize(src.size());
4760*35238bceSAndroid Build Coastguard Worker
4761*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)src.size(); ++ndx)
4762*35238bceSAndroid Build Coastguard Worker dst[ndx] = src[ndx].result;
4763*35238bceSAndroid Build Coastguard Worker }
4764*35238bceSAndroid Build Coastguard Worker
4765*35238bceSAndroid Build Coastguard Worker class ReferenceRenderTimeCase : public RenderCase<RenderReadDuration>
4766*35238bceSAndroid Build Coastguard Worker {
4767*35238bceSAndroid Build Coastguard Worker public:
4768*35238bceSAndroid Build Coastguard Worker ReferenceRenderTimeCase(Context &context, const char *name, const char *description, DrawMethod drawMethod);
4769*35238bceSAndroid Build Coastguard Worker
4770*35238bceSAndroid Build Coastguard Worker private:
4771*35238bceSAndroid Build Coastguard Worker void init(void);
4772*35238bceSAndroid Build Coastguard Worker void runSample(SampleResult &sample);
4773*35238bceSAndroid Build Coastguard Worker };
4774*35238bceSAndroid Build Coastguard Worker
ReferenceRenderTimeCase(Context & context,const char * name,const char * description,DrawMethod drawMethod)4775*35238bceSAndroid Build Coastguard Worker ReferenceRenderTimeCase::ReferenceRenderTimeCase(Context &context, const char *name, const char *description,
4776*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod)
4777*35238bceSAndroid Build Coastguard Worker : RenderCase<RenderReadDuration>(context, name, description, drawMethod)
4778*35238bceSAndroid Build Coastguard Worker {
4779*35238bceSAndroid Build Coastguard Worker }
4780*35238bceSAndroid Build Coastguard Worker
init(void)4781*35238bceSAndroid Build Coastguard Worker void ReferenceRenderTimeCase::init(void)
4782*35238bceSAndroid Build Coastguard Worker {
4783*35238bceSAndroid Build Coastguard Worker const char *const targetFunctionName = (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS) ? ("drawArrays") : ("drawElements");
4784*35238bceSAndroid Build Coastguard Worker
4785*35238bceSAndroid Build Coastguard Worker // init parent
4786*35238bceSAndroid Build Coastguard Worker RenderCase<RenderReadDuration>::init();
4787*35238bceSAndroid Build Coastguard Worker
4788*35238bceSAndroid Build Coastguard Worker // log
4789*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Measuring the time used in " << targetFunctionName
4790*35238bceSAndroid Build Coastguard Worker << " and readPixels call with different rendering workloads.\n"
4791*35238bceSAndroid Build Coastguard Worker << getNumSamples() << " test samples. Sample order is randomized.\n"
4792*35238bceSAndroid Build Coastguard Worker << "All samples at even positions (first = 0) are tested before samples at odd positions.\n"
4793*35238bceSAndroid Build Coastguard Worker << "Generated workload is multiple viewport-covering grids with varying number of cells, each "
4794*35238bceSAndroid Build Coastguard Worker "cell is two separate triangles.\n"
4795*35238bceSAndroid Build Coastguard Worker << "Workload sizes are in the range [" << getMinWorkloadSize() << ", " << getMaxWorkloadSize()
4796*35238bceSAndroid Build Coastguard Worker << "] vertices ([" << getHumanReadableByteSize(getMinWorkloadDataSize()) << ","
4797*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(getMaxWorkloadDataSize()) << "] to be processed).\n"
4798*35238bceSAndroid Build Coastguard Worker << "Test result is the approximated total processing rate in MiB / s.\n"
4799*35238bceSAndroid Build Coastguard Worker << ((m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS) ?
4800*35238bceSAndroid Build Coastguard Worker ("Note that index array size is not included in the processed size.\n") :
4801*35238bceSAndroid Build Coastguard Worker (""))
4802*35238bceSAndroid Build Coastguard Worker << "Note! Test result should only be used as a baseline reference result for "
4803*35238bceSAndroid Build Coastguard Worker "buffer.data_upload.* test group results."
4804*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
4805*35238bceSAndroid Build Coastguard Worker }
4806*35238bceSAndroid Build Coastguard Worker
runSample(SampleResult & sample)4807*35238bceSAndroid Build Coastguard Worker void ReferenceRenderTimeCase::runSample(SampleResult &sample)
4808*35238bceSAndroid Build Coastguard Worker {
4809*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4810*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
4811*35238bceSAndroid Build Coastguard Worker const int numVertices = getLayeredGridNumVertices(sample.scene);
4812*35238bceSAndroid Build Coastguard Worker const glu::Buffer arrayBuffer(m_context.getRenderContext());
4813*35238bceSAndroid Build Coastguard Worker const glu::Buffer indexBuffer(m_context.getRenderContext());
4814*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
4815*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> indexData;
4816*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4817*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4818*35238bceSAndroid Build Coastguard Worker
4819*35238bceSAndroid Build Coastguard Worker // generate and upload buffers
4820*35238bceSAndroid Build Coastguard Worker
4821*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, sample.scene);
4822*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
4823*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (int)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0], GL_STATIC_DRAW);
4824*35238bceSAndroid Build Coastguard Worker
4825*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4826*35238bceSAndroid Build Coastguard Worker {
4827*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(indexData, sample.scene);
4828*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
4829*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (int)(indexData.size() * sizeof(uint32_t)), &indexData[0],
4830*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
4831*35238bceSAndroid Build Coastguard Worker }
4832*35238bceSAndroid Build Coastguard Worker
4833*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
4834*35238bceSAndroid Build Coastguard Worker
4835*35238bceSAndroid Build Coastguard Worker // make sure data is uploaded
4836*35238bceSAndroid Build Coastguard Worker
4837*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
4838*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
4839*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4840*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
4841*35238bceSAndroid Build Coastguard Worker else
4842*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
4843*35238bceSAndroid Build Coastguard Worker waitGLResults();
4844*35238bceSAndroid Build Coastguard Worker
4845*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
4846*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
4847*35238bceSAndroid Build Coastguard Worker waitGLResults();
4848*35238bceSAndroid Build Coastguard Worker
4849*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
4850*35238bceSAndroid Build Coastguard Worker
4851*35238bceSAndroid Build Coastguard Worker // Measure both draw and associated readpixels
4852*35238bceSAndroid Build Coastguard Worker {
4853*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4854*35238bceSAndroid Build Coastguard Worker
4855*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
4856*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
4857*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4858*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
4859*35238bceSAndroid Build Coastguard Worker else
4860*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
4861*35238bceSAndroid Build Coastguard Worker
4862*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4863*35238bceSAndroid Build Coastguard Worker
4864*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration = endTime - startTime;
4865*35238bceSAndroid Build Coastguard Worker }
4866*35238bceSAndroid Build Coastguard Worker
4867*35238bceSAndroid Build Coastguard Worker {
4868*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
4869*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
4870*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
4871*35238bceSAndroid Build Coastguard Worker
4872*35238bceSAndroid Build Coastguard Worker sample.result.duration.readDuration = endTime - startTime;
4873*35238bceSAndroid Build Coastguard Worker }
4874*35238bceSAndroid Build Coastguard Worker
4875*35238bceSAndroid Build Coastguard Worker sample.result.renderDataSize = getVertexDataSize() * sample.result.numVertices;
4876*35238bceSAndroid Build Coastguard Worker sample.result.uploadedDataSize = 0;
4877*35238bceSAndroid Build Coastguard Worker sample.result.unrelatedDataSize = 0;
4878*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderReadDuration =
4879*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration + sample.result.duration.readDuration;
4880*35238bceSAndroid Build Coastguard Worker sample.result.duration.totalDuration = sample.result.duration.renderDuration + sample.result.duration.readDuration;
4881*35238bceSAndroid Build Coastguard Worker sample.result.duration.fitResponseDuration = sample.result.duration.renderReadDuration;
4882*35238bceSAndroid Build Coastguard Worker }
4883*35238bceSAndroid Build Coastguard Worker
4884*35238bceSAndroid Build Coastguard Worker class UnrelatedUploadRenderTimeCase : public RenderCase<UnrelatedUploadRenderReadDuration>
4885*35238bceSAndroid Build Coastguard Worker {
4886*35238bceSAndroid Build Coastguard Worker public:
4887*35238bceSAndroid Build Coastguard Worker UnrelatedUploadRenderTimeCase(Context &context, const char *name, const char *description, DrawMethod drawMethod,
4888*35238bceSAndroid Build Coastguard Worker UploadMethod unrelatedUploadMethod);
4889*35238bceSAndroid Build Coastguard Worker
4890*35238bceSAndroid Build Coastguard Worker private:
4891*35238bceSAndroid Build Coastguard Worker void init(void);
4892*35238bceSAndroid Build Coastguard Worker void runSample(SampleResult &sample);
4893*35238bceSAndroid Build Coastguard Worker
4894*35238bceSAndroid Build Coastguard Worker const UploadMethod m_unrelatedUploadMethod;
4895*35238bceSAndroid Build Coastguard Worker };
4896*35238bceSAndroid Build Coastguard Worker
UnrelatedUploadRenderTimeCase(Context & context,const char * name,const char * description,DrawMethod drawMethod,UploadMethod unrelatedUploadMethod)4897*35238bceSAndroid Build Coastguard Worker UnrelatedUploadRenderTimeCase::UnrelatedUploadRenderTimeCase(Context &context, const char *name,
4898*35238bceSAndroid Build Coastguard Worker const char *description, DrawMethod drawMethod,
4899*35238bceSAndroid Build Coastguard Worker UploadMethod unrelatedUploadMethod)
4900*35238bceSAndroid Build Coastguard Worker : RenderCase<UnrelatedUploadRenderReadDuration>(context, name, description, drawMethod)
4901*35238bceSAndroid Build Coastguard Worker , m_unrelatedUploadMethod(unrelatedUploadMethod)
4902*35238bceSAndroid Build Coastguard Worker {
4903*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_unrelatedUploadMethod < UPLOADMETHOD_LAST);
4904*35238bceSAndroid Build Coastguard Worker }
4905*35238bceSAndroid Build Coastguard Worker
init(void)4906*35238bceSAndroid Build Coastguard Worker void UnrelatedUploadRenderTimeCase::init(void)
4907*35238bceSAndroid Build Coastguard Worker {
4908*35238bceSAndroid Build Coastguard Worker const char *const targetFunctionName = (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS) ? ("drawArrays") : ("drawElements");
4909*35238bceSAndroid Build Coastguard Worker tcu::MessageBuilder message(&m_testCtx.getLog());
4910*35238bceSAndroid Build Coastguard Worker
4911*35238bceSAndroid Build Coastguard Worker // init parent
4912*35238bceSAndroid Build Coastguard Worker RenderCase<UnrelatedUploadRenderReadDuration>::init();
4913*35238bceSAndroid Build Coastguard Worker
4914*35238bceSAndroid Build Coastguard Worker // log
4915*35238bceSAndroid Build Coastguard Worker
4916*35238bceSAndroid Build Coastguard Worker message << "Measuring the time used in " << targetFunctionName
4917*35238bceSAndroid Build Coastguard Worker << " and readPixels call with different rendering workloads.\n"
4918*35238bceSAndroid Build Coastguard Worker << "Uploading an unrelated buffer just before issuing the rendering command with "
4919*35238bceSAndroid Build Coastguard Worker << ((m_unrelatedUploadMethod != UPLOADMETHOD_BUFFER_DATA) ? ("bufferData") :
4920*35238bceSAndroid Build Coastguard Worker (m_unrelatedUploadMethod != UPLOADMETHOD_BUFFER_SUB_DATA) ? ("bufferSubData") :
4921*35238bceSAndroid Build Coastguard Worker (m_unrelatedUploadMethod != UPLOADMETHOD_MAP_BUFFER_RANGE) ? ("mapBufferRange") :
4922*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
4923*35238bceSAndroid Build Coastguard Worker << ".\n"
4924*35238bceSAndroid Build Coastguard Worker << getNumSamples() << " test samples. Sample order is randomized.\n"
4925*35238bceSAndroid Build Coastguard Worker << "All samples at even positions (first = 0) are tested before samples at odd positions.\n"
4926*35238bceSAndroid Build Coastguard Worker << "Generated workload is multiple viewport-covering grids with varying number of cells, each cell is two "
4927*35238bceSAndroid Build Coastguard Worker "separate triangles.\n"
4928*35238bceSAndroid Build Coastguard Worker << "Workload sizes are in the range [" << getMinWorkloadSize() << ", " << getMaxWorkloadSize()
4929*35238bceSAndroid Build Coastguard Worker << "] vertices ([" << getHumanReadableByteSize(getMinWorkloadDataSize()) << ","
4930*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(getMaxWorkloadDataSize()) << "] to be processed).\n"
4931*35238bceSAndroid Build Coastguard Worker << "Unrelated upload sizes are in the range [" << getHumanReadableByteSize(getMinWorkloadDataSize()) << ", "
4932*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(getMaxWorkloadDataSize()) << "]\n"
4933*35238bceSAndroid Build Coastguard Worker << "Test result is the approximated total processing rate in MiB / s.\n"
4934*35238bceSAndroid Build Coastguard Worker << ((m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS) ?
4935*35238bceSAndroid Build Coastguard Worker ("Note that index array size is not included in the processed size.\n") :
4936*35238bceSAndroid Build Coastguard Worker (""))
4937*35238bceSAndroid Build Coastguard Worker << "Note that the data size and the time used in the unrelated upload is not included in the results.\n"
4938*35238bceSAndroid Build Coastguard Worker << "Note! Test result may not be useful as is but instead should be compared against the reference.* group "
4939*35238bceSAndroid Build Coastguard Worker "and upload_and_draw.*_and_unrelated_upload group results.\n"
4940*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
4941*35238bceSAndroid Build Coastguard Worker }
4942*35238bceSAndroid Build Coastguard Worker
runSample(SampleResult & sample)4943*35238bceSAndroid Build Coastguard Worker void UnrelatedUploadRenderTimeCase::runSample(SampleResult &sample)
4944*35238bceSAndroid Build Coastguard Worker {
4945*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
4946*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
4947*35238bceSAndroid Build Coastguard Worker const int numVertices = getLayeredGridNumVertices(sample.scene);
4948*35238bceSAndroid Build Coastguard Worker const glu::Buffer arrayBuffer(m_context.getRenderContext());
4949*35238bceSAndroid Build Coastguard Worker const glu::Buffer indexBuffer(m_context.getRenderContext());
4950*35238bceSAndroid Build Coastguard Worker const glu::Buffer unrelatedBuffer(m_context.getRenderContext());
4951*35238bceSAndroid Build Coastguard Worker int unrelatedUploadSize = -1;
4952*35238bceSAndroid Build Coastguard Worker int renderUploadSize;
4953*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
4954*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> indexData;
4955*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
4956*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
4957*35238bceSAndroid Build Coastguard Worker
4958*35238bceSAndroid Build Coastguard Worker // generate and upload buffers
4959*35238bceSAndroid Build Coastguard Worker
4960*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, sample.scene);
4961*35238bceSAndroid Build Coastguard Worker renderUploadSize = (int)(vertexData.size() * sizeof(tcu::Vec4));
4962*35238bceSAndroid Build Coastguard Worker
4963*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
4964*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, renderUploadSize, &vertexData[0], GL_STATIC_DRAW);
4965*35238bceSAndroid Build Coastguard Worker
4966*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4967*35238bceSAndroid Build Coastguard Worker {
4968*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(indexData, sample.scene);
4969*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
4970*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (int)(indexData.size() * sizeof(uint32_t)), &indexData[0],
4971*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
4972*35238bceSAndroid Build Coastguard Worker }
4973*35238bceSAndroid Build Coastguard Worker
4974*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
4975*35238bceSAndroid Build Coastguard Worker
4976*35238bceSAndroid Build Coastguard Worker // make sure data is uploaded
4977*35238bceSAndroid Build Coastguard Worker
4978*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
4979*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
4980*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
4981*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
4982*35238bceSAndroid Build Coastguard Worker else
4983*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
4984*35238bceSAndroid Build Coastguard Worker waitGLResults();
4985*35238bceSAndroid Build Coastguard Worker
4986*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
4987*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
4988*35238bceSAndroid Build Coastguard Worker waitGLResults();
4989*35238bceSAndroid Build Coastguard Worker
4990*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
4991*35238bceSAndroid Build Coastguard Worker
4992*35238bceSAndroid Build Coastguard Worker // Unrelated upload
4993*35238bceSAndroid Build Coastguard Worker if (m_unrelatedUploadMethod == UPLOADMETHOD_BUFFER_DATA)
4994*35238bceSAndroid Build Coastguard Worker {
4995*35238bceSAndroid Build Coastguard Worker unrelatedUploadSize = (int)(vertexData.size() * sizeof(tcu::Vec4));
4996*35238bceSAndroid Build Coastguard Worker
4997*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *unrelatedBuffer);
4998*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, unrelatedUploadSize, &vertexData[0], GL_STATIC_DRAW);
4999*35238bceSAndroid Build Coastguard Worker }
5000*35238bceSAndroid Build Coastguard Worker else if (m_unrelatedUploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA)
5001*35238bceSAndroid Build Coastguard Worker {
5002*35238bceSAndroid Build Coastguard Worker unrelatedUploadSize = (int)(vertexData.size() * sizeof(tcu::Vec4));
5003*35238bceSAndroid Build Coastguard Worker
5004*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *unrelatedBuffer);
5005*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, unrelatedUploadSize, DE_NULL, GL_STATIC_DRAW);
5006*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(GL_ARRAY_BUFFER, 0, unrelatedUploadSize, &vertexData[0]);
5007*35238bceSAndroid Build Coastguard Worker }
5008*35238bceSAndroid Build Coastguard Worker else if (m_unrelatedUploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE)
5009*35238bceSAndroid Build Coastguard Worker {
5010*35238bceSAndroid Build Coastguard Worker void *mapPtr;
5011*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
5012*35238bceSAndroid Build Coastguard Worker
5013*35238bceSAndroid Build Coastguard Worker unrelatedUploadSize = (int)(vertexData.size() * sizeof(tcu::Vec4));
5014*35238bceSAndroid Build Coastguard Worker
5015*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *unrelatedBuffer);
5016*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, unrelatedUploadSize, DE_NULL, GL_STATIC_DRAW);
5017*35238bceSAndroid Build Coastguard Worker
5018*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(GL_ARRAY_BUFFER, 0, unrelatedUploadSize,
5019*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT |
5020*35238bceSAndroid Build Coastguard Worker GL_MAP_UNSYNCHRONIZED_BIT);
5021*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
5022*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
5023*35238bceSAndroid Build Coastguard Worker
5024*35238bceSAndroid Build Coastguard Worker deMemcpy(mapPtr, &vertexData[0], unrelatedUploadSize);
5025*35238bceSAndroid Build Coastguard Worker
5026*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
5027*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(GL_ARRAY_BUFFER);
5028*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
5029*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
5030*35238bceSAndroid Build Coastguard Worker }
5031*35238bceSAndroid Build Coastguard Worker else
5032*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5033*35238bceSAndroid Build Coastguard Worker
5034*35238bceSAndroid Build Coastguard Worker DE_ASSERT(unrelatedUploadSize != -1);
5035*35238bceSAndroid Build Coastguard Worker
5036*35238bceSAndroid Build Coastguard Worker // Measure both draw and associated readpixels
5037*35238bceSAndroid Build Coastguard Worker {
5038*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5039*35238bceSAndroid Build Coastguard Worker
5040*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
5041*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5042*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5043*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5044*35238bceSAndroid Build Coastguard Worker else
5045*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5046*35238bceSAndroid Build Coastguard Worker
5047*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5048*35238bceSAndroid Build Coastguard Worker
5049*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration = endTime - startTime;
5050*35238bceSAndroid Build Coastguard Worker }
5051*35238bceSAndroid Build Coastguard Worker
5052*35238bceSAndroid Build Coastguard Worker {
5053*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5054*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
5055*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5056*35238bceSAndroid Build Coastguard Worker
5057*35238bceSAndroid Build Coastguard Worker sample.result.duration.readDuration = endTime - startTime;
5058*35238bceSAndroid Build Coastguard Worker }
5059*35238bceSAndroid Build Coastguard Worker
5060*35238bceSAndroid Build Coastguard Worker sample.result.renderDataSize = getVertexDataSize() * sample.result.numVertices;
5061*35238bceSAndroid Build Coastguard Worker sample.result.uploadedDataSize = renderUploadSize;
5062*35238bceSAndroid Build Coastguard Worker sample.result.unrelatedDataSize = unrelatedUploadSize;
5063*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderReadDuration =
5064*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration + sample.result.duration.readDuration;
5065*35238bceSAndroid Build Coastguard Worker sample.result.duration.totalDuration = sample.result.duration.renderDuration + sample.result.duration.readDuration;
5066*35238bceSAndroid Build Coastguard Worker sample.result.duration.fitResponseDuration = sample.result.duration.renderReadDuration;
5067*35238bceSAndroid Build Coastguard Worker }
5068*35238bceSAndroid Build Coastguard Worker
5069*35238bceSAndroid Build Coastguard Worker class ReferenceReadPixelsTimeCase : public TestCase
5070*35238bceSAndroid Build Coastguard Worker {
5071*35238bceSAndroid Build Coastguard Worker public:
5072*35238bceSAndroid Build Coastguard Worker ReferenceReadPixelsTimeCase(Context &context, const char *name, const char *description);
5073*35238bceSAndroid Build Coastguard Worker
5074*35238bceSAndroid Build Coastguard Worker private:
5075*35238bceSAndroid Build Coastguard Worker void init(void);
5076*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
5077*35238bceSAndroid Build Coastguard Worker void logAndSetTestResult(void);
5078*35238bceSAndroid Build Coastguard Worker
5079*35238bceSAndroid Build Coastguard Worker enum
5080*35238bceSAndroid Build Coastguard Worker {
5081*35238bceSAndroid Build Coastguard Worker RENDER_AREA_SIZE = 128
5082*35238bceSAndroid Build Coastguard Worker };
5083*35238bceSAndroid Build Coastguard Worker
5084*35238bceSAndroid Build Coastguard Worker const int m_numSamples;
5085*35238bceSAndroid Build Coastguard Worker int m_sampleNdx;
5086*35238bceSAndroid Build Coastguard Worker std::vector<int> m_samples;
5087*35238bceSAndroid Build Coastguard Worker };
5088*35238bceSAndroid Build Coastguard Worker
ReferenceReadPixelsTimeCase(Context & context,const char * name,const char * description)5089*35238bceSAndroid Build Coastguard Worker ReferenceReadPixelsTimeCase::ReferenceReadPixelsTimeCase(Context &context, const char *name, const char *description)
5090*35238bceSAndroid Build Coastguard Worker : TestCase(context, tcu::NODETYPE_PERFORMANCE, name, description)
5091*35238bceSAndroid Build Coastguard Worker , m_numSamples(20)
5092*35238bceSAndroid Build Coastguard Worker , m_sampleNdx(0)
5093*35238bceSAndroid Build Coastguard Worker , m_samples(m_numSamples)
5094*35238bceSAndroid Build Coastguard Worker {
5095*35238bceSAndroid Build Coastguard Worker }
5096*35238bceSAndroid Build Coastguard Worker
init(void)5097*35238bceSAndroid Build Coastguard Worker void ReferenceReadPixelsTimeCase::init(void)
5098*35238bceSAndroid Build Coastguard Worker {
5099*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Measuring the time used in a single readPixels call with "
5100*35238bceSAndroid Build Coastguard Worker << m_numSamples << " test samples.\n"
5101*35238bceSAndroid Build Coastguard Worker << "Test result is the median of the samples in microseconds.\n"
5102*35238bceSAndroid Build Coastguard Worker << "Note! Test result should only be used as a baseline reference result for "
5103*35238bceSAndroid Build Coastguard Worker "buffer.data_upload.* test group results."
5104*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
5105*35238bceSAndroid Build Coastguard Worker }
5106*35238bceSAndroid Build Coastguard Worker
iterate(void)5107*35238bceSAndroid Build Coastguard Worker ReferenceReadPixelsTimeCase::IterateResult ReferenceReadPixelsTimeCase::iterate(void)
5108*35238bceSAndroid Build Coastguard Worker {
5109*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
5110*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
5111*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
5112*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
5113*35238bceSAndroid Build Coastguard Worker
5114*35238bceSAndroid Build Coastguard Worker deYield();
5115*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
5116*35238bceSAndroid Build Coastguard Worker deYield();
5117*35238bceSAndroid Build Coastguard Worker
5118*35238bceSAndroid Build Coastguard Worker // "Render" something and wait for it
5119*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 1.0f, float(m_sampleNdx) / float(m_numSamples), 1.0f);
5120*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
5121*35238bceSAndroid Build Coastguard Worker
5122*35238bceSAndroid Build Coastguard Worker // wait for results
5123*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
5124*35238bceSAndroid Build Coastguard Worker
5125*35238bceSAndroid Build Coastguard Worker // measure time used in readPixels
5126*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5127*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
5128*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5129*35238bceSAndroid Build Coastguard Worker
5130*35238bceSAndroid Build Coastguard Worker m_samples[m_sampleNdx] = (int)(endTime - startTime);
5131*35238bceSAndroid Build Coastguard Worker
5132*35238bceSAndroid Build Coastguard Worker if (++m_sampleNdx < m_numSamples)
5133*35238bceSAndroid Build Coastguard Worker return CONTINUE;
5134*35238bceSAndroid Build Coastguard Worker
5135*35238bceSAndroid Build Coastguard Worker logAndSetTestResult();
5136*35238bceSAndroid Build Coastguard Worker return STOP;
5137*35238bceSAndroid Build Coastguard Worker }
5138*35238bceSAndroid Build Coastguard Worker
logAndSetTestResult(void)5139*35238bceSAndroid Build Coastguard Worker void ReferenceReadPixelsTimeCase::logAndSetTestResult(void)
5140*35238bceSAndroid Build Coastguard Worker {
5141*35238bceSAndroid Build Coastguard Worker // Log sample list
5142*35238bceSAndroid Build Coastguard Worker {
5143*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
5144*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
5145*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
5146*35238bceSAndroid Build Coastguard Worker
5147*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); ++sampleNdx)
5148*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Sample << m_samples[sampleNdx] << tcu::TestLog::EndSample;
5149*35238bceSAndroid Build Coastguard Worker
5150*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::EndSampleList;
5151*35238bceSAndroid Build Coastguard Worker }
5152*35238bceSAndroid Build Coastguard Worker
5153*35238bceSAndroid Build Coastguard Worker // Log median
5154*35238bceSAndroid Build Coastguard Worker {
5155*35238bceSAndroid Build Coastguard Worker float median;
5156*35238bceSAndroid Build Coastguard Worker float limit60Low;
5157*35238bceSAndroid Build Coastguard Worker float limit60Up;
5158*35238bceSAndroid Build Coastguard Worker
5159*35238bceSAndroid Build Coastguard Worker std::sort(m_samples.begin(), m_samples.end());
5160*35238bceSAndroid Build Coastguard Worker median = linearSample(m_samples, 0.5f);
5161*35238bceSAndroid Build Coastguard Worker limit60Low = linearSample(m_samples, 0.2f);
5162*35238bceSAndroid Build Coastguard Worker limit60Up = linearSample(m_samples, 0.8f);
5163*35238bceSAndroid Build Coastguard Worker
5164*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Float("Median", "Median", "us", QP_KEY_TAG_TIME, median)
5165*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "60 % of samples within range:\n"
5166*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage
5167*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("Low60Range", "Lower", "us", QP_KEY_TAG_TIME, limit60Low)
5168*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Float("High60Range", "Upper", "us", QP_KEY_TAG_TIME, limit60Up);
5169*35238bceSAndroid Build Coastguard Worker
5170*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString(median, 2).c_str());
5171*35238bceSAndroid Build Coastguard Worker }
5172*35238bceSAndroid Build Coastguard Worker }
5173*35238bceSAndroid Build Coastguard Worker
5174*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
5175*35238bceSAndroid Build Coastguard Worker class GenericUploadRenderTimeCase : public RenderCase<SampleType>
5176*35238bceSAndroid Build Coastguard Worker {
5177*35238bceSAndroid Build Coastguard Worker public:
5178*35238bceSAndroid Build Coastguard Worker typedef typename RenderCase<SampleType>::SampleResult SampleResult;
5179*35238bceSAndroid Build Coastguard Worker
5180*35238bceSAndroid Build Coastguard Worker GenericUploadRenderTimeCase(Context &context, const char *name, const char *description, DrawMethod method,
5181*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer, UploadMethod uploadMethod, BufferState bufferState,
5182*35238bceSAndroid Build Coastguard Worker UploadRange uploadRange, UnrelatedBufferType unrelatedBufferType);
5183*35238bceSAndroid Build Coastguard Worker
5184*35238bceSAndroid Build Coastguard Worker private:
5185*35238bceSAndroid Build Coastguard Worker void init(void);
5186*35238bceSAndroid Build Coastguard Worker void runSample(SampleResult &sample);
5187*35238bceSAndroid Build Coastguard Worker
5188*35238bceSAndroid Build Coastguard Worker using RenderCase<SampleType>::RENDER_AREA_SIZE;
5189*35238bceSAndroid Build Coastguard Worker
5190*35238bceSAndroid Build Coastguard Worker const TargetBuffer m_targetBuffer;
5191*35238bceSAndroid Build Coastguard Worker const BufferState m_bufferState;
5192*35238bceSAndroid Build Coastguard Worker const UploadMethod m_uploadMethod;
5193*35238bceSAndroid Build Coastguard Worker const UnrelatedBufferType m_unrelatedBufferType;
5194*35238bceSAndroid Build Coastguard Worker const UploadRange m_uploadRange;
5195*35238bceSAndroid Build Coastguard Worker
5196*35238bceSAndroid Build Coastguard Worker using RenderCase<SampleType>::m_context;
5197*35238bceSAndroid Build Coastguard Worker using RenderCase<SampleType>::m_testCtx;
5198*35238bceSAndroid Build Coastguard Worker using RenderCase<SampleType>::m_drawMethod;
5199*35238bceSAndroid Build Coastguard Worker };
5200*35238bceSAndroid Build Coastguard Worker
5201*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
GenericUploadRenderTimeCase(Context & context,const char * name,const char * description,DrawMethod method,TargetBuffer targetBuffer,UploadMethod uploadMethod,BufferState bufferState,UploadRange uploadRange,UnrelatedBufferType unrelatedBufferType)5202*35238bceSAndroid Build Coastguard Worker GenericUploadRenderTimeCase<SampleType>::GenericUploadRenderTimeCase(Context &context, const char *name,
5203*35238bceSAndroid Build Coastguard Worker const char *description, DrawMethod method,
5204*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer,
5205*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod, BufferState bufferState,
5206*35238bceSAndroid Build Coastguard Worker UploadRange uploadRange,
5207*35238bceSAndroid Build Coastguard Worker UnrelatedBufferType unrelatedBufferType)
5208*35238bceSAndroid Build Coastguard Worker : RenderCase<SampleType>(context, name, description, method)
5209*35238bceSAndroid Build Coastguard Worker , m_targetBuffer(targetBuffer)
5210*35238bceSAndroid Build Coastguard Worker , m_bufferState(bufferState)
5211*35238bceSAndroid Build Coastguard Worker , m_uploadMethod(uploadMethod)
5212*35238bceSAndroid Build Coastguard Worker , m_unrelatedBufferType(unrelatedBufferType)
5213*35238bceSAndroid Build Coastguard Worker , m_uploadRange(uploadRange)
5214*35238bceSAndroid Build Coastguard Worker {
5215*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_targetBuffer < TARGETBUFFER_LAST);
5216*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_bufferState < BUFFERSTATE_LAST);
5217*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_uploadMethod < UPLOADMETHOD_LAST);
5218*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_unrelatedBufferType < UNRELATEDBUFFERTYPE_LAST);
5219*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_uploadRange < UPLOADRANGE_LAST);
5220*35238bceSAndroid Build Coastguard Worker }
5221*35238bceSAndroid Build Coastguard Worker
5222*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
init(void)5223*35238bceSAndroid Build Coastguard Worker void GenericUploadRenderTimeCase<SampleType>::init(void)
5224*35238bceSAndroid Build Coastguard Worker {
5225*35238bceSAndroid Build Coastguard Worker // init parent
5226*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::init();
5227*35238bceSAndroid Build Coastguard Worker
5228*35238bceSAndroid Build Coastguard Worker // log
5229*35238bceSAndroid Build Coastguard Worker {
5230*35238bceSAndroid Build Coastguard Worker const char *const targetFunctionName =
5231*35238bceSAndroid Build Coastguard Worker (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS) ? ("drawArrays") : ("drawElements");
5232*35238bceSAndroid Build Coastguard Worker const int perVertexSize =
5233*35238bceSAndroid Build Coastguard Worker (m_targetBuffer == TARGETBUFFER_INDEX) ? ((int)sizeof(uint32_t)) : ((int)sizeof(tcu::Vec4[2]));
5234*35238bceSAndroid Build Coastguard Worker const int fullMinUploadSize = RenderCase<SampleType>::getMinWorkloadSize() * perVertexSize;
5235*35238bceSAndroid Build Coastguard Worker const int fullMaxUploadSize = RenderCase<SampleType>::getMaxWorkloadSize() * perVertexSize;
5236*35238bceSAndroid Build Coastguard Worker const int minUploadSize =
5237*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_FULL) ? (fullMinUploadSize) : (deAlign32(fullMinUploadSize / 2, 4));
5238*35238bceSAndroid Build Coastguard Worker const int maxUploadSize =
5239*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_FULL) ? (fullMaxUploadSize) : (deAlign32(fullMaxUploadSize / 2, 4));
5240*35238bceSAndroid Build Coastguard Worker const int minUnrelatedUploadSize = RenderCase<SampleType>::getMinWorkloadSize() * (int)sizeof(tcu::Vec4[2]);
5241*35238bceSAndroid Build Coastguard Worker const int maxUnrelatedUploadSize = RenderCase<SampleType>::getMaxWorkloadSize() * (int)sizeof(tcu::Vec4[2]);
5242*35238bceSAndroid Build Coastguard Worker
5243*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog()
5244*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Measuring the time used in " << targetFunctionName
5245*35238bceSAndroid Build Coastguard Worker << " and readPixels call with different rendering workloads.\n"
5246*35238bceSAndroid Build Coastguard Worker << "The " << ((m_targetBuffer == TARGETBUFFER_INDEX) ? ("index") : ("vertex attrib")) << " buffer "
5247*35238bceSAndroid Build Coastguard Worker << ((m_bufferState == BUFFERSTATE_NEW) ? ("") : ("contents ")) << "sourced by the rendering command "
5248*35238bceSAndroid Build Coastguard Worker << ((m_bufferState == BUFFERSTATE_NEW) ? ("is uploaded ") :
5249*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_FULL) ? ("are specified ") :
5250*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_PARTIAL) ? ("are updated (partial upload) ") :
5251*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
5252*35238bceSAndroid Build Coastguard Worker << "just before issuing the rendering command.\n"
5253*35238bceSAndroid Build Coastguard Worker << ((m_bufferState == BUFFERSTATE_EXISTING) ? ("The buffer has been used in rendering.\n") :
5254*35238bceSAndroid Build Coastguard Worker ("The buffer is generated just before uploading.\n"))
5255*35238bceSAndroid Build Coastguard Worker << "Buffer "
5256*35238bceSAndroid Build Coastguard Worker << ((m_bufferState == BUFFERSTATE_NEW) ? ("is uploaded") :
5257*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_FULL) ? ("contents are specified") :
5258*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_PARTIAL) ? ("contents are partially updated") :
5259*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
5260*35238bceSAndroid Build Coastguard Worker << " with "
5261*35238bceSAndroid Build Coastguard Worker << ((m_uploadMethod == UPLOADMETHOD_BUFFER_DATA) ? ("bufferData") :
5262*35238bceSAndroid Build Coastguard Worker (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA) ? ("bufferSubData") :
5263*35238bceSAndroid Build Coastguard Worker ("mapBufferRange"))
5264*35238bceSAndroid Build Coastguard Worker << " command. Usage of the target buffer is DYNAMIC_DRAW.\n"
5265*35238bceSAndroid Build Coastguard Worker << ((m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE) ?
5266*35238bceSAndroid Build Coastguard Worker ("Mapping buffer with bits MAP_WRITE_BIT | MAP_INVALIDATE_RANGE_BIT | MAP_INVALIDATE_BUFFER_BIT | "
5267*35238bceSAndroid Build Coastguard Worker "MAP_UNSYNCHRONIZED_BIT\n") :
5268*35238bceSAndroid Build Coastguard Worker (""))
5269*35238bceSAndroid Build Coastguard Worker << ((m_unrelatedBufferType == UNRELATEDBUFFERTYPE_VERTEX) ?
5270*35238bceSAndroid Build Coastguard Worker ("Uploading an unrelated buffer just before issuing the rendering command with bufferData.\n") :
5271*35238bceSAndroid Build Coastguard Worker (""))
5272*35238bceSAndroid Build Coastguard Worker << RenderCase<SampleType>::getNumSamples() << " test samples. Sample order is randomized.\n"
5273*35238bceSAndroid Build Coastguard Worker << "All samples at even positions (first = 0) are tested before samples at odd positions.\n"
5274*35238bceSAndroid Build Coastguard Worker << "Generated workload is multiple viewport-covering grids with varying number of cells, each cell is two "
5275*35238bceSAndroid Build Coastguard Worker "separate triangles.\n"
5276*35238bceSAndroid Build Coastguard Worker << "Workload sizes are in the range [" << RenderCase<SampleType>::getMinWorkloadSize() << ", "
5277*35238bceSAndroid Build Coastguard Worker << RenderCase<SampleType>::getMaxWorkloadSize() << "] vertices "
5278*35238bceSAndroid Build Coastguard Worker << "([" << getHumanReadableByteSize(RenderCase<SampleType>::getMinWorkloadDataSize()) << ","
5279*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(RenderCase<SampleType>::getMaxWorkloadDataSize()) << "] to be processed).\n"
5280*35238bceSAndroid Build Coastguard Worker << "Upload sizes are in the range [" << getHumanReadableByteSize(minUploadSize) << ","
5281*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(maxUploadSize) << "].\n"
5282*35238bceSAndroid Build Coastguard Worker << ((m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS) ?
5283*35238bceSAndroid Build Coastguard Worker ("Unrelated upload sizes are in the range [" + getHumanReadableByteSize(minUnrelatedUploadSize) +
5284*35238bceSAndroid Build Coastguard Worker ", " + getHumanReadableByteSize(maxUnrelatedUploadSize) + "]\n") :
5285*35238bceSAndroid Build Coastguard Worker (""))
5286*35238bceSAndroid Build Coastguard Worker << "Test result is the approximated processing rate in MiB / s.\n"
5287*35238bceSAndroid Build Coastguard Worker << "Note that while upload time is measured, the time used is not included in the results.\n"
5288*35238bceSAndroid Build Coastguard Worker << ((m_unrelatedBufferType == UNRELATEDBUFFERTYPE_VERTEX) ?
5289*35238bceSAndroid Build Coastguard Worker ("Note that the data size and the time used in the unrelated upload is not included in the "
5290*35238bceSAndroid Build Coastguard Worker "results.\n") :
5291*35238bceSAndroid Build Coastguard Worker (""))
5292*35238bceSAndroid Build Coastguard Worker << ((m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS) ?
5293*35238bceSAndroid Build Coastguard Worker ("Note that index array size is not included in the processed size.\n") :
5294*35238bceSAndroid Build Coastguard Worker (""))
5295*35238bceSAndroid Build Coastguard Worker << "Note! Test result may not be useful as is but instead should be compared against the reference.* group "
5296*35238bceSAndroid Build Coastguard Worker "and other upload_and_draw.* group results.\n"
5297*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
5298*35238bceSAndroid Build Coastguard Worker }
5299*35238bceSAndroid Build Coastguard Worker }
5300*35238bceSAndroid Build Coastguard Worker
5301*35238bceSAndroid Build Coastguard Worker template <typename SampleType>
runSample(SampleResult & sample)5302*35238bceSAndroid Build Coastguard Worker void GenericUploadRenderTimeCase<SampleType>::runSample(SampleResult &sample)
5303*35238bceSAndroid Build Coastguard Worker {
5304*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
5305*35238bceSAndroid Build Coastguard Worker const glu::Buffer arrayBuffer(m_context.getRenderContext());
5306*35238bceSAndroid Build Coastguard Worker const glu::Buffer indexBuffer(m_context.getRenderContext());
5307*35238bceSAndroid Build Coastguard Worker const glu::Buffer unrelatedBuffer(m_context.getRenderContext());
5308*35238bceSAndroid Build Coastguard Worker const int numVertices = getLayeredGridNumVertices(sample.scene);
5309*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
5310*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
5311*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
5312*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
5313*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> indexData;
5314*35238bceSAndroid Build Coastguard Worker
5315*35238bceSAndroid Build Coastguard Worker // create data
5316*35238bceSAndroid Build Coastguard Worker
5317*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, sample.scene);
5318*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5319*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(indexData, sample.scene);
5320*35238bceSAndroid Build Coastguard Worker
5321*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
5322*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
5323*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::setupVertexAttribs();
5324*35238bceSAndroid Build Coastguard Worker
5325*35238bceSAndroid Build Coastguard Worker // target should be an exisiting buffer? Draw from it once to make sure it exists on the gpu
5326*35238bceSAndroid Build Coastguard Worker
5327*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS && m_bufferState == BUFFERSTATE_EXISTING)
5328*35238bceSAndroid Build Coastguard Worker {
5329*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5330*35238bceSAndroid Build Coastguard Worker GL_DYNAMIC_DRAW);
5331*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5332*35238bceSAndroid Build Coastguard Worker }
5333*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS && m_bufferState == BUFFERSTATE_NEW)
5334*35238bceSAndroid Build Coastguard Worker {
5335*35238bceSAndroid Build Coastguard Worker // do not touch the vertex buffer
5336*35238bceSAndroid Build Coastguard Worker }
5337*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS && m_bufferState == BUFFERSTATE_EXISTING)
5338*35238bceSAndroid Build Coastguard Worker {
5339*35238bceSAndroid Build Coastguard Worker // hint that the target buffer will be modified soon
5340*35238bceSAndroid Build Coastguard Worker const glw::GLenum vertexDataUsage =
5341*35238bceSAndroid Build Coastguard Worker (m_targetBuffer == TARGETBUFFER_VERTEX) ? (GL_DYNAMIC_DRAW) : (GL_STATIC_DRAW);
5342*35238bceSAndroid Build Coastguard Worker const glw::GLenum indexDataUsage =
5343*35238bceSAndroid Build Coastguard Worker (m_targetBuffer == TARGETBUFFER_INDEX) ? (GL_DYNAMIC_DRAW) : (GL_STATIC_DRAW);
5344*35238bceSAndroid Build Coastguard Worker
5345*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5346*35238bceSAndroid Build Coastguard Worker vertexDataUsage);
5347*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t)), &indexData[0],
5348*35238bceSAndroid Build Coastguard Worker indexDataUsage);
5349*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5350*35238bceSAndroid Build Coastguard Worker }
5351*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS && m_bufferState == BUFFERSTATE_NEW)
5352*35238bceSAndroid Build Coastguard Worker {
5353*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
5354*35238bceSAndroid Build Coastguard Worker {
5355*35238bceSAndroid Build Coastguard Worker // make the index buffer present on the gpu
5356*35238bceSAndroid Build Coastguard Worker // use another vertex buffer to keep original buffer in unused state
5357*35238bceSAndroid Build Coastguard Worker const glu::Buffer vertexCopyBuffer(m_context.getRenderContext());
5358*35238bceSAndroid Build Coastguard Worker
5359*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *vertexCopyBuffer);
5360*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::setupVertexAttribs();
5361*35238bceSAndroid Build Coastguard Worker
5362*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5363*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
5364*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t)),
5365*35238bceSAndroid Build Coastguard Worker &indexData[0], GL_STATIC_DRAW);
5366*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5367*35238bceSAndroid Build Coastguard Worker
5368*35238bceSAndroid Build Coastguard Worker // restore original state
5369*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
5370*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::setupVertexAttribs();
5371*35238bceSAndroid Build Coastguard Worker }
5372*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
5373*35238bceSAndroid Build Coastguard Worker {
5374*35238bceSAndroid Build Coastguard Worker // make the vertex buffer present on the gpu
5375*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5376*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
5377*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5378*35238bceSAndroid Build Coastguard Worker }
5379*35238bceSAndroid Build Coastguard Worker else
5380*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5381*35238bceSAndroid Build Coastguard Worker }
5382*35238bceSAndroid Build Coastguard Worker else
5383*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5384*35238bceSAndroid Build Coastguard Worker
5385*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::waitGLResults();
5386*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "post buffer prepare");
5387*35238bceSAndroid Build Coastguard Worker
5388*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
5389*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
5390*35238bceSAndroid Build Coastguard Worker RenderCase<SampleType>::waitGLResults();
5391*35238bceSAndroid Build Coastguard Worker
5392*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
5393*35238bceSAndroid Build Coastguard Worker
5394*35238bceSAndroid Build Coastguard Worker // upload
5395*35238bceSAndroid Build Coastguard Worker
5396*35238bceSAndroid Build Coastguard Worker {
5397*35238bceSAndroid Build Coastguard Worker glw::GLenum target;
5398*35238bceSAndroid Build Coastguard Worker glw::GLsizeiptr size;
5399*35238bceSAndroid Build Coastguard Worker glw::GLintptr offset = 0;
5400*35238bceSAndroid Build Coastguard Worker const void *source;
5401*35238bceSAndroid Build Coastguard Worker
5402*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX && m_uploadRange == UPLOADRANGE_FULL)
5403*35238bceSAndroid Build Coastguard Worker {
5404*35238bceSAndroid Build Coastguard Worker target = GL_ARRAY_BUFFER;
5405*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4));
5406*35238bceSAndroid Build Coastguard Worker source = &vertexData[0];
5407*35238bceSAndroid Build Coastguard Worker }
5408*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX && m_uploadRange == UPLOADRANGE_FULL)
5409*35238bceSAndroid Build Coastguard Worker {
5410*35238bceSAndroid Build Coastguard Worker target = GL_ELEMENT_ARRAY_BUFFER;
5411*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t));
5412*35238bceSAndroid Build Coastguard Worker source = &indexData[0];
5413*35238bceSAndroid Build Coastguard Worker }
5414*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_VERTEX && m_uploadRange == UPLOADRANGE_PARTIAL)
5415*35238bceSAndroid Build Coastguard Worker {
5416*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_bufferState == BUFFERSTATE_EXISTING);
5417*35238bceSAndroid Build Coastguard Worker
5418*35238bceSAndroid Build Coastguard Worker target = GL_ARRAY_BUFFER;
5419*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)deAlign32((int)(vertexData.size() * sizeof(tcu::Vec4)) / 2, 4);
5420*35238bceSAndroid Build Coastguard Worker offset = (glw::GLintptr)deAlign32((int)size / 2, 4);
5421*35238bceSAndroid Build Coastguard Worker source = (const uint8_t *)&vertexData[0] + offset;
5422*35238bceSAndroid Build Coastguard Worker }
5423*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX && m_uploadRange == UPLOADRANGE_PARTIAL)
5424*35238bceSAndroid Build Coastguard Worker {
5425*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_bufferState == BUFFERSTATE_EXISTING);
5426*35238bceSAndroid Build Coastguard Worker
5427*35238bceSAndroid Build Coastguard Worker // upload to 25% - 75% range
5428*35238bceSAndroid Build Coastguard Worker target = GL_ELEMENT_ARRAY_BUFFER;
5429*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)deAlign32((int32_t)(indexData.size() * sizeof(uint32_t)) / 2, 4);
5430*35238bceSAndroid Build Coastguard Worker offset = (glw::GLintptr)deAlign32((int)size / 2, 4);
5431*35238bceSAndroid Build Coastguard Worker source = (const uint8_t *)&indexData[0] + offset;
5432*35238bceSAndroid Build Coastguard Worker }
5433*35238bceSAndroid Build Coastguard Worker else
5434*35238bceSAndroid Build Coastguard Worker {
5435*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5436*35238bceSAndroid Build Coastguard Worker return;
5437*35238bceSAndroid Build Coastguard Worker }
5438*35238bceSAndroid Build Coastguard Worker
5439*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5440*35238bceSAndroid Build Coastguard Worker
5441*35238bceSAndroid Build Coastguard Worker if (m_uploadMethod == UPLOADMETHOD_BUFFER_DATA)
5442*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, source, GL_DYNAMIC_DRAW);
5443*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA)
5444*35238bceSAndroid Build Coastguard Worker {
5445*35238bceSAndroid Build Coastguard Worker // create buffer storage
5446*35238bceSAndroid Build Coastguard Worker if (m_bufferState == BUFFERSTATE_NEW)
5447*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, DE_NULL, GL_DYNAMIC_DRAW);
5448*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(target, offset, size, source);
5449*35238bceSAndroid Build Coastguard Worker }
5450*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE)
5451*35238bceSAndroid Build Coastguard Worker {
5452*35238bceSAndroid Build Coastguard Worker void *mapPtr;
5453*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
5454*35238bceSAndroid Build Coastguard Worker
5455*35238bceSAndroid Build Coastguard Worker // create buffer storage
5456*35238bceSAndroid Build Coastguard Worker if (m_bufferState == BUFFERSTATE_NEW)
5457*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, DE_NULL, GL_DYNAMIC_DRAW);
5458*35238bceSAndroid Build Coastguard Worker
5459*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(target, offset, size,
5460*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT |
5461*35238bceSAndroid Build Coastguard Worker GL_MAP_UNSYNCHRONIZED_BIT);
5462*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
5463*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
5464*35238bceSAndroid Build Coastguard Worker
5465*35238bceSAndroid Build Coastguard Worker deMemcpy(mapPtr, source, (int)size);
5466*35238bceSAndroid Build Coastguard Worker
5467*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
5468*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(target);
5469*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
5470*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
5471*35238bceSAndroid Build Coastguard Worker }
5472*35238bceSAndroid Build Coastguard Worker else
5473*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5474*35238bceSAndroid Build Coastguard Worker
5475*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5476*35238bceSAndroid Build Coastguard Worker
5477*35238bceSAndroid Build Coastguard Worker sample.result.uploadedDataSize = (int)size;
5478*35238bceSAndroid Build Coastguard Worker sample.result.duration.uploadDuration = endTime - startTime;
5479*35238bceSAndroid Build Coastguard Worker }
5480*35238bceSAndroid Build Coastguard Worker
5481*35238bceSAndroid Build Coastguard Worker // unrelated
5482*35238bceSAndroid Build Coastguard Worker if (m_unrelatedBufferType == UNRELATEDBUFFERTYPE_VERTEX)
5483*35238bceSAndroid Build Coastguard Worker {
5484*35238bceSAndroid Build Coastguard Worker const int unrelatedUploadSize = (int)(vertexData.size() * sizeof(tcu::Vec4));
5485*35238bceSAndroid Build Coastguard Worker
5486*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *unrelatedBuffer);
5487*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, unrelatedUploadSize, &vertexData[0], GL_STATIC_DRAW);
5488*35238bceSAndroid Build Coastguard Worker // Attibute pointers are not modified, no need restore state
5489*35238bceSAndroid Build Coastguard Worker
5490*35238bceSAndroid Build Coastguard Worker sample.result.unrelatedDataSize = unrelatedUploadSize;
5491*35238bceSAndroid Build Coastguard Worker }
5492*35238bceSAndroid Build Coastguard Worker
5493*35238bceSAndroid Build Coastguard Worker // draw
5494*35238bceSAndroid Build Coastguard Worker {
5495*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5496*35238bceSAndroid Build Coastguard Worker
5497*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
5498*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5499*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5500*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5501*35238bceSAndroid Build Coastguard Worker else
5502*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5503*35238bceSAndroid Build Coastguard Worker
5504*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5505*35238bceSAndroid Build Coastguard Worker
5506*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration = endTime - startTime;
5507*35238bceSAndroid Build Coastguard Worker }
5508*35238bceSAndroid Build Coastguard Worker
5509*35238bceSAndroid Build Coastguard Worker // read
5510*35238bceSAndroid Build Coastguard Worker {
5511*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5512*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
5513*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5514*35238bceSAndroid Build Coastguard Worker
5515*35238bceSAndroid Build Coastguard Worker sample.result.duration.readDuration = endTime - startTime;
5516*35238bceSAndroid Build Coastguard Worker }
5517*35238bceSAndroid Build Coastguard Worker
5518*35238bceSAndroid Build Coastguard Worker // set results
5519*35238bceSAndroid Build Coastguard Worker
5520*35238bceSAndroid Build Coastguard Worker sample.result.renderDataSize = RenderCase<SampleType>::getVertexDataSize() * sample.result.numVertices;
5521*35238bceSAndroid Build Coastguard Worker
5522*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderReadDuration =
5523*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration + sample.result.duration.readDuration;
5524*35238bceSAndroid Build Coastguard Worker sample.result.duration.totalDuration = sample.result.duration.uploadDuration +
5525*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderDuration + sample.result.duration.readDuration;
5526*35238bceSAndroid Build Coastguard Worker sample.result.duration.fitResponseDuration = sample.result.duration.renderReadDuration;
5527*35238bceSAndroid Build Coastguard Worker }
5528*35238bceSAndroid Build Coastguard Worker
5529*35238bceSAndroid Build Coastguard Worker class BufferInUseRenderTimeCase : public RenderCase<RenderUploadRenderReadDuration>
5530*35238bceSAndroid Build Coastguard Worker {
5531*35238bceSAndroid Build Coastguard Worker public:
5532*35238bceSAndroid Build Coastguard Worker enum MapFlags
5533*35238bceSAndroid Build Coastguard Worker {
5534*35238bceSAndroid Build Coastguard Worker MAPFLAG_NONE = 0,
5535*35238bceSAndroid Build Coastguard Worker MAPFLAG_INVALIDATE_BUFFER,
5536*35238bceSAndroid Build Coastguard Worker MAPFLAG_INVALIDATE_RANGE,
5537*35238bceSAndroid Build Coastguard Worker
5538*35238bceSAndroid Build Coastguard Worker MAPFLAG_LAST
5539*35238bceSAndroid Build Coastguard Worker };
5540*35238bceSAndroid Build Coastguard Worker enum UploadBufferTarget
5541*35238bceSAndroid Build Coastguard Worker {
5542*35238bceSAndroid Build Coastguard Worker UPLOADBUFFERTARGET_DIFFERENT_BUFFER = 0,
5543*35238bceSAndroid Build Coastguard Worker UPLOADBUFFERTARGET_SAME_BUFFER,
5544*35238bceSAndroid Build Coastguard Worker
5545*35238bceSAndroid Build Coastguard Worker UPLOADBUFFERTARGET_LAST
5546*35238bceSAndroid Build Coastguard Worker };
5547*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase(Context &context, const char *name, const char *description, DrawMethod method,
5548*35238bceSAndroid Build Coastguard Worker MapFlags mapFlags, TargetBuffer targetBuffer, UploadMethod uploadMethod,
5549*35238bceSAndroid Build Coastguard Worker UploadRange uploadRange, UploadBufferTarget uploadTarget);
5550*35238bceSAndroid Build Coastguard Worker
5551*35238bceSAndroid Build Coastguard Worker private:
5552*35238bceSAndroid Build Coastguard Worker void init(void);
5553*35238bceSAndroid Build Coastguard Worker void runSample(SampleResult &sample);
5554*35238bceSAndroid Build Coastguard Worker
5555*35238bceSAndroid Build Coastguard Worker const TargetBuffer m_targetBuffer;
5556*35238bceSAndroid Build Coastguard Worker const UploadMethod m_uploadMethod;
5557*35238bceSAndroid Build Coastguard Worker const UploadRange m_uploadRange;
5558*35238bceSAndroid Build Coastguard Worker const MapFlags m_mapFlags;
5559*35238bceSAndroid Build Coastguard Worker const UploadBufferTarget m_uploadBufferTarget;
5560*35238bceSAndroid Build Coastguard Worker };
5561*35238bceSAndroid Build Coastguard Worker
BufferInUseRenderTimeCase(Context & context,const char * name,const char * description,DrawMethod method,MapFlags mapFlags,TargetBuffer targetBuffer,UploadMethod uploadMethod,UploadRange uploadRange,UploadBufferTarget uploadTarget)5562*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::BufferInUseRenderTimeCase(Context &context, const char *name, const char *description,
5563*35238bceSAndroid Build Coastguard Worker DrawMethod method, MapFlags mapFlags, TargetBuffer targetBuffer,
5564*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod, UploadRange uploadRange,
5565*35238bceSAndroid Build Coastguard Worker UploadBufferTarget uploadTarget)
5566*35238bceSAndroid Build Coastguard Worker : RenderCase<RenderUploadRenderReadDuration>(context, name, description, method)
5567*35238bceSAndroid Build Coastguard Worker , m_targetBuffer(targetBuffer)
5568*35238bceSAndroid Build Coastguard Worker , m_uploadMethod(uploadMethod)
5569*35238bceSAndroid Build Coastguard Worker , m_uploadRange(uploadRange)
5570*35238bceSAndroid Build Coastguard Worker , m_mapFlags(mapFlags)
5571*35238bceSAndroid Build Coastguard Worker , m_uploadBufferTarget(uploadTarget)
5572*35238bceSAndroid Build Coastguard Worker {
5573*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_targetBuffer < TARGETBUFFER_LAST);
5574*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_uploadMethod < UPLOADMETHOD_LAST);
5575*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_uploadRange < UPLOADRANGE_LAST);
5576*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_mapFlags < MAPFLAG_LAST);
5577*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_uploadBufferTarget < UPLOADBUFFERTARGET_LAST);
5578*35238bceSAndroid Build Coastguard Worker }
5579*35238bceSAndroid Build Coastguard Worker
init(void)5580*35238bceSAndroid Build Coastguard Worker void BufferInUseRenderTimeCase::init(void)
5581*35238bceSAndroid Build Coastguard Worker {
5582*35238bceSAndroid Build Coastguard Worker RenderCase<RenderUploadRenderReadDuration>::init();
5583*35238bceSAndroid Build Coastguard Worker
5584*35238bceSAndroid Build Coastguard Worker // log
5585*35238bceSAndroid Build Coastguard Worker {
5586*35238bceSAndroid Build Coastguard Worker const char *const targetFunctionName =
5587*35238bceSAndroid Build Coastguard Worker (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS) ? ("drawArrays") : ("drawElements");
5588*35238bceSAndroid Build Coastguard Worker const char *const uploadFunctionName = (m_uploadMethod == UPLOADMETHOD_BUFFER_DATA) ? ("bufferData") :
5589*35238bceSAndroid Build Coastguard Worker (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA) ? ("bufferSubData") :
5590*35238bceSAndroid Build Coastguard Worker ("mapBufferRange");
5591*35238bceSAndroid Build Coastguard Worker const bool isReferenceCase = (m_uploadBufferTarget == UPLOADBUFFERTARGET_DIFFERENT_BUFFER);
5592*35238bceSAndroid Build Coastguard Worker tcu::MessageBuilder message(&m_testCtx.getLog());
5593*35238bceSAndroid Build Coastguard Worker
5594*35238bceSAndroid Build Coastguard Worker message << "Measuring the time used in " << targetFunctionName << " call, a buffer upload, "
5595*35238bceSAndroid Build Coastguard Worker << targetFunctionName
5596*35238bceSAndroid Build Coastguard Worker << " call using the uploaded buffer and readPixels call with different upload sizes.\n";
5597*35238bceSAndroid Build Coastguard Worker
5598*35238bceSAndroid Build Coastguard Worker if (isReferenceCase)
5599*35238bceSAndroid Build Coastguard Worker message << "Rendering:\n"
5600*35238bceSAndroid Build Coastguard Worker << " before test: create and use buffers B and C\n"
5601*35238bceSAndroid Build Coastguard Worker << " first draw: render using buffer B\n"
5602*35238bceSAndroid Build Coastguard Worker << ((m_uploadRange == UPLOADRANGE_FULL) ? (" upload: respecify buffer C contents\n") :
5603*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_PARTIAL) ? (" upload: modify buffer C contents\n") :
5604*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
5605*35238bceSAndroid Build Coastguard Worker << " second draw: render using buffer C\n"
5606*35238bceSAndroid Build Coastguard Worker << " read: readPixels\n";
5607*35238bceSAndroid Build Coastguard Worker else
5608*35238bceSAndroid Build Coastguard Worker message << "Rendering:\n"
5609*35238bceSAndroid Build Coastguard Worker << " before test: create and use buffer B\n"
5610*35238bceSAndroid Build Coastguard Worker << " first draw: render using buffer B\n"
5611*35238bceSAndroid Build Coastguard Worker << ((m_uploadRange == UPLOADRANGE_FULL) ? (" upload: respecify buffer B contents\n") :
5612*35238bceSAndroid Build Coastguard Worker (m_uploadRange == UPLOADRANGE_PARTIAL) ? (" upload: modify buffer B contents\n") :
5613*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
5614*35238bceSAndroid Build Coastguard Worker << " second draw: render using buffer B\n"
5615*35238bceSAndroid Build Coastguard Worker << " read: readPixels\n";
5616*35238bceSAndroid Build Coastguard Worker
5617*35238bceSAndroid Build Coastguard Worker message << "Uploading using " << uploadFunctionName
5618*35238bceSAndroid Build Coastguard Worker << ((m_mapFlags == MAPFLAG_INVALIDATE_RANGE) ? (", flags = MAP_WRITE_BIT | MAP_INVALIDATE_RANGE_BIT") :
5619*35238bceSAndroid Build Coastguard Worker (m_mapFlags == MAPFLAG_INVALIDATE_BUFFER) ?
5620*35238bceSAndroid Build Coastguard Worker (", flags = MAP_WRITE_BIT | MAP_INVALIDATE_BUFFER_BIT") :
5621*35238bceSAndroid Build Coastguard Worker (m_mapFlags == MAPFLAG_NONE) ? ("") :
5622*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
5623*35238bceSAndroid Build Coastguard Worker << "\n"
5624*35238bceSAndroid Build Coastguard Worker << getNumSamples() << " test samples. Sample order is randomized.\n"
5625*35238bceSAndroid Build Coastguard Worker << "All samples at even positions (first = 0) are tested before samples at odd positions.\n"
5626*35238bceSAndroid Build Coastguard Worker << "Workload sizes are in the range [" << getMinWorkloadSize() << ", " << getMaxWorkloadSize()
5627*35238bceSAndroid Build Coastguard Worker << "] vertices "
5628*35238bceSAndroid Build Coastguard Worker << "([" << getHumanReadableByteSize(getMinWorkloadDataSize()) << ","
5629*35238bceSAndroid Build Coastguard Worker << getHumanReadableByteSize(getMaxWorkloadDataSize()) << "] to be processed).\n"
5630*35238bceSAndroid Build Coastguard Worker << "Test result is the approximated processing rate in MiB / s of the second draw call and the "
5631*35238bceSAndroid Build Coastguard Worker "readPixels call.\n";
5632*35238bceSAndroid Build Coastguard Worker
5633*35238bceSAndroid Build Coastguard Worker if (isReferenceCase)
5634*35238bceSAndroid Build Coastguard Worker message << "Note! Test result should only be used as a baseline reference result for "
5635*35238bceSAndroid Build Coastguard Worker "buffer.render_after_upload.draw_modify_draw test group results.";
5636*35238bceSAndroid Build Coastguard Worker else
5637*35238bceSAndroid Build Coastguard Worker message << "Note! Test result may not be useful as is but instead should be compared against the "
5638*35238bceSAndroid Build Coastguard Worker "buffer.render_after_upload.reference.draw_upload_draw group results.\n";
5639*35238bceSAndroid Build Coastguard Worker
5640*35238bceSAndroid Build Coastguard Worker message << tcu::TestLog::EndMessage;
5641*35238bceSAndroid Build Coastguard Worker }
5642*35238bceSAndroid Build Coastguard Worker }
5643*35238bceSAndroid Build Coastguard Worker
runSample(SampleResult & sample)5644*35238bceSAndroid Build Coastguard Worker void BufferInUseRenderTimeCase::runSample(SampleResult &sample)
5645*35238bceSAndroid Build Coastguard Worker {
5646*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
5647*35238bceSAndroid Build Coastguard Worker const glu::Buffer arrayBuffer(m_context.getRenderContext());
5648*35238bceSAndroid Build Coastguard Worker const glu::Buffer indexBuffer(m_context.getRenderContext());
5649*35238bceSAndroid Build Coastguard Worker const glu::Buffer alternativeUploadBuffer(m_context.getRenderContext());
5650*35238bceSAndroid Build Coastguard Worker const int numVertices = getLayeredGridNumVertices(sample.scene);
5651*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
5652*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
5653*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
5654*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
5655*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> indexData;
5656*35238bceSAndroid Build Coastguard Worker
5657*35238bceSAndroid Build Coastguard Worker // create data
5658*35238bceSAndroid Build Coastguard Worker
5659*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, sample.scene);
5660*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5661*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(indexData, sample.scene);
5662*35238bceSAndroid Build Coastguard Worker
5663*35238bceSAndroid Build Coastguard Worker // make buffers used
5664*35238bceSAndroid Build Coastguard Worker
5665*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
5666*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
5667*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
5668*35238bceSAndroid Build Coastguard Worker
5669*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
5670*35238bceSAndroid Build Coastguard Worker {
5671*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5672*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW);
5673*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5674*35238bceSAndroid Build Coastguard Worker }
5675*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5676*35238bceSAndroid Build Coastguard Worker {
5677*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5678*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW);
5679*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t)), &indexData[0],
5680*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW);
5681*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5682*35238bceSAndroid Build Coastguard Worker }
5683*35238bceSAndroid Build Coastguard Worker else
5684*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5685*35238bceSAndroid Build Coastguard Worker
5686*35238bceSAndroid Build Coastguard Worker // another pair of buffers for reference case
5687*35238bceSAndroid Build Coastguard Worker if (m_uploadBufferTarget == UPLOADBUFFERTARGET_DIFFERENT_BUFFER)
5688*35238bceSAndroid Build Coastguard Worker {
5689*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
5690*35238bceSAndroid Build Coastguard Worker {
5691*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *alternativeUploadBuffer);
5692*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4)), &vertexData[0],
5693*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW);
5694*35238bceSAndroid Build Coastguard Worker
5695*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
5696*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5697*35238bceSAndroid Build Coastguard Worker }
5698*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
5699*35238bceSAndroid Build Coastguard Worker {
5700*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *alternativeUploadBuffer);
5701*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t)),
5702*35238bceSAndroid Build Coastguard Worker &indexData[0], GL_STREAM_DRAW);
5703*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5704*35238bceSAndroid Build Coastguard Worker }
5705*35238bceSAndroid Build Coastguard Worker else
5706*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5707*35238bceSAndroid Build Coastguard Worker
5708*35238bceSAndroid Build Coastguard Worker // restore state
5709*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *arrayBuffer);
5710*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer);
5711*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
5712*35238bceSAndroid Build Coastguard Worker }
5713*35238bceSAndroid Build Coastguard Worker
5714*35238bceSAndroid Build Coastguard Worker waitGLResults();
5715*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "post buffer prepare");
5716*35238bceSAndroid Build Coastguard Worker
5717*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
5718*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
5719*35238bceSAndroid Build Coastguard Worker waitGLResults();
5720*35238bceSAndroid Build Coastguard Worker
5721*35238bceSAndroid Build Coastguard Worker tcu::warmupCPU();
5722*35238bceSAndroid Build Coastguard Worker
5723*35238bceSAndroid Build Coastguard Worker // first draw
5724*35238bceSAndroid Build Coastguard Worker {
5725*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5726*35238bceSAndroid Build Coastguard Worker
5727*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
5728*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5729*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5730*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5731*35238bceSAndroid Build Coastguard Worker else
5732*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5733*35238bceSAndroid Build Coastguard Worker
5734*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5735*35238bceSAndroid Build Coastguard Worker
5736*35238bceSAndroid Build Coastguard Worker sample.result.duration.firstRenderDuration = endTime - startTime;
5737*35238bceSAndroid Build Coastguard Worker }
5738*35238bceSAndroid Build Coastguard Worker
5739*35238bceSAndroid Build Coastguard Worker // upload
5740*35238bceSAndroid Build Coastguard Worker {
5741*35238bceSAndroid Build Coastguard Worker glw::GLenum target;
5742*35238bceSAndroid Build Coastguard Worker glw::GLsizeiptr size;
5743*35238bceSAndroid Build Coastguard Worker glw::GLintptr offset = 0;
5744*35238bceSAndroid Build Coastguard Worker const void *source;
5745*35238bceSAndroid Build Coastguard Worker
5746*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX && m_uploadRange == UPLOADRANGE_FULL)
5747*35238bceSAndroid Build Coastguard Worker {
5748*35238bceSAndroid Build Coastguard Worker target = GL_ARRAY_BUFFER;
5749*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(vertexData.size() * sizeof(tcu::Vec4));
5750*35238bceSAndroid Build Coastguard Worker source = &vertexData[0];
5751*35238bceSAndroid Build Coastguard Worker }
5752*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX && m_uploadRange == UPLOADRANGE_FULL)
5753*35238bceSAndroid Build Coastguard Worker {
5754*35238bceSAndroid Build Coastguard Worker target = GL_ELEMENT_ARRAY_BUFFER;
5755*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(indexData.size() * sizeof(uint32_t));
5756*35238bceSAndroid Build Coastguard Worker source = &indexData[0];
5757*35238bceSAndroid Build Coastguard Worker }
5758*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_VERTEX && m_uploadRange == UPLOADRANGE_PARTIAL)
5759*35238bceSAndroid Build Coastguard Worker {
5760*35238bceSAndroid Build Coastguard Worker target = GL_ARRAY_BUFFER;
5761*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)deAlign32((int)(vertexData.size() * sizeof(tcu::Vec4)) / 2, 4);
5762*35238bceSAndroid Build Coastguard Worker offset = (glw::GLintptr)deAlign32((int)size / 2, 4);
5763*35238bceSAndroid Build Coastguard Worker source = (const uint8_t *)&vertexData[0] + offset;
5764*35238bceSAndroid Build Coastguard Worker }
5765*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX && m_uploadRange == UPLOADRANGE_PARTIAL)
5766*35238bceSAndroid Build Coastguard Worker {
5767*35238bceSAndroid Build Coastguard Worker // upload to 25% - 75% range
5768*35238bceSAndroid Build Coastguard Worker target = GL_ELEMENT_ARRAY_BUFFER;
5769*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)deAlign32((int32_t)(indexData.size() * sizeof(uint32_t)) / 2, 4);
5770*35238bceSAndroid Build Coastguard Worker offset = (glw::GLintptr)deAlign32((int)size / 2, 4);
5771*35238bceSAndroid Build Coastguard Worker source = (const uint8_t *)&indexData[0] + offset;
5772*35238bceSAndroid Build Coastguard Worker }
5773*35238bceSAndroid Build Coastguard Worker else
5774*35238bceSAndroid Build Coastguard Worker {
5775*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5776*35238bceSAndroid Build Coastguard Worker return;
5777*35238bceSAndroid Build Coastguard Worker }
5778*35238bceSAndroid Build Coastguard Worker
5779*35238bceSAndroid Build Coastguard Worker // reference case? don't modify the buffer in use
5780*35238bceSAndroid Build Coastguard Worker if (m_uploadBufferTarget == UPLOADBUFFERTARGET_DIFFERENT_BUFFER)
5781*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(target, *alternativeUploadBuffer);
5782*35238bceSAndroid Build Coastguard Worker
5783*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5784*35238bceSAndroid Build Coastguard Worker
5785*35238bceSAndroid Build Coastguard Worker if (m_uploadMethod == UPLOADMETHOD_BUFFER_DATA)
5786*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, source, GL_STREAM_DRAW);
5787*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA)
5788*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(target, offset, size, source);
5789*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE)
5790*35238bceSAndroid Build Coastguard Worker {
5791*35238bceSAndroid Build Coastguard Worker const int mapFlags =
5792*35238bceSAndroid Build Coastguard Worker (m_mapFlags == MAPFLAG_INVALIDATE_BUFFER) ? (GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT) :
5793*35238bceSAndroid Build Coastguard Worker (m_mapFlags == MAPFLAG_INVALIDATE_RANGE) ? (GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT) :
5794*35238bceSAndroid Build Coastguard Worker (-1);
5795*35238bceSAndroid Build Coastguard Worker void *mapPtr;
5796*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
5797*35238bceSAndroid Build Coastguard Worker
5798*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(target, offset, size, mapFlags);
5799*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
5800*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
5801*35238bceSAndroid Build Coastguard Worker
5802*35238bceSAndroid Build Coastguard Worker deMemcpy(mapPtr, source, (int)size);
5803*35238bceSAndroid Build Coastguard Worker
5804*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
5805*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(target);
5806*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
5807*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
5808*35238bceSAndroid Build Coastguard Worker }
5809*35238bceSAndroid Build Coastguard Worker else
5810*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5811*35238bceSAndroid Build Coastguard Worker
5812*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5813*35238bceSAndroid Build Coastguard Worker
5814*35238bceSAndroid Build Coastguard Worker sample.result.uploadedDataSize = (int)size;
5815*35238bceSAndroid Build Coastguard Worker sample.result.duration.uploadDuration = endTime - startTime;
5816*35238bceSAndroid Build Coastguard Worker }
5817*35238bceSAndroid Build Coastguard Worker
5818*35238bceSAndroid Build Coastguard Worker // second draw
5819*35238bceSAndroid Build Coastguard Worker {
5820*35238bceSAndroid Build Coastguard Worker // Source vertex data from alternative buffer in refernce case
5821*35238bceSAndroid Build Coastguard Worker if (m_uploadBufferTarget == UPLOADBUFFERTARGET_DIFFERENT_BUFFER && m_targetBuffer == TARGETBUFFER_VERTEX)
5822*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
5823*35238bceSAndroid Build Coastguard Worker
5824*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5825*35238bceSAndroid Build Coastguard Worker
5826*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
5827*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, numVertices);
5828*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5829*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_INT, DE_NULL);
5830*35238bceSAndroid Build Coastguard Worker else
5831*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
5832*35238bceSAndroid Build Coastguard Worker
5833*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5834*35238bceSAndroid Build Coastguard Worker
5835*35238bceSAndroid Build Coastguard Worker sample.result.duration.secondRenderDuration = endTime - startTime;
5836*35238bceSAndroid Build Coastguard Worker }
5837*35238bceSAndroid Build Coastguard Worker
5838*35238bceSAndroid Build Coastguard Worker // read
5839*35238bceSAndroid Build Coastguard Worker {
5840*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
5841*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
5842*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
5843*35238bceSAndroid Build Coastguard Worker
5844*35238bceSAndroid Build Coastguard Worker sample.result.duration.readDuration = endTime - startTime;
5845*35238bceSAndroid Build Coastguard Worker }
5846*35238bceSAndroid Build Coastguard Worker
5847*35238bceSAndroid Build Coastguard Worker // set results
5848*35238bceSAndroid Build Coastguard Worker
5849*35238bceSAndroid Build Coastguard Worker sample.result.renderDataSize = getVertexDataSize() * sample.result.numVertices;
5850*35238bceSAndroid Build Coastguard Worker
5851*35238bceSAndroid Build Coastguard Worker sample.result.duration.renderReadDuration =
5852*35238bceSAndroid Build Coastguard Worker sample.result.duration.secondRenderDuration + sample.result.duration.readDuration;
5853*35238bceSAndroid Build Coastguard Worker sample.result.duration.totalDuration =
5854*35238bceSAndroid Build Coastguard Worker sample.result.duration.firstRenderDuration + sample.result.duration.uploadDuration +
5855*35238bceSAndroid Build Coastguard Worker sample.result.duration.secondRenderDuration + sample.result.duration.readDuration;
5856*35238bceSAndroid Build Coastguard Worker sample.result.duration.fitResponseDuration = sample.result.duration.renderReadDuration;
5857*35238bceSAndroid Build Coastguard Worker }
5858*35238bceSAndroid Build Coastguard Worker
5859*35238bceSAndroid Build Coastguard Worker class UploadWaitDrawCase : public RenderPerformanceTestBase
5860*35238bceSAndroid Build Coastguard Worker {
5861*35238bceSAndroid Build Coastguard Worker public:
5862*35238bceSAndroid Build Coastguard Worker struct Sample
5863*35238bceSAndroid Build Coastguard Worker {
5864*35238bceSAndroid Build Coastguard Worker int numFrames;
5865*35238bceSAndroid Build Coastguard Worker uint64_t uploadCallEndTime;
5866*35238bceSAndroid Build Coastguard Worker };
5867*35238bceSAndroid Build Coastguard Worker struct Result
5868*35238bceSAndroid Build Coastguard Worker {
5869*35238bceSAndroid Build Coastguard Worker uint64_t uploadDuration;
5870*35238bceSAndroid Build Coastguard Worker uint64_t renderDuration;
5871*35238bceSAndroid Build Coastguard Worker uint64_t readDuration;
5872*35238bceSAndroid Build Coastguard Worker uint64_t renderReadDuration;
5873*35238bceSAndroid Build Coastguard Worker
5874*35238bceSAndroid Build Coastguard Worker uint64_t timeBeforeUse;
5875*35238bceSAndroid Build Coastguard Worker };
5876*35238bceSAndroid Build Coastguard Worker
5877*35238bceSAndroid Build Coastguard Worker UploadWaitDrawCase(Context &context, const char *name, const char *description, DrawMethod drawMethod,
5878*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer, UploadMethod uploadMethod, BufferState bufferState);
5879*35238bceSAndroid Build Coastguard Worker ~UploadWaitDrawCase(void);
5880*35238bceSAndroid Build Coastguard Worker
5881*35238bceSAndroid Build Coastguard Worker private:
5882*35238bceSAndroid Build Coastguard Worker void init(void);
5883*35238bceSAndroid Build Coastguard Worker void deinit(void);
5884*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
5885*35238bceSAndroid Build Coastguard Worker
5886*35238bceSAndroid Build Coastguard Worker void uploadBuffer(Sample &sample, Result &result);
5887*35238bceSAndroid Build Coastguard Worker void drawFromBuffer(Sample &sample, Result &result);
5888*35238bceSAndroid Build Coastguard Worker void reuseAndDeleteBuffer(void);
5889*35238bceSAndroid Build Coastguard Worker void logAndSetTestResult(void);
5890*35238bceSAndroid Build Coastguard Worker void logSamples(void);
5891*35238bceSAndroid Build Coastguard Worker void drawMisc(void);
5892*35238bceSAndroid Build Coastguard Worker int findStabilizationSample(uint64_t Result::*target, const char *description);
5893*35238bceSAndroid Build Coastguard Worker bool checkSampleTemporalStability(uint64_t Result::*target, const char *description);
5894*35238bceSAndroid Build Coastguard Worker
5895*35238bceSAndroid Build Coastguard Worker const DrawMethod m_drawMethod;
5896*35238bceSAndroid Build Coastguard Worker const TargetBuffer m_targetBuffer;
5897*35238bceSAndroid Build Coastguard Worker const UploadMethod m_uploadMethod;
5898*35238bceSAndroid Build Coastguard Worker const BufferState m_bufferState;
5899*35238bceSAndroid Build Coastguard Worker
5900*35238bceSAndroid Build Coastguard Worker const int m_numSamplesPerSwap;
5901*35238bceSAndroid Build Coastguard Worker const int m_numMaxSwaps;
5902*35238bceSAndroid Build Coastguard Worker
5903*35238bceSAndroid Build Coastguard Worker int m_frameNdx;
5904*35238bceSAndroid Build Coastguard Worker int m_sampleNdx;
5905*35238bceSAndroid Build Coastguard Worker int m_numVertices;
5906*35238bceSAndroid Build Coastguard Worker
5907*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> m_vertexData;
5908*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> m_indexData;
5909*35238bceSAndroid Build Coastguard Worker std::vector<Sample> m_samples;
5910*35238bceSAndroid Build Coastguard Worker std::vector<Result> m_results;
5911*35238bceSAndroid Build Coastguard Worker std::vector<int> m_iterationOrder;
5912*35238bceSAndroid Build Coastguard Worker
5913*35238bceSAndroid Build Coastguard Worker uint32_t m_vertexBuffer;
5914*35238bceSAndroid Build Coastguard Worker uint32_t m_indexBuffer;
5915*35238bceSAndroid Build Coastguard Worker uint32_t m_miscBuffer;
5916*35238bceSAndroid Build Coastguard Worker int m_numMiscVertices;
5917*35238bceSAndroid Build Coastguard Worker };
5918*35238bceSAndroid Build Coastguard Worker
UploadWaitDrawCase(Context & context,const char * name,const char * description,DrawMethod drawMethod,TargetBuffer targetBuffer,UploadMethod uploadMethod,BufferState bufferState)5919*35238bceSAndroid Build Coastguard Worker UploadWaitDrawCase::UploadWaitDrawCase(Context &context, const char *name, const char *description,
5920*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod, TargetBuffer targetBuffer, UploadMethod uploadMethod,
5921*35238bceSAndroid Build Coastguard Worker BufferState bufferState)
5922*35238bceSAndroid Build Coastguard Worker : RenderPerformanceTestBase(context, name, description)
5923*35238bceSAndroid Build Coastguard Worker , m_drawMethod(drawMethod)
5924*35238bceSAndroid Build Coastguard Worker , m_targetBuffer(targetBuffer)
5925*35238bceSAndroid Build Coastguard Worker , m_uploadMethod(uploadMethod)
5926*35238bceSAndroid Build Coastguard Worker , m_bufferState(bufferState)
5927*35238bceSAndroid Build Coastguard Worker , m_numSamplesPerSwap(10)
5928*35238bceSAndroid Build Coastguard Worker , m_numMaxSwaps(4)
5929*35238bceSAndroid Build Coastguard Worker , m_frameNdx(0)
5930*35238bceSAndroid Build Coastguard Worker , m_sampleNdx(0)
5931*35238bceSAndroid Build Coastguard Worker , m_numVertices(-1)
5932*35238bceSAndroid Build Coastguard Worker , m_vertexBuffer(0)
5933*35238bceSAndroid Build Coastguard Worker , m_indexBuffer(0)
5934*35238bceSAndroid Build Coastguard Worker , m_miscBuffer(0)
5935*35238bceSAndroid Build Coastguard Worker , m_numMiscVertices(-1)
5936*35238bceSAndroid Build Coastguard Worker {
5937*35238bceSAndroid Build Coastguard Worker }
5938*35238bceSAndroid Build Coastguard Worker
~UploadWaitDrawCase(void)5939*35238bceSAndroid Build Coastguard Worker UploadWaitDrawCase::~UploadWaitDrawCase(void)
5940*35238bceSAndroid Build Coastguard Worker {
5941*35238bceSAndroid Build Coastguard Worker deinit();
5942*35238bceSAndroid Build Coastguard Worker }
5943*35238bceSAndroid Build Coastguard Worker
init(void)5944*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::init(void)
5945*35238bceSAndroid Build Coastguard Worker {
5946*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
5947*35238bceSAndroid Build Coastguard Worker const int vertexAttribSize = (int)sizeof(tcu::Vec4) * 2; // color4, position4
5948*35238bceSAndroid Build Coastguard Worker const int vertexIndexSize = (int)sizeof(uint32_t);
5949*35238bceSAndroid Build Coastguard Worker const int vertexUploadDataSize = (m_targetBuffer == TARGETBUFFER_VERTEX) ? (vertexAttribSize) : (vertexIndexSize);
5950*35238bceSAndroid Build Coastguard Worker
5951*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::init();
5952*35238bceSAndroid Build Coastguard Worker
5953*35238bceSAndroid Build Coastguard Worker // requirements
5954*35238bceSAndroid Build Coastguard Worker
5955*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getWidth() < RENDER_AREA_SIZE ||
5956*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getHeight() < RENDER_AREA_SIZE)
5957*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test case requires " + de::toString<int>(RENDER_AREA_SIZE) + "x" +
5958*35238bceSAndroid Build Coastguard Worker de::toString<int>(RENDER_AREA_SIZE) + " render target");
5959*35238bceSAndroid Build Coastguard Worker
5960*35238bceSAndroid Build Coastguard Worker // gl state
5961*35238bceSAndroid Build Coastguard Worker
5962*35238bceSAndroid Build Coastguard Worker gl.viewport(0, 0, RENDER_AREA_SIZE, RENDER_AREA_SIZE);
5963*35238bceSAndroid Build Coastguard Worker
5964*35238bceSAndroid Build Coastguard Worker // enable bleding to prevent grid layers from being discarded
5965*35238bceSAndroid Build Coastguard Worker
5966*35238bceSAndroid Build Coastguard Worker gl.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
5967*35238bceSAndroid Build Coastguard Worker gl.blendEquation(GL_FUNC_ADD);
5968*35238bceSAndroid Build Coastguard Worker gl.enable(GL_BLEND);
5969*35238bceSAndroid Build Coastguard Worker
5970*35238bceSAndroid Build Coastguard Worker // scene
5971*35238bceSAndroid Build Coastguard Worker
5972*35238bceSAndroid Build Coastguard Worker {
5973*35238bceSAndroid Build Coastguard Worker LayeredGridSpec scene;
5974*35238bceSAndroid Build Coastguard Worker
5975*35238bceSAndroid Build Coastguard Worker // create ~8MB workload with similar characteristics as in the other test
5976*35238bceSAndroid Build Coastguard Worker // => makes comparison to other results more straightforward
5977*35238bceSAndroid Build Coastguard Worker scene.gridWidth = 93;
5978*35238bceSAndroid Build Coastguard Worker scene.gridHeight = 93;
5979*35238bceSAndroid Build Coastguard Worker scene.gridLayers = 5;
5980*35238bceSAndroid Build Coastguard Worker
5981*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(m_vertexData, scene);
5982*35238bceSAndroid Build Coastguard Worker generateLayeredGridIndexData(m_indexData, scene);
5983*35238bceSAndroid Build Coastguard Worker m_numVertices = getLayeredGridNumVertices(scene);
5984*35238bceSAndroid Build Coastguard Worker }
5985*35238bceSAndroid Build Coastguard Worker
5986*35238bceSAndroid Build Coastguard Worker // buffers
5987*35238bceSAndroid Build Coastguard Worker
5988*35238bceSAndroid Build Coastguard Worker if (m_bufferState == BUFFERSTATE_NEW)
5989*35238bceSAndroid Build Coastguard Worker {
5990*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
5991*35238bceSAndroid Build Coastguard Worker {
5992*35238bceSAndroid Build Coastguard Worker // reads from two buffers, prepare the static buffer
5993*35238bceSAndroid Build Coastguard Worker
5994*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
5995*35238bceSAndroid Build Coastguard Worker {
5996*35238bceSAndroid Build Coastguard Worker // index buffer is static, use another vertex buffer to keep original buffer in unused state
5997*35238bceSAndroid Build Coastguard Worker const glu::Buffer vertexCopyBuffer(m_context.getRenderContext());
5998*35238bceSAndroid Build Coastguard Worker
5999*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_indexBuffer);
6000*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *vertexCopyBuffer);
6001*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
6002*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(m_vertexData.size() * sizeof(tcu::Vec4)),
6003*35238bceSAndroid Build Coastguard Worker &m_vertexData[0], GL_STATIC_DRAW);
6004*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(m_indexData.size() * sizeof(uint32_t)),
6005*35238bceSAndroid Build Coastguard Worker &m_indexData[0], GL_STATIC_DRAW);
6006*35238bceSAndroid Build Coastguard Worker
6007*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
6008*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, m_numVertices, GL_UNSIGNED_INT, DE_NULL);
6009*35238bceSAndroid Build Coastguard Worker }
6010*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
6011*35238bceSAndroid Build Coastguard Worker {
6012*35238bceSAndroid Build Coastguard Worker // vertex buffer is static
6013*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_vertexBuffer);
6014*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
6015*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(m_vertexData.size() * sizeof(tcu::Vec4)),
6016*35238bceSAndroid Build Coastguard Worker &m_vertexData[0], GL_STATIC_DRAW);
6017*35238bceSAndroid Build Coastguard Worker
6018*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
6019*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, m_numVertices);
6020*35238bceSAndroid Build Coastguard Worker }
6021*35238bceSAndroid Build Coastguard Worker else
6022*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6023*35238bceSAndroid Build Coastguard Worker }
6024*35238bceSAndroid Build Coastguard Worker }
6025*35238bceSAndroid Build Coastguard Worker else if (m_bufferState == BUFFERSTATE_EXISTING)
6026*35238bceSAndroid Build Coastguard Worker {
6027*35238bceSAndroid Build Coastguard Worker const glw::GLenum vertexUsage = (m_targetBuffer == TARGETBUFFER_VERTEX) ? (GL_STATIC_DRAW) : (GL_STATIC_DRAW);
6028*35238bceSAndroid Build Coastguard Worker const glw::GLenum indexUsage = (m_targetBuffer == TARGETBUFFER_INDEX) ? (GL_STATIC_DRAW) : (GL_STATIC_DRAW);
6029*35238bceSAndroid Build Coastguard Worker
6030*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_vertexBuffer);
6031*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
6032*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(m_vertexData.size() * sizeof(tcu::Vec4)), &m_vertexData[0],
6033*35238bceSAndroid Build Coastguard Worker vertexUsage);
6034*35238bceSAndroid Build Coastguard Worker
6035*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
6036*35238bceSAndroid Build Coastguard Worker {
6037*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_indexBuffer);
6038*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
6039*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(m_indexData.size() * sizeof(uint32_t)),
6040*35238bceSAndroid Build Coastguard Worker &m_indexData[0], indexUsage);
6041*35238bceSAndroid Build Coastguard Worker }
6042*35238bceSAndroid Build Coastguard Worker
6043*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
6044*35238bceSAndroid Build Coastguard Worker
6045*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
6046*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, m_numVertices);
6047*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
6048*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, m_numVertices, GL_UNSIGNED_INT, DE_NULL);
6049*35238bceSAndroid Build Coastguard Worker else
6050*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6051*35238bceSAndroid Build Coastguard Worker }
6052*35238bceSAndroid Build Coastguard Worker else
6053*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6054*35238bceSAndroid Build Coastguard Worker
6055*35238bceSAndroid Build Coastguard Worker // misc draw buffer
6056*35238bceSAndroid Build Coastguard Worker {
6057*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec4> vertexData;
6058*35238bceSAndroid Build Coastguard Worker LayeredGridSpec scene;
6059*35238bceSAndroid Build Coastguard Worker
6060*35238bceSAndroid Build Coastguard Worker // create ~1.5MB workload with similar characteristics
6061*35238bceSAndroid Build Coastguard Worker scene.gridWidth = 40;
6062*35238bceSAndroid Build Coastguard Worker scene.gridHeight = 40;
6063*35238bceSAndroid Build Coastguard Worker scene.gridLayers = 5;
6064*35238bceSAndroid Build Coastguard Worker
6065*35238bceSAndroid Build Coastguard Worker generateLayeredGridVertexAttribData4C4V(vertexData, scene);
6066*35238bceSAndroid Build Coastguard Worker
6067*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_miscBuffer);
6068*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_miscBuffer);
6069*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(sizeof(tcu::Vec4) * vertexData.size()), &vertexData[0],
6070*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW);
6071*35238bceSAndroid Build Coastguard Worker
6072*35238bceSAndroid Build Coastguard Worker m_numMiscVertices = getLayeredGridNumVertices(scene);
6073*35238bceSAndroid Build Coastguard Worker }
6074*35238bceSAndroid Build Coastguard Worker
6075*35238bceSAndroid Build Coastguard Worker // iterations
6076*35238bceSAndroid Build Coastguard Worker {
6077*35238bceSAndroid Build Coastguard Worker m_samples.resize((m_numMaxSwaps + 1) * m_numSamplesPerSwap);
6078*35238bceSAndroid Build Coastguard Worker m_results.resize((m_numMaxSwaps + 1) * m_numSamplesPerSwap);
6079*35238bceSAndroid Build Coastguard Worker
6080*35238bceSAndroid Build Coastguard Worker for (int numSwaps = 0; numSwaps <= m_numMaxSwaps; ++numSwaps)
6081*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < m_numSamplesPerSwap; ++sampleNdx)
6082*35238bceSAndroid Build Coastguard Worker {
6083*35238bceSAndroid Build Coastguard Worker const int index = numSwaps * m_numSamplesPerSwap + sampleNdx;
6084*35238bceSAndroid Build Coastguard Worker
6085*35238bceSAndroid Build Coastguard Worker m_samples[index].numFrames = numSwaps;
6086*35238bceSAndroid Build Coastguard Worker }
6087*35238bceSAndroid Build Coastguard Worker
6088*35238bceSAndroid Build Coastguard Worker m_iterationOrder.resize(m_samples.size());
6089*35238bceSAndroid Build Coastguard Worker generateTwoPassRandomIterationOrder(m_iterationOrder, (int)m_samples.size());
6090*35238bceSAndroid Build Coastguard Worker }
6091*35238bceSAndroid Build Coastguard Worker
6092*35238bceSAndroid Build Coastguard Worker // log
6093*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog()
6094*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Measuring time used in "
6095*35238bceSAndroid Build Coastguard Worker << ((m_drawMethod == DRAWMETHOD_DRAW_ARRAYS) ? ("drawArrays") : ("drawElements")) << " and readPixels call.\n"
6096*35238bceSAndroid Build Coastguard Worker << "Drawing using a buffer that has been uploaded N frames ago. Testing with N within range [0, "
6097*35238bceSAndroid Build Coastguard Worker << m_numMaxSwaps << "].\n"
6098*35238bceSAndroid Build Coastguard Worker << "Uploaded buffer is a " << ((m_targetBuffer == TARGETBUFFER_VERTEX) ? ("vertex attribute") : ("index"))
6099*35238bceSAndroid Build Coastguard Worker << " buffer.\n"
6100*35238bceSAndroid Build Coastguard Worker << "Uploading using "
6101*35238bceSAndroid Build Coastguard Worker << ((m_uploadMethod == UPLOADMETHOD_BUFFER_DATA) ?
6102*35238bceSAndroid Build Coastguard Worker ("bufferData") :
6103*35238bceSAndroid Build Coastguard Worker (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA) ?
6104*35238bceSAndroid Build Coastguard Worker ("bufferSubData") :
6105*35238bceSAndroid Build Coastguard Worker (m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE) ?
6106*35238bceSAndroid Build Coastguard Worker ("mapBufferRange, flags = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | "
6107*35238bceSAndroid Build Coastguard Worker "GL_MAP_UNSYNCHRONIZED_BIT") :
6108*35238bceSAndroid Build Coastguard Worker ((const char *)DE_NULL))
6109*35238bceSAndroid Build Coastguard Worker << "\n"
6110*35238bceSAndroid Build Coastguard Worker << "Upload size is " << getHumanReadableByteSize(m_numVertices * vertexUploadDataSize) << ".\n"
6111*35238bceSAndroid Build Coastguard Worker << ((m_bufferState == BUFFERSTATE_EXISTING) ? ("All test samples use the same buffer object.\n") : (""))
6112*35238bceSAndroid Build Coastguard Worker << "Test result is the number of frames (swaps) required for the render time to stabilize.\n"
6113*35238bceSAndroid Build Coastguard Worker << "Assuming combined time used in the draw call and readPixels call is stabilizes to a constant value.\n"
6114*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6115*35238bceSAndroid Build Coastguard Worker }
6116*35238bceSAndroid Build Coastguard Worker
deinit(void)6117*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::deinit(void)
6118*35238bceSAndroid Build Coastguard Worker {
6119*35238bceSAndroid Build Coastguard Worker RenderPerformanceTestBase::deinit();
6120*35238bceSAndroid Build Coastguard Worker
6121*35238bceSAndroid Build Coastguard Worker if (m_vertexBuffer)
6122*35238bceSAndroid Build Coastguard Worker {
6123*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_vertexBuffer);
6124*35238bceSAndroid Build Coastguard Worker m_vertexBuffer = 0;
6125*35238bceSAndroid Build Coastguard Worker }
6126*35238bceSAndroid Build Coastguard Worker if (m_indexBuffer)
6127*35238bceSAndroid Build Coastguard Worker {
6128*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_indexBuffer);
6129*35238bceSAndroid Build Coastguard Worker m_indexBuffer = 0;
6130*35238bceSAndroid Build Coastguard Worker }
6131*35238bceSAndroid Build Coastguard Worker if (m_miscBuffer)
6132*35238bceSAndroid Build Coastguard Worker {
6133*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_miscBuffer);
6134*35238bceSAndroid Build Coastguard Worker m_miscBuffer = 0;
6135*35238bceSAndroid Build Coastguard Worker }
6136*35238bceSAndroid Build Coastguard Worker }
6137*35238bceSAndroid Build Coastguard Worker
iterate(void)6138*35238bceSAndroid Build Coastguard Worker UploadWaitDrawCase::IterateResult UploadWaitDrawCase::iterate(void)
6139*35238bceSAndroid Build Coastguard Worker {
6140*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
6141*35238bceSAndroid Build Coastguard Worker const int betweenIterationFrameCount = 5; // draw misc between test samples
6142*35238bceSAndroid Build Coastguard Worker const int frameNdx = m_frameNdx++;
6143*35238bceSAndroid Build Coastguard Worker const int currentSampleNdx = m_iterationOrder[m_sampleNdx];
6144*35238bceSAndroid Build Coastguard Worker
6145*35238bceSAndroid Build Coastguard Worker // Simulate work for about 8ms
6146*35238bceSAndroid Build Coastguard Worker busyWait(8000);
6147*35238bceSAndroid Build Coastguard Worker
6148*35238bceSAndroid Build Coastguard Worker // Busywork rendering during unused frames
6149*35238bceSAndroid Build Coastguard Worker if (frameNdx != m_samples[currentSampleNdx].numFrames)
6150*35238bceSAndroid Build Coastguard Worker {
6151*35238bceSAndroid Build Coastguard Worker // draw similar from another buffer
6152*35238bceSAndroid Build Coastguard Worker drawMisc();
6153*35238bceSAndroid Build Coastguard Worker }
6154*35238bceSAndroid Build Coastguard Worker
6155*35238bceSAndroid Build Coastguard Worker if (frameNdx == 0)
6156*35238bceSAndroid Build Coastguard Worker {
6157*35238bceSAndroid Build Coastguard Worker // upload and start the clock
6158*35238bceSAndroid Build Coastguard Worker uploadBuffer(m_samples[currentSampleNdx], m_results[currentSampleNdx]);
6159*35238bceSAndroid Build Coastguard Worker }
6160*35238bceSAndroid Build Coastguard Worker
6161*35238bceSAndroid Build Coastguard Worker if (frameNdx ==
6162*35238bceSAndroid Build Coastguard Worker m_samples[currentSampleNdx].numFrames) // \note: not else if, m_samples[currentSampleNdx].numFrames can be 0
6163*35238bceSAndroid Build Coastguard Worker {
6164*35238bceSAndroid Build Coastguard Worker // draw using the uploaded buffer
6165*35238bceSAndroid Build Coastguard Worker drawFromBuffer(m_samples[currentSampleNdx], m_results[currentSampleNdx]);
6166*35238bceSAndroid Build Coastguard Worker
6167*35238bceSAndroid Build Coastguard Worker // re-use buffer for something else to make sure test iteration do not affect each other
6168*35238bceSAndroid Build Coastguard Worker if (m_bufferState == BUFFERSTATE_NEW)
6169*35238bceSAndroid Build Coastguard Worker reuseAndDeleteBuffer();
6170*35238bceSAndroid Build Coastguard Worker }
6171*35238bceSAndroid Build Coastguard Worker else if (frameNdx == m_samples[currentSampleNdx].numFrames + betweenIterationFrameCount)
6172*35238bceSAndroid Build Coastguard Worker {
6173*35238bceSAndroid Build Coastguard Worker // next sample
6174*35238bceSAndroid Build Coastguard Worker ++m_sampleNdx;
6175*35238bceSAndroid Build Coastguard Worker m_frameNdx = 0;
6176*35238bceSAndroid Build Coastguard Worker }
6177*35238bceSAndroid Build Coastguard Worker
6178*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "post-iterate");
6179*35238bceSAndroid Build Coastguard Worker
6180*35238bceSAndroid Build Coastguard Worker if (m_sampleNdx < (int)m_samples.size())
6181*35238bceSAndroid Build Coastguard Worker return CONTINUE;
6182*35238bceSAndroid Build Coastguard Worker
6183*35238bceSAndroid Build Coastguard Worker logAndSetTestResult();
6184*35238bceSAndroid Build Coastguard Worker return STOP;
6185*35238bceSAndroid Build Coastguard Worker }
6186*35238bceSAndroid Build Coastguard Worker
uploadBuffer(Sample & sample,Result & result)6187*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::uploadBuffer(Sample &sample, Result &result)
6188*35238bceSAndroid Build Coastguard Worker {
6189*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
6190*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
6191*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
6192*35238bceSAndroid Build Coastguard Worker glw::GLenum target;
6193*35238bceSAndroid Build Coastguard Worker glw::GLsizeiptr size;
6194*35238bceSAndroid Build Coastguard Worker const void *source;
6195*35238bceSAndroid Build Coastguard Worker
6196*35238bceSAndroid Build Coastguard Worker // data source
6197*35238bceSAndroid Build Coastguard Worker
6198*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
6199*35238bceSAndroid Build Coastguard Worker {
6200*35238bceSAndroid Build Coastguard Worker DE_ASSERT((m_vertexBuffer == 0) == (m_bufferState == BUFFERSTATE_NEW));
6201*35238bceSAndroid Build Coastguard Worker
6202*35238bceSAndroid Build Coastguard Worker target = GL_ARRAY_BUFFER;
6203*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(m_vertexData.size() * sizeof(tcu::Vec4));
6204*35238bceSAndroid Build Coastguard Worker source = &m_vertexData[0];
6205*35238bceSAndroid Build Coastguard Worker }
6206*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
6207*35238bceSAndroid Build Coastguard Worker {
6208*35238bceSAndroid Build Coastguard Worker DE_ASSERT((m_indexBuffer == 0) == (m_bufferState == BUFFERSTATE_NEW));
6209*35238bceSAndroid Build Coastguard Worker
6210*35238bceSAndroid Build Coastguard Worker target = GL_ELEMENT_ARRAY_BUFFER;
6211*35238bceSAndroid Build Coastguard Worker size = (glw::GLsizeiptr)(m_indexData.size() * sizeof(uint32_t));
6212*35238bceSAndroid Build Coastguard Worker source = &m_indexData[0];
6213*35238bceSAndroid Build Coastguard Worker }
6214*35238bceSAndroid Build Coastguard Worker else
6215*35238bceSAndroid Build Coastguard Worker {
6216*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6217*35238bceSAndroid Build Coastguard Worker return;
6218*35238bceSAndroid Build Coastguard Worker }
6219*35238bceSAndroid Build Coastguard Worker
6220*35238bceSAndroid Build Coastguard Worker // gen buffer
6221*35238bceSAndroid Build Coastguard Worker
6222*35238bceSAndroid Build Coastguard Worker if (m_bufferState == BUFFERSTATE_NEW)
6223*35238bceSAndroid Build Coastguard Worker {
6224*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
6225*35238bceSAndroid Build Coastguard Worker {
6226*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_vertexBuffer);
6227*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
6228*35238bceSAndroid Build Coastguard Worker }
6229*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
6230*35238bceSAndroid Build Coastguard Worker {
6231*35238bceSAndroid Build Coastguard Worker gl.genBuffers(1, &m_indexBuffer);
6232*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
6233*35238bceSAndroid Build Coastguard Worker }
6234*35238bceSAndroid Build Coastguard Worker else
6235*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6236*35238bceSAndroid Build Coastguard Worker
6237*35238bceSAndroid Build Coastguard Worker if (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA || m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE)
6238*35238bceSAndroid Build Coastguard Worker {
6239*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, DE_NULL, GL_STATIC_DRAW);
6240*35238bceSAndroid Build Coastguard Worker }
6241*35238bceSAndroid Build Coastguard Worker }
6242*35238bceSAndroid Build Coastguard Worker else if (m_bufferState == BUFFERSTATE_EXISTING)
6243*35238bceSAndroid Build Coastguard Worker {
6244*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_VERTEX)
6245*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
6246*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_INDEX)
6247*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
6248*35238bceSAndroid Build Coastguard Worker else
6249*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6250*35238bceSAndroid Build Coastguard Worker }
6251*35238bceSAndroid Build Coastguard Worker else
6252*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6253*35238bceSAndroid Build Coastguard Worker
6254*35238bceSAndroid Build Coastguard Worker // upload
6255*35238bceSAndroid Build Coastguard Worker
6256*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
6257*35238bceSAndroid Build Coastguard Worker
6258*35238bceSAndroid Build Coastguard Worker if (m_uploadMethod == UPLOADMETHOD_BUFFER_DATA)
6259*35238bceSAndroid Build Coastguard Worker gl.bufferData(target, size, source, GL_STATIC_DRAW);
6260*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_BUFFER_SUB_DATA)
6261*35238bceSAndroid Build Coastguard Worker gl.bufferSubData(target, 0, size, source);
6262*35238bceSAndroid Build Coastguard Worker else if (m_uploadMethod == UPLOADMETHOD_MAP_BUFFER_RANGE)
6263*35238bceSAndroid Build Coastguard Worker {
6264*35238bceSAndroid Build Coastguard Worker void *mapPtr;
6265*35238bceSAndroid Build Coastguard Worker glw::GLboolean unmapSuccessful;
6266*35238bceSAndroid Build Coastguard Worker
6267*35238bceSAndroid Build Coastguard Worker mapPtr = gl.mapBufferRange(target, 0, size,
6268*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
6269*35238bceSAndroid Build Coastguard Worker if (!mapPtr)
6270*35238bceSAndroid Build Coastguard Worker throw tcu::Exception("MapBufferRange returned NULL");
6271*35238bceSAndroid Build Coastguard Worker
6272*35238bceSAndroid Build Coastguard Worker deMemcpy(mapPtr, source, (int)size);
6273*35238bceSAndroid Build Coastguard Worker
6274*35238bceSAndroid Build Coastguard Worker // if unmapping fails, just try again later
6275*35238bceSAndroid Build Coastguard Worker unmapSuccessful = gl.unmapBuffer(target);
6276*35238bceSAndroid Build Coastguard Worker if (!unmapSuccessful)
6277*35238bceSAndroid Build Coastguard Worker throw UnmapFailureError();
6278*35238bceSAndroid Build Coastguard Worker }
6279*35238bceSAndroid Build Coastguard Worker else
6280*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6281*35238bceSAndroid Build Coastguard Worker
6282*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
6283*35238bceSAndroid Build Coastguard Worker
6284*35238bceSAndroid Build Coastguard Worker sample.uploadCallEndTime = endTime;
6285*35238bceSAndroid Build Coastguard Worker result.uploadDuration = endTime - startTime;
6286*35238bceSAndroid Build Coastguard Worker }
6287*35238bceSAndroid Build Coastguard Worker
drawFromBuffer(Sample & sample,Result & result)6288*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::drawFromBuffer(Sample &sample, Result &result)
6289*35238bceSAndroid Build Coastguard Worker {
6290*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
6291*35238bceSAndroid Build Coastguard Worker tcu::Surface resultSurface(RENDER_AREA_SIZE, RENDER_AREA_SIZE);
6292*35238bceSAndroid Build Coastguard Worker uint64_t startTime;
6293*35238bceSAndroid Build Coastguard Worker uint64_t endTime;
6294*35238bceSAndroid Build Coastguard Worker
6295*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_vertexBuffer != 0);
6296*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
6297*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_indexBuffer == 0);
6298*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
6299*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_indexBuffer != 0);
6300*35238bceSAndroid Build Coastguard Worker else
6301*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6302*35238bceSAndroid Build Coastguard Worker
6303*35238bceSAndroid Build Coastguard Worker // draw
6304*35238bceSAndroid Build Coastguard Worker {
6305*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
6306*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
6307*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer);
6308*35238bceSAndroid Build Coastguard Worker
6309*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
6310*35238bceSAndroid Build Coastguard Worker
6311*35238bceSAndroid Build Coastguard Worker // microseconds passed since return from upload call
6312*35238bceSAndroid Build Coastguard Worker result.timeBeforeUse = deGetMicroseconds() - sample.uploadCallEndTime;
6313*35238bceSAndroid Build Coastguard Worker
6314*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
6315*35238bceSAndroid Build Coastguard Worker
6316*35238bceSAndroid Build Coastguard Worker if (m_drawMethod == DRAWMETHOD_DRAW_ARRAYS)
6317*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, m_numVertices);
6318*35238bceSAndroid Build Coastguard Worker else if (m_drawMethod == DRAWMETHOD_DRAW_ELEMENTS)
6319*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, m_numVertices, GL_UNSIGNED_INT, DE_NULL);
6320*35238bceSAndroid Build Coastguard Worker else
6321*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
6322*35238bceSAndroid Build Coastguard Worker
6323*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
6324*35238bceSAndroid Build Coastguard Worker
6325*35238bceSAndroid Build Coastguard Worker result.renderDuration = endTime - startTime;
6326*35238bceSAndroid Build Coastguard Worker }
6327*35238bceSAndroid Build Coastguard Worker
6328*35238bceSAndroid Build Coastguard Worker // read
6329*35238bceSAndroid Build Coastguard Worker {
6330*35238bceSAndroid Build Coastguard Worker startTime = deGetMicroseconds();
6331*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), 0, 0, resultSurface.getAccess());
6332*35238bceSAndroid Build Coastguard Worker endTime = deGetMicroseconds();
6333*35238bceSAndroid Build Coastguard Worker
6334*35238bceSAndroid Build Coastguard Worker result.readDuration = endTime - startTime;
6335*35238bceSAndroid Build Coastguard Worker }
6336*35238bceSAndroid Build Coastguard Worker
6337*35238bceSAndroid Build Coastguard Worker result.renderReadDuration = result.renderDuration + result.readDuration;
6338*35238bceSAndroid Build Coastguard Worker }
6339*35238bceSAndroid Build Coastguard Worker
reuseAndDeleteBuffer(void)6340*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::reuseAndDeleteBuffer(void)
6341*35238bceSAndroid Build Coastguard Worker {
6342*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
6343*35238bceSAndroid Build Coastguard Worker
6344*35238bceSAndroid Build Coastguard Worker if (m_targetBuffer == TARGETBUFFER_INDEX)
6345*35238bceSAndroid Build Coastguard Worker {
6346*35238bceSAndroid Build Coastguard Worker // respecify and delete index buffer
6347*35238bceSAndroid Build Coastguard Worker static const uint32_t indices[3] = {1, 3, 8};
6348*35238bceSAndroid Build Coastguard Worker
6349*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_indexBuffer != 0);
6350*35238bceSAndroid Build Coastguard Worker
6351*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
6352*35238bceSAndroid Build Coastguard Worker gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, DE_NULL);
6353*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &m_indexBuffer);
6354*35238bceSAndroid Build Coastguard Worker m_indexBuffer = 0;
6355*35238bceSAndroid Build Coastguard Worker }
6356*35238bceSAndroid Build Coastguard Worker else if (m_targetBuffer == TARGETBUFFER_VERTEX)
6357*35238bceSAndroid Build Coastguard Worker {
6358*35238bceSAndroid Build Coastguard Worker // respecify and delete vertex buffer
6359*35238bceSAndroid Build Coastguard Worker static const tcu::Vec4 coloredTriangle[6] = {
6360*35238bceSAndroid Build Coastguard Worker tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(-0.4f, -0.4f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f),
6361*35238bceSAndroid Build Coastguard Worker tcu::Vec4(-0.2f, 0.4f, 0.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(0.8f, -0.1f, 0.0f, 1.0f),
6362*35238bceSAndroid Build Coastguard Worker };
6363*35238bceSAndroid Build Coastguard Worker
6364*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_vertexBuffer != 0);
6365*35238bceSAndroid Build Coastguard Worker
6366*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, sizeof(coloredTriangle), coloredTriangle, GL_STATIC_DRAW);
6367*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, 3);
6368*35238bceSAndroid Build Coastguard Worker gl.deleteBuffers(1, &m_vertexBuffer);
6369*35238bceSAndroid Build Coastguard Worker m_vertexBuffer = 0;
6370*35238bceSAndroid Build Coastguard Worker }
6371*35238bceSAndroid Build Coastguard Worker
6372*35238bceSAndroid Build Coastguard Worker waitGLResults();
6373*35238bceSAndroid Build Coastguard Worker }
6374*35238bceSAndroid Build Coastguard Worker
logAndSetTestResult(void)6375*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::logAndSetTestResult(void)
6376*35238bceSAndroid Build Coastguard Worker {
6377*35238bceSAndroid Build Coastguard Worker int uploadStabilization;
6378*35238bceSAndroid Build Coastguard Worker int renderReadStabilization;
6379*35238bceSAndroid Build Coastguard Worker int renderStabilization;
6380*35238bceSAndroid Build Coastguard Worker int readStabilization;
6381*35238bceSAndroid Build Coastguard Worker bool temporallyStable;
6382*35238bceSAndroid Build Coastguard Worker
6383*35238bceSAndroid Build Coastguard Worker {
6384*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Samples", "Result samples");
6385*35238bceSAndroid Build Coastguard Worker logSamples();
6386*35238bceSAndroid Build Coastguard Worker }
6387*35238bceSAndroid Build Coastguard Worker
6388*35238bceSAndroid Build Coastguard Worker {
6389*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Stabilization", "Sample stability");
6390*35238bceSAndroid Build Coastguard Worker
6391*35238bceSAndroid Build Coastguard Worker // log stabilization points
6392*35238bceSAndroid Build Coastguard Worker renderReadStabilization = findStabilizationSample(&Result::renderReadDuration, "Combined draw and read");
6393*35238bceSAndroid Build Coastguard Worker uploadStabilization = findStabilizationSample(&Result::uploadDuration, "Upload time");
6394*35238bceSAndroid Build Coastguard Worker renderStabilization = findStabilizationSample(&Result::renderDuration, "Draw call time");
6395*35238bceSAndroid Build Coastguard Worker readStabilization = findStabilizationSample(&Result::readDuration, "ReadPixels time");
6396*35238bceSAndroid Build Coastguard Worker
6397*35238bceSAndroid Build Coastguard Worker temporallyStable = true;
6398*35238bceSAndroid Build Coastguard Worker temporallyStable &= checkSampleTemporalStability(&Result::renderReadDuration, "Combined draw and read");
6399*35238bceSAndroid Build Coastguard Worker temporallyStable &= checkSampleTemporalStability(&Result::uploadDuration, "Upload time");
6400*35238bceSAndroid Build Coastguard Worker temporallyStable &= checkSampleTemporalStability(&Result::renderDuration, "Draw call time");
6401*35238bceSAndroid Build Coastguard Worker temporallyStable &= checkSampleTemporalStability(&Result::readDuration, "ReadPixels time");
6402*35238bceSAndroid Build Coastguard Worker }
6403*35238bceSAndroid Build Coastguard Worker
6404*35238bceSAndroid Build Coastguard Worker {
6405*35238bceSAndroid Build Coastguard Worker const tcu::ScopedLogSection section(m_testCtx.getLog(), "Results", "Results");
6406*35238bceSAndroid Build Coastguard Worker
6407*35238bceSAndroid Build Coastguard Worker // Check result sanily
6408*35238bceSAndroid Build Coastguard Worker if (uploadStabilization != 0)
6409*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
6410*35238bceSAndroid Build Coastguard Worker << "Warning! Upload times are not stable, test result may not be accurate."
6411*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6412*35238bceSAndroid Build Coastguard Worker if (!temporallyStable)
6413*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
6414*35238bceSAndroid Build Coastguard Worker << "Warning! Time samples do not seem to be temporally stable, sample times seem to "
6415*35238bceSAndroid Build Coastguard Worker "drift to one direction during test execution."
6416*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6417*35238bceSAndroid Build Coastguard Worker
6418*35238bceSAndroid Build Coastguard Worker // render & read
6419*35238bceSAndroid Build Coastguard Worker if (renderReadStabilization == -1)
6420*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
6421*35238bceSAndroid Build Coastguard Worker << "Combined time used in draw call and ReadPixels did not stabilize."
6422*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6423*35238bceSAndroid Build Coastguard Worker else
6424*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Integer(
6425*35238bceSAndroid Build Coastguard Worker "RenderReadStabilizationPoint", "Combined draw call and ReadPixels call time stabilization time",
6426*35238bceSAndroid Build Coastguard Worker "frames", QP_KEY_TAG_TIME, renderReadStabilization);
6427*35238bceSAndroid Build Coastguard Worker
6428*35238bceSAndroid Build Coastguard Worker // draw call
6429*35238bceSAndroid Build Coastguard Worker if (renderStabilization == -1)
6430*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Time used in draw call did not stabilize."
6431*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6432*35238bceSAndroid Build Coastguard Worker else
6433*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Integer("DrawCallStabilizationPoint",
6434*35238bceSAndroid Build Coastguard Worker "Draw call time stabilization time", "frames", QP_KEY_TAG_TIME,
6435*35238bceSAndroid Build Coastguard Worker renderStabilization);
6436*35238bceSAndroid Build Coastguard Worker
6437*35238bceSAndroid Build Coastguard Worker // readpixels
6438*35238bceSAndroid Build Coastguard Worker if (readStabilization == -1)
6439*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Time used in ReadPixels did not stabilize."
6440*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6441*35238bceSAndroid Build Coastguard Worker else
6442*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Integer("ReadPixelsStabilizationPoint",
6443*35238bceSAndroid Build Coastguard Worker "ReadPixels call time stabilization time", "frames",
6444*35238bceSAndroid Build Coastguard Worker QP_KEY_TAG_TIME, readStabilization);
6445*35238bceSAndroid Build Coastguard Worker
6446*35238bceSAndroid Build Coastguard Worker // Report renderReadStabilization
6447*35238bceSAndroid Build Coastguard Worker if (renderReadStabilization != -1)
6448*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::toString(renderReadStabilization).c_str());
6449*35238bceSAndroid Build Coastguard Worker else
6450*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::toString(m_numMaxSwaps).c_str()); // don't report -1
6451*35238bceSAndroid Build Coastguard Worker }
6452*35238bceSAndroid Build Coastguard Worker }
6453*35238bceSAndroid Build Coastguard Worker
logSamples(void)6454*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::logSamples(void)
6455*35238bceSAndroid Build Coastguard Worker {
6456*35238bceSAndroid Build Coastguard Worker // Inverse m_iterationOrder
6457*35238bceSAndroid Build Coastguard Worker
6458*35238bceSAndroid Build Coastguard Worker std::vector<int> runOrder(m_iterationOrder.size());
6459*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_iterationOrder.size(); ++ndx)
6460*35238bceSAndroid Build Coastguard Worker runOrder[m_iterationOrder[ndx]] = ndx;
6461*35238bceSAndroid Build Coastguard Worker
6462*35238bceSAndroid Build Coastguard Worker // Log samples
6463*35238bceSAndroid Build Coastguard Worker
6464*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::SampleList("Samples", "Samples") << tcu::TestLog::SampleInfo
6465*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("NumSwaps", "SwapBuffers before use", "",
6466*35238bceSAndroid Build Coastguard Worker QP_SAMPLE_VALUE_TAG_PREDICTOR)
6467*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("Delay", "Time before use", "us", QP_SAMPLE_VALUE_TAG_PREDICTOR)
6468*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("RunOrder", "Sample run order", "", QP_SAMPLE_VALUE_TAG_PREDICTOR)
6469*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawReadTime", "Draw call and ReadPixels time", "us",
6470*35238bceSAndroid Build Coastguard Worker QP_SAMPLE_VALUE_TAG_RESPONSE)
6471*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("TotalTime", "Total time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
6472*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("Upload time", "Upload time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
6473*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("DrawCallTime", "Draw call time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
6474*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::ValueInfo("ReadTime", "ReadPixels time", "us", QP_SAMPLE_VALUE_TAG_RESPONSE)
6475*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndSampleInfo;
6476*35238bceSAndroid Build Coastguard Worker
6477*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)m_samples.size(); ++sampleNdx)
6478*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Sample << m_samples[sampleNdx].numFrames
6479*35238bceSAndroid Build Coastguard Worker << (int)m_results[sampleNdx].timeBeforeUse << runOrder[sampleNdx]
6480*35238bceSAndroid Build Coastguard Worker << (int)m_results[sampleNdx].renderReadDuration
6481*35238bceSAndroid Build Coastguard Worker << (int)(m_results[sampleNdx].renderReadDuration + m_results[sampleNdx].uploadDuration)
6482*35238bceSAndroid Build Coastguard Worker << (int)m_results[sampleNdx].uploadDuration << (int)m_results[sampleNdx].renderDuration
6483*35238bceSAndroid Build Coastguard Worker << (int)m_results[sampleNdx].readDuration << tcu::TestLog::EndSample;
6484*35238bceSAndroid Build Coastguard Worker
6485*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::EndSampleList;
6486*35238bceSAndroid Build Coastguard Worker }
6487*35238bceSAndroid Build Coastguard Worker
drawMisc(void)6488*35238bceSAndroid Build Coastguard Worker void UploadWaitDrawCase::drawMisc(void)
6489*35238bceSAndroid Build Coastguard Worker {
6490*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
6491*35238bceSAndroid Build Coastguard Worker
6492*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, m_miscBuffer);
6493*35238bceSAndroid Build Coastguard Worker setupVertexAttribs();
6494*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, m_numMiscVertices);
6495*35238bceSAndroid Build Coastguard Worker }
6496*35238bceSAndroid Build Coastguard Worker
6497*35238bceSAndroid Build Coastguard Worker struct DistributionCompareResult
6498*35238bceSAndroid Build Coastguard Worker {
6499*35238bceSAndroid Build Coastguard Worker bool equal;
6500*35238bceSAndroid Build Coastguard Worker float standardDeviations;
6501*35238bceSAndroid Build Coastguard Worker };
6502*35238bceSAndroid Build Coastguard Worker
6503*35238bceSAndroid Build Coastguard Worker template <typename Comparer>
sumOfRanks(const std::vector<uint64_t> & testSamples,const std::vector<uint64_t> & allSamples,const Comparer & comparer)6504*35238bceSAndroid Build Coastguard Worker static float sumOfRanks(const std::vector<uint64_t> &testSamples, const std::vector<uint64_t> &allSamples,
6505*35238bceSAndroid Build Coastguard Worker const Comparer &comparer)
6506*35238bceSAndroid Build Coastguard Worker {
6507*35238bceSAndroid Build Coastguard Worker float sum = 0;
6508*35238bceSAndroid Build Coastguard Worker
6509*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = 0; sampleNdx < (int)testSamples.size(); ++sampleNdx)
6510*35238bceSAndroid Build Coastguard Worker {
6511*35238bceSAndroid Build Coastguard Worker const uint64_t testSample = testSamples[sampleNdx];
6512*35238bceSAndroid Build Coastguard Worker const int lowerIndex =
6513*35238bceSAndroid Build Coastguard Worker (int)(std::lower_bound(allSamples.begin(), allSamples.end(), testSample, comparer) - allSamples.begin());
6514*35238bceSAndroid Build Coastguard Worker const int upperIndex =
6515*35238bceSAndroid Build Coastguard Worker (int)(std::upper_bound(allSamples.begin(), allSamples.end(), testSample, comparer) - allSamples.begin());
6516*35238bceSAndroid Build Coastguard Worker const int lowerRank = lowerIndex + 1; // convert zero-indexed to rank
6517*35238bceSAndroid Build Coastguard Worker const int upperRank = upperIndex; // convert zero-indexed to rank, upperIndex is last equal + 1
6518*35238bceSAndroid Build Coastguard Worker const float rankMidpoint = (float)(lowerRank + upperRank) / 2.0f;
6519*35238bceSAndroid Build Coastguard Worker
6520*35238bceSAndroid Build Coastguard Worker sum += rankMidpoint;
6521*35238bceSAndroid Build Coastguard Worker }
6522*35238bceSAndroid Build Coastguard Worker
6523*35238bceSAndroid Build Coastguard Worker return sum;
6524*35238bceSAndroid Build Coastguard Worker }
6525*35238bceSAndroid Build Coastguard Worker
6526*35238bceSAndroid Build Coastguard Worker template <typename Comparer>
distributionCompare(const std::vector<uint64_t> & orderedObservationsA,const std::vector<uint64_t> & orderedObservationsB,const Comparer & comparer)6527*35238bceSAndroid Build Coastguard Worker static DistributionCompareResult distributionCompare(const std::vector<uint64_t> &orderedObservationsA,
6528*35238bceSAndroid Build Coastguard Worker const std::vector<uint64_t> &orderedObservationsB,
6529*35238bceSAndroid Build Coastguard Worker const Comparer &comparer)
6530*35238bceSAndroid Build Coastguard Worker {
6531*35238bceSAndroid Build Coastguard Worker // Mann-Whitney U test
6532*35238bceSAndroid Build Coastguard Worker
6533*35238bceSAndroid Build Coastguard Worker const int n1 = (int)orderedObservationsA.size();
6534*35238bceSAndroid Build Coastguard Worker const int n2 = (int)orderedObservationsB.size();
6535*35238bceSAndroid Build Coastguard Worker std::vector<uint64_t> allSamples(n1 + n2);
6536*35238bceSAndroid Build Coastguard Worker
6537*35238bceSAndroid Build Coastguard Worker std::copy(orderedObservationsA.begin(), orderedObservationsA.end(), allSamples.begin());
6538*35238bceSAndroid Build Coastguard Worker std::copy(orderedObservationsB.begin(), orderedObservationsB.end(), allSamples.begin() + n1);
6539*35238bceSAndroid Build Coastguard Worker std::sort(allSamples.begin(), allSamples.end());
6540*35238bceSAndroid Build Coastguard Worker
6541*35238bceSAndroid Build Coastguard Worker {
6542*35238bceSAndroid Build Coastguard Worker const float R1 = sumOfRanks(orderedObservationsA, allSamples, comparer);
6543*35238bceSAndroid Build Coastguard Worker
6544*35238bceSAndroid Build Coastguard Worker const float U1 = (float)(n1 * n2 + n1 * (n1 + 1) / 2) - R1;
6545*35238bceSAndroid Build Coastguard Worker const float U2 = (float)(n1 * n2) - U1;
6546*35238bceSAndroid Build Coastguard Worker const float U = de::min(U1, U2);
6547*35238bceSAndroid Build Coastguard Worker
6548*35238bceSAndroid Build Coastguard Worker // \note: sample sizes might not be large enough to expect normal distribution but we do it anyway
6549*35238bceSAndroid Build Coastguard Worker
6550*35238bceSAndroid Build Coastguard Worker const float mU = (float)(n1 * n2) / 2.0f;
6551*35238bceSAndroid Build Coastguard Worker const float sigmaU = deFloatSqrt((float)(n1 * n2 * (n1 + n2 + 1)) / 12.0f);
6552*35238bceSAndroid Build Coastguard Worker const float z = (U - mU) / sigmaU;
6553*35238bceSAndroid Build Coastguard Worker
6554*35238bceSAndroid Build Coastguard Worker DistributionCompareResult result;
6555*35238bceSAndroid Build Coastguard Worker
6556*35238bceSAndroid Build Coastguard Worker result.equal = (de::abs(z) <= 1.96f); // accept within 95% confidence interval
6557*35238bceSAndroid Build Coastguard Worker result.standardDeviations = z;
6558*35238bceSAndroid Build Coastguard Worker
6559*35238bceSAndroid Build Coastguard Worker return result;
6560*35238bceSAndroid Build Coastguard Worker }
6561*35238bceSAndroid Build Coastguard Worker }
6562*35238bceSAndroid Build Coastguard Worker
6563*35238bceSAndroid Build Coastguard Worker template <typename T>
6564*35238bceSAndroid Build Coastguard Worker struct ThresholdComparer
6565*35238bceSAndroid Build Coastguard Worker {
6566*35238bceSAndroid Build Coastguard Worker float relativeThreshold;
6567*35238bceSAndroid Build Coastguard Worker T absoluteThreshold;
6568*35238bceSAndroid Build Coastguard Worker
operator ()deqp::gles3::Performance::__anone1143f0e0111::ThresholdComparer6569*35238bceSAndroid Build Coastguard Worker bool operator()(const T &a, const T &b) const
6570*35238bceSAndroid Build Coastguard Worker {
6571*35238bceSAndroid Build Coastguard Worker const float diff = de::abs((float)a - (float)b);
6572*35238bceSAndroid Build Coastguard Worker
6573*35238bceSAndroid Build Coastguard Worker // thresholds
6574*35238bceSAndroid Build Coastguard Worker if (diff <= (float)absoluteThreshold)
6575*35238bceSAndroid Build Coastguard Worker return false;
6576*35238bceSAndroid Build Coastguard Worker if (diff <= float(a) * relativeThreshold || diff <= float(b) * relativeThreshold)
6577*35238bceSAndroid Build Coastguard Worker return false;
6578*35238bceSAndroid Build Coastguard Worker
6579*35238bceSAndroid Build Coastguard Worker // cmp
6580*35238bceSAndroid Build Coastguard Worker return a < b;
6581*35238bceSAndroid Build Coastguard Worker }
6582*35238bceSAndroid Build Coastguard Worker };
6583*35238bceSAndroid Build Coastguard Worker
findStabilizationSample(uint64_t UploadWaitDrawCase::Result::* target,const char * description)6584*35238bceSAndroid Build Coastguard Worker int UploadWaitDrawCase::findStabilizationSample(uint64_t UploadWaitDrawCase::Result::*target, const char *description)
6585*35238bceSAndroid Build Coastguard Worker {
6586*35238bceSAndroid Build Coastguard Worker std::vector<std::vector<uint64_t>> sampleObservations(m_numMaxSwaps + 1);
6587*35238bceSAndroid Build Coastguard Worker ThresholdComparer<uint64_t> comparer;
6588*35238bceSAndroid Build Coastguard Worker
6589*35238bceSAndroid Build Coastguard Worker comparer.relativeThreshold = 0.15f; // 15%
6590*35238bceSAndroid Build Coastguard Worker comparer.absoluteThreshold = 100; // (us), assumed sampling precision
6591*35238bceSAndroid Build Coastguard Worker
6592*35238bceSAndroid Build Coastguard Worker // get observations and order them
6593*35238bceSAndroid Build Coastguard Worker
6594*35238bceSAndroid Build Coastguard Worker for (int swapNdx = 0; swapNdx <= m_numMaxSwaps; ++swapNdx)
6595*35238bceSAndroid Build Coastguard Worker {
6596*35238bceSAndroid Build Coastguard Worker int insertNdx = 0;
6597*35238bceSAndroid Build Coastguard Worker
6598*35238bceSAndroid Build Coastguard Worker sampleObservations[swapNdx].resize(m_numSamplesPerSwap);
6599*35238bceSAndroid Build Coastguard Worker
6600*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_samples.size(); ++ndx)
6601*35238bceSAndroid Build Coastguard Worker if (m_samples[ndx].numFrames == swapNdx)
6602*35238bceSAndroid Build Coastguard Worker sampleObservations[swapNdx][insertNdx++] = m_results[ndx].*target;
6603*35238bceSAndroid Build Coastguard Worker
6604*35238bceSAndroid Build Coastguard Worker DE_ASSERT(insertNdx == m_numSamplesPerSwap);
6605*35238bceSAndroid Build Coastguard Worker
6606*35238bceSAndroid Build Coastguard Worker std::sort(sampleObservations[swapNdx].begin(), sampleObservations[swapNdx].end());
6607*35238bceSAndroid Build Coastguard Worker }
6608*35238bceSAndroid Build Coastguard Worker
6609*35238bceSAndroid Build Coastguard Worker // find stabilization point
6610*35238bceSAndroid Build Coastguard Worker
6611*35238bceSAndroid Build Coastguard Worker for (int sampleNdx = m_numMaxSwaps - 1; sampleNdx != -1; --sampleNdx)
6612*35238bceSAndroid Build Coastguard Worker {
6613*35238bceSAndroid Build Coastguard Worker // Distribution is equal to all following distributions
6614*35238bceSAndroid Build Coastguard Worker for (int cmpTargetDistribution = sampleNdx + 1; cmpTargetDistribution <= m_numMaxSwaps; ++cmpTargetDistribution)
6615*35238bceSAndroid Build Coastguard Worker {
6616*35238bceSAndroid Build Coastguard Worker // Stable section ends here?
6617*35238bceSAndroid Build Coastguard Worker const DistributionCompareResult result =
6618*35238bceSAndroid Build Coastguard Worker distributionCompare(sampleObservations[sampleNdx], sampleObservations[cmpTargetDistribution], comparer);
6619*35238bceSAndroid Build Coastguard Worker if (!result.equal)
6620*35238bceSAndroid Build Coastguard Worker {
6621*35238bceSAndroid Build Coastguard Worker // Last two samples are not equal? Samples never stabilized
6622*35238bceSAndroid Build Coastguard Worker if (sampleNdx == m_numMaxSwaps - 1)
6623*35238bceSAndroid Build Coastguard Worker {
6624*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << description << ": Samples with swap count "
6625*35238bceSAndroid Build Coastguard Worker << sampleNdx << " and " << cmpTargetDistribution
6626*35238bceSAndroid Build Coastguard Worker << " do not seem to have the same distribution:\n"
6627*35238bceSAndroid Build Coastguard Worker << "\tDifference in standard deviations: " << result.standardDeviations << "\n"
6628*35238bceSAndroid Build Coastguard Worker << "\tSwap count " << sampleNdx
6629*35238bceSAndroid Build Coastguard Worker << " median: " << linearSample(sampleObservations[sampleNdx], 0.5f) << "\n"
6630*35238bceSAndroid Build Coastguard Worker << "\tSwap count " << cmpTargetDistribution
6631*35238bceSAndroid Build Coastguard Worker << " median: " << linearSample(sampleObservations[cmpTargetDistribution], 0.5f)
6632*35238bceSAndroid Build Coastguard Worker << "\n"
6633*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6634*35238bceSAndroid Build Coastguard Worker return -1;
6635*35238bceSAndroid Build Coastguard Worker }
6636*35238bceSAndroid Build Coastguard Worker else
6637*35238bceSAndroid Build Coastguard Worker {
6638*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << description << ": Samples with swap count "
6639*35238bceSAndroid Build Coastguard Worker << sampleNdx << " and " << cmpTargetDistribution
6640*35238bceSAndroid Build Coastguard Worker << " do not seem to have the same distribution:\n"
6641*35238bceSAndroid Build Coastguard Worker << "\tSamples with swap count " << sampleNdx
6642*35238bceSAndroid Build Coastguard Worker << " are not part of the tail of stable results.\n"
6643*35238bceSAndroid Build Coastguard Worker << "\tDifference in standard deviations: " << result.standardDeviations << "\n"
6644*35238bceSAndroid Build Coastguard Worker << "\tSwap count " << sampleNdx
6645*35238bceSAndroid Build Coastguard Worker << " median: " << linearSample(sampleObservations[sampleNdx], 0.5f) << "\n"
6646*35238bceSAndroid Build Coastguard Worker << "\tSwap count " << cmpTargetDistribution
6647*35238bceSAndroid Build Coastguard Worker << " median: " << linearSample(sampleObservations[cmpTargetDistribution], 0.5f)
6648*35238bceSAndroid Build Coastguard Worker << "\n"
6649*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6650*35238bceSAndroid Build Coastguard Worker
6651*35238bceSAndroid Build Coastguard Worker return sampleNdx + 1;
6652*35238bceSAndroid Build Coastguard Worker }
6653*35238bceSAndroid Build Coastguard Worker }
6654*35238bceSAndroid Build Coastguard Worker }
6655*35238bceSAndroid Build Coastguard Worker }
6656*35238bceSAndroid Build Coastguard Worker
6657*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << description << ": All samples seem to have the same distribution"
6658*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6659*35238bceSAndroid Build Coastguard Worker
6660*35238bceSAndroid Build Coastguard Worker // all distributions equal
6661*35238bceSAndroid Build Coastguard Worker return 0;
6662*35238bceSAndroid Build Coastguard Worker }
6663*35238bceSAndroid Build Coastguard Worker
checkSampleTemporalStability(uint64_t UploadWaitDrawCase::Result::* target,const char * description)6664*35238bceSAndroid Build Coastguard Worker bool UploadWaitDrawCase::checkSampleTemporalStability(uint64_t UploadWaitDrawCase::Result::*target,
6665*35238bceSAndroid Build Coastguard Worker const char *description)
6666*35238bceSAndroid Build Coastguard Worker {
6667*35238bceSAndroid Build Coastguard Worker // Try to find correlation with sample order and sample times
6668*35238bceSAndroid Build Coastguard Worker
6669*35238bceSAndroid Build Coastguard Worker const int numDataPoints = (int)m_iterationOrder.size();
6670*35238bceSAndroid Build Coastguard Worker std::vector<tcu::Vec2> dataPoints(m_iterationOrder.size());
6671*35238bceSAndroid Build Coastguard Worker LineParametersWithConfidence lineFit;
6672*35238bceSAndroid Build Coastguard Worker
6673*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_iterationOrder.size(); ++ndx)
6674*35238bceSAndroid Build Coastguard Worker {
6675*35238bceSAndroid Build Coastguard Worker dataPoints[m_iterationOrder[ndx]].x() = (float)ndx;
6676*35238bceSAndroid Build Coastguard Worker dataPoints[m_iterationOrder[ndx]].y() = (float)(m_results[m_iterationOrder[ndx]].*target);
6677*35238bceSAndroid Build Coastguard Worker }
6678*35238bceSAndroid Build Coastguard Worker
6679*35238bceSAndroid Build Coastguard Worker lineFit = theilSenSiegelLinearRegression(dataPoints, 0.6f);
6680*35238bceSAndroid Build Coastguard Worker
6681*35238bceSAndroid Build Coastguard Worker // Difference of more than 25% of the offset along the whole sample range
6682*35238bceSAndroid Build Coastguard Worker if (de::abs(lineFit.coefficient) * (float)numDataPoints > de::abs(lineFit.offset) * 0.25f)
6683*35238bceSAndroid Build Coastguard Worker {
6684*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << description
6685*35238bceSAndroid Build Coastguard Worker << ": Correlation with data point observation order and result time. Results are not "
6686*35238bceSAndroid Build Coastguard Worker "temporally stable, observations are not independent.\n"
6687*35238bceSAndroid Build Coastguard Worker << "\tCoefficient: " << lineFit.coefficient << " (us / observation)\n"
6688*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
6689*35238bceSAndroid Build Coastguard Worker
6690*35238bceSAndroid Build Coastguard Worker return false;
6691*35238bceSAndroid Build Coastguard Worker }
6692*35238bceSAndroid Build Coastguard Worker else
6693*35238bceSAndroid Build Coastguard Worker return true;
6694*35238bceSAndroid Build Coastguard Worker }
6695*35238bceSAndroid Build Coastguard Worker
6696*35238bceSAndroid Build Coastguard Worker } // namespace
6697*35238bceSAndroid Build Coastguard Worker
BufferDataUploadTests(Context & context)6698*35238bceSAndroid Build Coastguard Worker BufferDataUploadTests::BufferDataUploadTests(Context &context)
6699*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "data_upload", "Buffer data upload performance tests")
6700*35238bceSAndroid Build Coastguard Worker {
6701*35238bceSAndroid Build Coastguard Worker }
6702*35238bceSAndroid Build Coastguard Worker
~BufferDataUploadTests(void)6703*35238bceSAndroid Build Coastguard Worker BufferDataUploadTests::~BufferDataUploadTests(void)
6704*35238bceSAndroid Build Coastguard Worker {
6705*35238bceSAndroid Build Coastguard Worker }
6706*35238bceSAndroid Build Coastguard Worker
init(void)6707*35238bceSAndroid Build Coastguard Worker void BufferDataUploadTests::init(void)
6708*35238bceSAndroid Build Coastguard Worker {
6709*35238bceSAndroid Build Coastguard Worker static const struct BufferUsage
6710*35238bceSAndroid Build Coastguard Worker {
6711*35238bceSAndroid Build Coastguard Worker const char *name;
6712*35238bceSAndroid Build Coastguard Worker uint32_t usage;
6713*35238bceSAndroid Build Coastguard Worker bool primaryUsage;
6714*35238bceSAndroid Build Coastguard Worker } bufferUsages[] = {
6715*35238bceSAndroid Build Coastguard Worker {"stream_draw", GL_STREAM_DRAW, true}, {"stream_read", GL_STREAM_READ, false},
6716*35238bceSAndroid Build Coastguard Worker {"stream_copy", GL_STREAM_COPY, false}, {"static_draw", GL_STATIC_DRAW, true},
6717*35238bceSAndroid Build Coastguard Worker {"static_read", GL_STATIC_READ, false}, {"static_copy", GL_STATIC_COPY, false},
6718*35238bceSAndroid Build Coastguard Worker {"dynamic_draw", GL_DYNAMIC_DRAW, true}, {"dynamic_read", GL_DYNAMIC_READ, false},
6719*35238bceSAndroid Build Coastguard Worker {"dynamic_copy", GL_DYNAMIC_COPY, false},
6720*35238bceSAndroid Build Coastguard Worker };
6721*35238bceSAndroid Build Coastguard Worker
6722*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const referenceGroup = new tcu::TestCaseGroup(m_testCtx, "reference", "Reference functions");
6723*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const functionCallGroup =
6724*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "function_call", "Function call timing");
6725*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const modifyAfterUseGroup =
6726*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "modify_after_use", "Function call time after buffer has been used");
6727*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const renderAfterUploadGroup = new tcu::TestCaseGroup(
6728*35238bceSAndroid Build Coastguard Worker m_testCtx, "render_after_upload", "Function call time of draw commands after buffer has been modified");
6729*35238bceSAndroid Build Coastguard Worker
6730*35238bceSAndroid Build Coastguard Worker addChild(referenceGroup);
6731*35238bceSAndroid Build Coastguard Worker addChild(functionCallGroup);
6732*35238bceSAndroid Build Coastguard Worker addChild(modifyAfterUseGroup);
6733*35238bceSAndroid Build Coastguard Worker addChild(renderAfterUploadGroup);
6734*35238bceSAndroid Build Coastguard Worker
6735*35238bceSAndroid Build Coastguard Worker // .reference
6736*35238bceSAndroid Build Coastguard Worker {
6737*35238bceSAndroid Build Coastguard Worker static const struct BufferSizeRange
6738*35238bceSAndroid Build Coastguard Worker {
6739*35238bceSAndroid Build Coastguard Worker const char *name;
6740*35238bceSAndroid Build Coastguard Worker int minBufferSize;
6741*35238bceSAndroid Build Coastguard Worker int maxBufferSize;
6742*35238bceSAndroid Build Coastguard Worker int numSamples;
6743*35238bceSAndroid Build Coastguard Worker bool largeBuffersCase;
6744*35238bceSAndroid Build Coastguard Worker } sizeRanges[] = {
6745*35238bceSAndroid Build Coastguard Worker {"small_buffers", 0, 1 << 18, 64, false}, // !< 0kB - 256kB
6746*35238bceSAndroid Build Coastguard Worker {"large_buffers", 1 << 18, 1 << 24, 32, true}, // !< 256kB - 16MB
6747*35238bceSAndroid Build Coastguard Worker };
6748*35238bceSAndroid Build Coastguard Worker
6749*35238bceSAndroid Build Coastguard Worker for (int bufferSizeRangeNdx = 0; bufferSizeRangeNdx < DE_LENGTH_OF_ARRAY(sizeRanges); ++bufferSizeRangeNdx)
6750*35238bceSAndroid Build Coastguard Worker {
6751*35238bceSAndroid Build Coastguard Worker referenceGroup->addChild(new ReferenceMemcpyCase(
6752*35238bceSAndroid Build Coastguard Worker m_context, std::string("memcpy_").append(sizeRanges[bufferSizeRangeNdx].name).c_str(),
6753*35238bceSAndroid Build Coastguard Worker "Test memcpy performance", sizeRanges[bufferSizeRangeNdx].minBufferSize,
6754*35238bceSAndroid Build Coastguard Worker sizeRanges[bufferSizeRangeNdx].maxBufferSize, sizeRanges[bufferSizeRangeNdx].numSamples,
6755*35238bceSAndroid Build Coastguard Worker sizeRanges[bufferSizeRangeNdx].largeBuffersCase));
6756*35238bceSAndroid Build Coastguard Worker }
6757*35238bceSAndroid Build Coastguard Worker }
6758*35238bceSAndroid Build Coastguard Worker
6759*35238bceSAndroid Build Coastguard Worker // .function_call
6760*35238bceSAndroid Build Coastguard Worker {
6761*35238bceSAndroid Build Coastguard Worker const int minBufferSize = 0; // !< 0kiB
6762*35238bceSAndroid Build Coastguard Worker const int maxBufferSize = 1 << 24; // !< 16MiB
6763*35238bceSAndroid Build Coastguard Worker const int numDataSamples = 25;
6764*35238bceSAndroid Build Coastguard Worker const int numMapSamples = 25;
6765*35238bceSAndroid Build Coastguard Worker
6766*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferDataMethodGroup =
6767*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "buffer_data", "Use glBufferData");
6768*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferSubDataMethodGroup =
6769*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "buffer_sub_data", "Use glBufferSubData");
6770*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const mapBufferRangeMethodGroup =
6771*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "map_buffer_range", "Use glMapBufferRange");
6772*35238bceSAndroid Build Coastguard Worker
6773*35238bceSAndroid Build Coastguard Worker functionCallGroup->addChild(bufferDataMethodGroup);
6774*35238bceSAndroid Build Coastguard Worker functionCallGroup->addChild(bufferSubDataMethodGroup);
6775*35238bceSAndroid Build Coastguard Worker functionCallGroup->addChild(mapBufferRangeMethodGroup);
6776*35238bceSAndroid Build Coastguard Worker
6777*35238bceSAndroid Build Coastguard Worker // .buffer_data
6778*35238bceSAndroid Build Coastguard Worker {
6779*35238bceSAndroid Build Coastguard Worker static const struct TargetCase
6780*35238bceSAndroid Build Coastguard Worker {
6781*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *group;
6782*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CaseType caseType;
6783*35238bceSAndroid Build Coastguard Worker bool allUsages;
6784*35238bceSAndroid Build Coastguard Worker } targetCases[] = {
6785*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "new_buffer", "Target new buffer"),
6786*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CASE_NEW_BUFFER, true},
6787*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "unspecified_buffer", "Target new unspecified buffer"),
6788*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CASE_UNSPECIFIED_BUFFER, true},
6789*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "specified_buffer", "Target new specified buffer"),
6790*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CASE_SPECIFIED_BUFFER, true},
6791*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "used_buffer", "Target buffer that was used in draw"),
6792*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CASE_USED_BUFFER, true},
6793*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "larger_used_buffer", "Target larger buffer that was used in draw"),
6794*35238bceSAndroid Build Coastguard Worker BufferDataUploadCase::CASE_USED_LARGER_BUFFER, false},
6795*35238bceSAndroid Build Coastguard Worker };
6796*35238bceSAndroid Build Coastguard Worker
6797*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(targetCases); ++targetNdx)
6798*35238bceSAndroid Build Coastguard Worker {
6799*35238bceSAndroid Build Coastguard Worker bufferDataMethodGroup->addChild(targetCases[targetNdx].group);
6800*35238bceSAndroid Build Coastguard Worker
6801*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(bufferUsages); ++usageNdx)
6802*35238bceSAndroid Build Coastguard Worker if (bufferUsages[usageNdx].primaryUsage || targetCases[targetNdx].allUsages)
6803*35238bceSAndroid Build Coastguard Worker targetCases[targetNdx].group->addChild(new BufferDataUploadCase(
6804*35238bceSAndroid Build Coastguard Worker m_context, std::string("usage_").append(bufferUsages[usageNdx].name).c_str(),
6805*35238bceSAndroid Build Coastguard Worker std::string("Test with usage = ").append(bufferUsages[usageNdx].name).c_str(),
6806*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, numDataSamples, bufferUsages[usageNdx].usage,
6807*35238bceSAndroid Build Coastguard Worker targetCases[targetNdx].caseType));
6808*35238bceSAndroid Build Coastguard Worker }
6809*35238bceSAndroid Build Coastguard Worker }
6810*35238bceSAndroid Build Coastguard Worker
6811*35238bceSAndroid Build Coastguard Worker // .buffer_sub_data
6812*35238bceSAndroid Build Coastguard Worker {
6813*35238bceSAndroid Build Coastguard Worker static const struct FlagCase
6814*35238bceSAndroid Build Coastguard Worker {
6815*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *group;
6816*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::CaseType parentCase;
6817*35238bceSAndroid Build Coastguard Worker bool allUsages;
6818*35238bceSAndroid Build Coastguard Worker int flags;
6819*35238bceSAndroid Build Coastguard Worker } flagCases[] = {
6820*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "used_buffer_full_upload", ""),
6821*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::CASE_USED_BUFFER, true, BufferSubDataUploadCase::FLAG_FULL_UPLOAD},
6822*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "used_buffer_invalidate_before_full_upload",
6823*35238bceSAndroid Build Coastguard Worker "Clear buffer with bufferData(...,NULL) before sub data call"),
6824*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::CASE_USED_BUFFER, false,
6825*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::FLAG_FULL_UPLOAD | BufferSubDataUploadCase::FLAG_INVALIDATE_BEFORE_USE},
6826*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "used_buffer_partial_upload", ""),
6827*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::CASE_USED_BUFFER, true, BufferSubDataUploadCase::FLAG_PARTIAL_UPLOAD},
6828*35238bceSAndroid Build Coastguard Worker {new tcu::TestCaseGroup(m_testCtx, "used_buffer_invalidate_before_partial_upload",
6829*35238bceSAndroid Build Coastguard Worker "Clear buffer with bufferData(...,NULL) before sub data call"),
6830*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::CASE_USED_BUFFER, false,
6831*35238bceSAndroid Build Coastguard Worker BufferSubDataUploadCase::FLAG_PARTIAL_UPLOAD | BufferSubDataUploadCase::FLAG_INVALIDATE_BEFORE_USE},
6832*35238bceSAndroid Build Coastguard Worker };
6833*35238bceSAndroid Build Coastguard Worker
6834*35238bceSAndroid Build Coastguard Worker for (int flagNdx = 0; flagNdx < DE_LENGTH_OF_ARRAY(flagCases); ++flagNdx)
6835*35238bceSAndroid Build Coastguard Worker {
6836*35238bceSAndroid Build Coastguard Worker bufferSubDataMethodGroup->addChild(flagCases[flagNdx].group);
6837*35238bceSAndroid Build Coastguard Worker
6838*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(bufferUsages); ++usageNdx)
6839*35238bceSAndroid Build Coastguard Worker if (bufferUsages[usageNdx].primaryUsage || flagCases[flagNdx].allUsages)
6840*35238bceSAndroid Build Coastguard Worker flagCases[flagNdx].group->addChild(new BufferSubDataUploadCase(
6841*35238bceSAndroid Build Coastguard Worker m_context, std::string("usage_").append(bufferUsages[usageNdx].name).c_str(),
6842*35238bceSAndroid Build Coastguard Worker std::string("Test with usage = ").append(bufferUsages[usageNdx].name).c_str(),
6843*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, numDataSamples, bufferUsages[usageNdx].usage,
6844*35238bceSAndroid Build Coastguard Worker flagCases[flagNdx].parentCase, flagCases[flagNdx].flags));
6845*35238bceSAndroid Build Coastguard Worker }
6846*35238bceSAndroid Build Coastguard Worker }
6847*35238bceSAndroid Build Coastguard Worker
6848*35238bceSAndroid Build Coastguard Worker // .map_buffer_range
6849*35238bceSAndroid Build Coastguard Worker {
6850*35238bceSAndroid Build Coastguard Worker static const struct FlagCase
6851*35238bceSAndroid Build Coastguard Worker {
6852*35238bceSAndroid Build Coastguard Worker const char *name;
6853*35238bceSAndroid Build Coastguard Worker bool usefulForUnusedBuffers;
6854*35238bceSAndroid Build Coastguard Worker bool allUsages;
6855*35238bceSAndroid Build Coastguard Worker int glFlags;
6856*35238bceSAndroid Build Coastguard Worker int caseFlags;
6857*35238bceSAndroid Build Coastguard Worker } flagCases[] = {
6858*35238bceSAndroid Build Coastguard Worker {"flag_write_full", true, true, GL_MAP_WRITE_BIT, 0},
6859*35238bceSAndroid Build Coastguard Worker {"flag_write_partial", true, true, GL_MAP_WRITE_BIT, MapBufferRangeCase::FLAG_PARTIAL},
6860*35238bceSAndroid Build Coastguard Worker {"flag_read_write_full", true, true, GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, 0},
6861*35238bceSAndroid Build Coastguard Worker {"flag_read_write_partial", true, true, GL_MAP_WRITE_BIT | GL_MAP_READ_BIT,
6862*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL},
6863*35238bceSAndroid Build Coastguard Worker {"flag_invalidate_range_full", true, false, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT, 0},
6864*35238bceSAndroid Build Coastguard Worker {"flag_invalidate_range_partial", true, false, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
6865*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL},
6866*35238bceSAndroid Build Coastguard Worker {"flag_invalidate_buffer_full", true, false, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT, 0},
6867*35238bceSAndroid Build Coastguard Worker {"flag_invalidate_buffer_partial", true, false, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT,
6868*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL},
6869*35238bceSAndroid Build Coastguard Worker {"flag_write_full_manual_invalidate_buffer", false, false,
6870*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT, MapBufferRangeCase::FLAG_MANUAL_INVALIDATION},
6871*35238bceSAndroid Build Coastguard Worker {"flag_write_partial_manual_invalidate_buffer", false, false,
6872*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
6873*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL | MapBufferRangeCase::FLAG_MANUAL_INVALIDATION},
6874*35238bceSAndroid Build Coastguard Worker {"flag_unsynchronized_full", true, false, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT, 0},
6875*35238bceSAndroid Build Coastguard Worker {"flag_unsynchronized_partial", true, false, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT,
6876*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL},
6877*35238bceSAndroid Build Coastguard Worker {"flag_unsynchronized_and_invalidate_buffer_full", true, false,
6878*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT, 0},
6879*35238bceSAndroid Build Coastguard Worker {"flag_unsynchronized_and_invalidate_buffer_partial", true, false,
6880*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT,
6881*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_PARTIAL},
6882*35238bceSAndroid Build Coastguard Worker };
6883*35238bceSAndroid Build Coastguard Worker static const struct FlushCases
6884*35238bceSAndroid Build Coastguard Worker {
6885*35238bceSAndroid Build Coastguard Worker const char *name;
6886*35238bceSAndroid Build Coastguard Worker int glFlags;
6887*35238bceSAndroid Build Coastguard Worker int caseFlags;
6888*35238bceSAndroid Build Coastguard Worker } flushCases[] = {
6889*35238bceSAndroid Build Coastguard Worker {"flag_flush_explicit_map_full", GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT, 0},
6890*35238bceSAndroid Build Coastguard Worker {"flag_flush_explicit_map_partial", GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT,
6891*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::FLAG_PARTIAL},
6892*35238bceSAndroid Build Coastguard Worker {"flag_flush_explicit_map_full_flush_in_parts", GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT,
6893*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::FLAG_FLUSH_IN_PARTS},
6894*35238bceSAndroid Build Coastguard Worker {"flag_flush_explicit_map_full_flush_partial", GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT,
6895*35238bceSAndroid Build Coastguard Worker MapBufferRangeFlushCase::FLAG_FLUSH_PARTIAL},
6896*35238bceSAndroid Build Coastguard Worker };
6897*35238bceSAndroid Build Coastguard Worker static const struct MapTestGroup
6898*35238bceSAndroid Build Coastguard Worker {
6899*35238bceSAndroid Build Coastguard Worker int flags;
6900*35238bceSAndroid Build Coastguard Worker bool unusedBufferCase;
6901*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *group;
6902*35238bceSAndroid Build Coastguard Worker } groups[] = {
6903*35238bceSAndroid Build Coastguard Worker {
6904*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_USE_UNUSED_UNSPECIFIED_BUFFER,
6905*35238bceSAndroid Build Coastguard Worker true,
6906*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "new_unspecified_buffer",
6907*35238bceSAndroid Build Coastguard Worker "Test with unused, unspecified buffers"),
6908*35238bceSAndroid Build Coastguard Worker },
6909*35238bceSAndroid Build Coastguard Worker {
6910*35238bceSAndroid Build Coastguard Worker MapBufferRangeCase::FLAG_USE_UNUSED_SPECIFIED_BUFFER,
6911*35238bceSAndroid Build Coastguard Worker true,
6912*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "new_specified_buffer", "Test with unused, specified buffers"),
6913*35238bceSAndroid Build Coastguard Worker },
6914*35238bceSAndroid Build Coastguard Worker {0, false,
6915*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "used_buffer",
6916*35238bceSAndroid Build Coastguard Worker "Test with used (data has been sourced from a buffer) buffers")},
6917*35238bceSAndroid Build Coastguard Worker };
6918*35238bceSAndroid Build Coastguard Worker
6919*35238bceSAndroid Build Coastguard Worker // we OR same flags to both range and flushRange cases, make sure it is legal
6920*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT((int)MapBufferRangeCase::FLAG_USE_UNUSED_SPECIFIED_BUFFER ==
6921*35238bceSAndroid Build Coastguard Worker (int)MapBufferRangeFlushCase::FLAG_USE_UNUSED_SPECIFIED_BUFFER);
6922*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT((int)MapBufferRangeCase::FLAG_USE_UNUSED_UNSPECIFIED_BUFFER ==
6923*35238bceSAndroid Build Coastguard Worker (int)MapBufferRangeFlushCase::FLAG_USE_UNUSED_UNSPECIFIED_BUFFER);
6924*35238bceSAndroid Build Coastguard Worker
6925*35238bceSAndroid Build Coastguard Worker for (int groupNdx = 0; groupNdx < DE_LENGTH_OF_ARRAY(groups); ++groupNdx)
6926*35238bceSAndroid Build Coastguard Worker {
6927*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferTypeGroup = groups[groupNdx].group;
6928*35238bceSAndroid Build Coastguard Worker
6929*35238bceSAndroid Build Coastguard Worker mapBufferRangeMethodGroup->addChild(bufferTypeGroup);
6930*35238bceSAndroid Build Coastguard Worker
6931*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(flagCases); ++caseNdx)
6932*35238bceSAndroid Build Coastguard Worker {
6933*35238bceSAndroid Build Coastguard Worker if (groups[groupNdx].unusedBufferCase && !flagCases[caseNdx].usefulForUnusedBuffers)
6934*35238bceSAndroid Build Coastguard Worker continue;
6935*35238bceSAndroid Build Coastguard Worker
6936*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferUsageGroup =
6937*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, flagCases[caseNdx].name, "");
6938*35238bceSAndroid Build Coastguard Worker bufferTypeGroup->addChild(bufferUsageGroup);
6939*35238bceSAndroid Build Coastguard Worker
6940*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(bufferUsages); ++usageNdx)
6941*35238bceSAndroid Build Coastguard Worker if (bufferUsages[usageNdx].primaryUsage || flagCases[caseNdx].allUsages)
6942*35238bceSAndroid Build Coastguard Worker bufferUsageGroup->addChild(new MapBufferRangeCase(
6943*35238bceSAndroid Build Coastguard Worker m_context, bufferUsages[usageNdx].name,
6944*35238bceSAndroid Build Coastguard Worker std::string("Test with usage = ").append(bufferUsages[usageNdx].name).c_str(),
6945*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, numMapSamples, bufferUsages[usageNdx].usage,
6946*35238bceSAndroid Build Coastguard Worker flagCases[caseNdx].glFlags, flagCases[caseNdx].caseFlags | groups[groupNdx].flags));
6947*35238bceSAndroid Build Coastguard Worker }
6948*35238bceSAndroid Build Coastguard Worker
6949*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(flushCases); ++caseNdx)
6950*35238bceSAndroid Build Coastguard Worker {
6951*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferUsageGroup =
6952*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, flushCases[caseNdx].name, "");
6953*35238bceSAndroid Build Coastguard Worker bufferTypeGroup->addChild(bufferUsageGroup);
6954*35238bceSAndroid Build Coastguard Worker
6955*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(bufferUsages); ++usageNdx)
6956*35238bceSAndroid Build Coastguard Worker if (bufferUsages[usageNdx].primaryUsage)
6957*35238bceSAndroid Build Coastguard Worker bufferUsageGroup->addChild(new MapBufferRangeFlushCase(
6958*35238bceSAndroid Build Coastguard Worker m_context, bufferUsages[usageNdx].name,
6959*35238bceSAndroid Build Coastguard Worker std::string("Test with usage = ").append(bufferUsages[usageNdx].name).c_str(),
6960*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, numMapSamples, bufferUsages[usageNdx].usage,
6961*35238bceSAndroid Build Coastguard Worker flushCases[caseNdx].glFlags, flushCases[caseNdx].caseFlags | groups[groupNdx].flags));
6962*35238bceSAndroid Build Coastguard Worker }
6963*35238bceSAndroid Build Coastguard Worker }
6964*35238bceSAndroid Build Coastguard Worker }
6965*35238bceSAndroid Build Coastguard Worker }
6966*35238bceSAndroid Build Coastguard Worker
6967*35238bceSAndroid Build Coastguard Worker // .modify_after_use
6968*35238bceSAndroid Build Coastguard Worker {
6969*35238bceSAndroid Build Coastguard Worker const int minBufferSize = 0; // !< 0kiB
6970*35238bceSAndroid Build Coastguard Worker const int maxBufferSize = 1 << 24; // !< 16MiB
6971*35238bceSAndroid Build Coastguard Worker
6972*35238bceSAndroid Build Coastguard Worker static const struct Usage
6973*35238bceSAndroid Build Coastguard Worker {
6974*35238bceSAndroid Build Coastguard Worker const char *name;
6975*35238bceSAndroid Build Coastguard Worker const char *description;
6976*35238bceSAndroid Build Coastguard Worker uint32_t usage;
6977*35238bceSAndroid Build Coastguard Worker } usages[] = {
6978*35238bceSAndroid Build Coastguard Worker {"static_draw", "Test with GL_STATIC_DRAW", GL_STATIC_DRAW},
6979*35238bceSAndroid Build Coastguard Worker {"dynamic_draw", "Test with GL_DYNAMIC_DRAW", GL_DYNAMIC_DRAW},
6980*35238bceSAndroid Build Coastguard Worker {"stream_draw", "Test with GL_STREAM_DRAW", GL_STREAM_DRAW},
6981*35238bceSAndroid Build Coastguard Worker
6982*35238bceSAndroid Build Coastguard Worker };
6983*35238bceSAndroid Build Coastguard Worker
6984*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(usages); ++usageNdx)
6985*35238bceSAndroid Build Coastguard Worker {
6986*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const usageGroup =
6987*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, usages[usageNdx].name, usages[usageNdx].description);
6988*35238bceSAndroid Build Coastguard Worker modifyAfterUseGroup->addChild(usageGroup);
6989*35238bceSAndroid Build Coastguard Worker
6990*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferDataCase(m_context, "buffer_data",
6991*35238bceSAndroid Build Coastguard Worker "Respecify buffer contents after use", minBufferSize,
6992*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0));
6993*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferDataCase(
6994*35238bceSAndroid Build Coastguard Worker m_context, "buffer_data_different_size", "Respecify buffer contents and size after use", minBufferSize,
6995*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, ModifyAfterWithBufferDataCase::FLAG_RESPECIFY_SIZE));
6996*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferDataCase(
6997*35238bceSAndroid Build Coastguard Worker m_context, "buffer_data_repeated", "Respecify buffer contents after upload and use", minBufferSize,
6998*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, ModifyAfterWithBufferDataCase::FLAG_UPLOAD_REPEATED));
6999*35238bceSAndroid Build Coastguard Worker
7000*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferSubDataCase(
7001*35238bceSAndroid Build Coastguard Worker m_context, "buffer_sub_data_full", "Respecify buffer contents after use", minBufferSize, maxBufferSize,
7002*35238bceSAndroid Build Coastguard Worker usages[usageNdx].usage, 0));
7003*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferSubDataCase(
7004*35238bceSAndroid Build Coastguard Worker m_context, "buffer_sub_data_partial", "Respecify buffer contents partially use", minBufferSize,
7005*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, ModifyAfterWithBufferSubDataCase::FLAG_PARTIAL));
7006*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferSubDataCase(
7007*35238bceSAndroid Build Coastguard Worker m_context, "buffer_sub_data_full_repeated", "Respecify buffer contents after upload and use",
7008*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage,
7009*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase::FLAG_UPLOAD_REPEATED));
7010*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithBufferSubDataCase(
7011*35238bceSAndroid Build Coastguard Worker m_context, "buffer_sub_data_partial_repeated", "Respecify buffer contents partially upload and use",
7012*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage,
7013*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase::FLAG_UPLOAD_REPEATED |
7014*35238bceSAndroid Build Coastguard Worker ModifyAfterWithBufferSubDataCase::FLAG_PARTIAL));
7015*35238bceSAndroid Build Coastguard Worker
7016*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7017*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_write_full", "Respecify buffer contents after use", minBufferSize, maxBufferSize,
7018*35238bceSAndroid Build Coastguard Worker usages[usageNdx].usage, 0, GL_MAP_WRITE_BIT));
7019*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7020*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_write_partial", "Respecify buffer contents partially after use", minBufferSize,
7021*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferRangeCase::FLAG_PARTIAL,
7022*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT));
7023*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7024*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_read_write_full", "Respecify buffer contents after use", minBufferSize,
7025*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT));
7026*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7027*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_read_write_partial", "Respecify buffer contents partially after use",
7028*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferRangeCase::FLAG_PARTIAL,
7029*35238bceSAndroid Build Coastguard Worker GL_MAP_READ_BIT | GL_MAP_WRITE_BIT));
7030*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7031*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_invalidate_range_full", "Respecify buffer contents after use", minBufferSize,
7032*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT));
7033*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7034*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_invalidate_range_partial", "Respecify buffer contents partially after use",
7035*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferRangeCase::FLAG_PARTIAL,
7036*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT));
7037*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7038*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_invalidate_buffer_full", "Respecify buffer contents after use", minBufferSize,
7039*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));
7040*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7041*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_invalidate_buffer_partial", "Respecify buffer contents partially after use",
7042*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferRangeCase::FLAG_PARTIAL,
7043*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));
7044*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7045*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_unsynchronized_full", "Respecify buffer contents after use", minBufferSize,
7046*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT));
7047*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferRangeCase(
7048*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_unsynchronized_partial", "Respecify buffer contents partially after use",
7049*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferRangeCase::FLAG_PARTIAL,
7050*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT));
7051*35238bceSAndroid Build Coastguard Worker
7052*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferFlushCase(
7053*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_flush_explicit_full", "Respecify buffer contents after use", minBufferSize,
7054*35238bceSAndroid Build Coastguard Worker maxBufferSize, usages[usageNdx].usage, 0, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT));
7055*35238bceSAndroid Build Coastguard Worker usageGroup->addChild(new ModifyAfterWithMapBufferFlushCase(
7056*35238bceSAndroid Build Coastguard Worker m_context, "map_flag_flush_explicit_partial", "Respecify buffer contents partially after use",
7057*35238bceSAndroid Build Coastguard Worker minBufferSize, maxBufferSize, usages[usageNdx].usage, ModifyAfterWithMapBufferFlushCase::FLAG_PARTIAL,
7058*35238bceSAndroid Build Coastguard Worker GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT));
7059*35238bceSAndroid Build Coastguard Worker }
7060*35238bceSAndroid Build Coastguard Worker }
7061*35238bceSAndroid Build Coastguard Worker
7062*35238bceSAndroid Build Coastguard Worker // .render_after_upload
7063*35238bceSAndroid Build Coastguard Worker {
7064*35238bceSAndroid Build Coastguard Worker // .reference
7065*35238bceSAndroid Build Coastguard Worker {
7066*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const renderReferenceGroup =
7067*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "reference", "Baseline results");
7068*35238bceSAndroid Build Coastguard Worker renderAfterUploadGroup->addChild(renderReferenceGroup);
7069*35238bceSAndroid Build Coastguard Worker
7070*35238bceSAndroid Build Coastguard Worker // .draw
7071*35238bceSAndroid Build Coastguard Worker {
7072*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const drawGroup =
7073*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "draw", "Time usage of functions with non-modified buffers");
7074*35238bceSAndroid Build Coastguard Worker renderReferenceGroup->addChild(drawGroup);
7075*35238bceSAndroid Build Coastguard Worker
7076*35238bceSAndroid Build Coastguard Worker // Time consumed by readPixels
7077*35238bceSAndroid Build Coastguard Worker drawGroup->addChild(new ReferenceReadPixelsTimeCase(
7078*35238bceSAndroid Build Coastguard Worker m_context, "read_pixels", "Measure time consumed by readPixels() function call"));
7079*35238bceSAndroid Build Coastguard Worker
7080*35238bceSAndroid Build Coastguard Worker // Time consumed by rendering
7081*35238bceSAndroid Build Coastguard Worker drawGroup->addChild(new ReferenceRenderTimeCase(m_context, "draw_arrays",
7082*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawArrays() function call",
7083*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS));
7084*35238bceSAndroid Build Coastguard Worker drawGroup->addChild(new ReferenceRenderTimeCase(m_context, "draw_elements",
7085*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements() function call",
7086*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS));
7087*35238bceSAndroid Build Coastguard Worker }
7088*35238bceSAndroid Build Coastguard Worker
7089*35238bceSAndroid Build Coastguard Worker // .draw_upload_draw
7090*35238bceSAndroid Build Coastguard Worker {
7091*35238bceSAndroid Build Coastguard Worker static const struct
7092*35238bceSAndroid Build Coastguard Worker {
7093*35238bceSAndroid Build Coastguard Worker const char *name;
7094*35238bceSAndroid Build Coastguard Worker const char *description;
7095*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod;
7096*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer;
7097*35238bceSAndroid Build Coastguard Worker bool partial;
7098*35238bceSAndroid Build Coastguard Worker } uploadTargets[] = {
7099*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices",
7100*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawArrays, vertex attribute upload, another drawArrays, and readPixels "
7101*35238bceSAndroid Build Coastguard Worker "function calls.",
7102*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, false},
7103*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices_partial",
7104*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawArrays, partial vertex attribute upload, another drawArrays, and "
7105*35238bceSAndroid Build Coastguard Worker "readPixels function calls.",
7106*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, true},
7107*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_vertices",
7108*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, vertex attribute upload, another drawElements, and "
7109*35238bceSAndroid Build Coastguard Worker "readPixels function calls.",
7110*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_VERTEX, false},
7111*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices",
7112*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, index upload, another drawElements, and readPixels "
7113*35238bceSAndroid Build Coastguard Worker "function calls.",
7114*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, false},
7115*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices_partial",
7116*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, partial index upload, another drawElements, and "
7117*35238bceSAndroid Build Coastguard Worker "readPixels function calls.",
7118*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, true},
7119*35238bceSAndroid Build Coastguard Worker };
7120*35238bceSAndroid Build Coastguard Worker static const struct
7121*35238bceSAndroid Build Coastguard Worker {
7122*35238bceSAndroid Build Coastguard Worker const char *name;
7123*35238bceSAndroid Build Coastguard Worker const char *description;
7124*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod;
7125*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MapFlags mapFlags;
7126*35238bceSAndroid Build Coastguard Worker bool supportsPartialUpload;
7127*35238bceSAndroid Build Coastguard Worker } uploadMethods[] = {
7128*35238bceSAndroid Build Coastguard Worker {"buffer_data", "bufferData", UPLOADMETHOD_BUFFER_DATA, BufferInUseRenderTimeCase::MAPFLAG_NONE,
7129*35238bceSAndroid Build Coastguard Worker false},
7130*35238bceSAndroid Build Coastguard Worker {"buffer_sub_data", "bufferSubData", UPLOADMETHOD_BUFFER_SUB_DATA,
7131*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_NONE, true},
7132*35238bceSAndroid Build Coastguard Worker {"map_buffer_range_invalidate_range", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE,
7133*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_INVALIDATE_RANGE, true},
7134*35238bceSAndroid Build Coastguard Worker {"map_buffer_range_invalidate_buffer", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE,
7135*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_INVALIDATE_BUFFER, false},
7136*35238bceSAndroid Build Coastguard Worker };
7137*35238bceSAndroid Build Coastguard Worker
7138*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const drawUploadDrawGroup = new tcu::TestCaseGroup(
7139*35238bceSAndroid Build Coastguard Worker m_testCtx, "draw_upload_draw", "Time usage of functions draw, upload and another draw");
7140*35238bceSAndroid Build Coastguard Worker renderReferenceGroup->addChild(drawUploadDrawGroup);
7141*35238bceSAndroid Build Coastguard Worker
7142*35238bceSAndroid Build Coastguard Worker for (int uploadTargetNdx = 0; uploadTargetNdx < DE_LENGTH_OF_ARRAY(uploadTargets); ++uploadTargetNdx)
7143*35238bceSAndroid Build Coastguard Worker for (int uploadMethodNdx = 0; uploadMethodNdx < DE_LENGTH_OF_ARRAY(uploadMethods);
7144*35238bceSAndroid Build Coastguard Worker ++uploadMethodNdx)
7145*35238bceSAndroid Build Coastguard Worker {
7146*35238bceSAndroid Build Coastguard Worker const std::string name = std::string() + uploadTargets[uploadTargetNdx].name + "_with_" +
7147*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].name;
7148*35238bceSAndroid Build Coastguard Worker
7149*35238bceSAndroid Build Coastguard Worker if (uploadTargets[uploadTargetNdx].partial &&
7150*35238bceSAndroid Build Coastguard Worker !uploadMethods[uploadMethodNdx].supportsPartialUpload)
7151*35238bceSAndroid Build Coastguard Worker continue;
7152*35238bceSAndroid Build Coastguard Worker
7153*35238bceSAndroid Build Coastguard Worker drawUploadDrawGroup->addChild(new BufferInUseRenderTimeCase(
7154*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), uploadTargets[uploadTargetNdx].description,
7155*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].drawMethod, uploadMethods[uploadMethodNdx].mapFlags,
7156*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].targetBuffer, uploadMethods[uploadMethodNdx].uploadMethod,
7157*35238bceSAndroid Build Coastguard Worker (uploadTargets[uploadTargetNdx].partial) ? (UPLOADRANGE_PARTIAL) : (UPLOADRANGE_FULL),
7158*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::UPLOADBUFFERTARGET_DIFFERENT_BUFFER));
7159*35238bceSAndroid Build Coastguard Worker }
7160*35238bceSAndroid Build Coastguard Worker }
7161*35238bceSAndroid Build Coastguard Worker }
7162*35238bceSAndroid Build Coastguard Worker
7163*35238bceSAndroid Build Coastguard Worker // .upload_unrelated_and_draw
7164*35238bceSAndroid Build Coastguard Worker {
7165*35238bceSAndroid Build Coastguard Worker static const struct
7166*35238bceSAndroid Build Coastguard Worker {
7167*35238bceSAndroid Build Coastguard Worker const char *name;
7168*35238bceSAndroid Build Coastguard Worker const char *description;
7169*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod;
7170*35238bceSAndroid Build Coastguard Worker } drawMethods[] = {
7171*35238bceSAndroid Build Coastguard Worker {"draw_arrays", "drawArrays", DRAWMETHOD_DRAW_ARRAYS},
7172*35238bceSAndroid Build Coastguard Worker {"draw_elements", "drawElements", DRAWMETHOD_DRAW_ELEMENTS},
7173*35238bceSAndroid Build Coastguard Worker };
7174*35238bceSAndroid Build Coastguard Worker
7175*35238bceSAndroid Build Coastguard Worker static const struct
7176*35238bceSAndroid Build Coastguard Worker {
7177*35238bceSAndroid Build Coastguard Worker const char *name;
7178*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod;
7179*35238bceSAndroid Build Coastguard Worker } uploadMethods[] = {
7180*35238bceSAndroid Build Coastguard Worker {"buffer_data", UPLOADMETHOD_BUFFER_DATA},
7181*35238bceSAndroid Build Coastguard Worker {"buffer_sub_data", UPLOADMETHOD_BUFFER_SUB_DATA},
7182*35238bceSAndroid Build Coastguard Worker {"map_buffer_range", UPLOADMETHOD_MAP_BUFFER_RANGE},
7183*35238bceSAndroid Build Coastguard Worker };
7184*35238bceSAndroid Build Coastguard Worker
7185*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const uploadUnrelatedGroup = new tcu::TestCaseGroup(
7186*35238bceSAndroid Build Coastguard Worker m_testCtx, "upload_unrelated_and_draw", "Time usage of functions after an unrelated upload");
7187*35238bceSAndroid Build Coastguard Worker renderAfterUploadGroup->addChild(uploadUnrelatedGroup);
7188*35238bceSAndroid Build Coastguard Worker
7189*35238bceSAndroid Build Coastguard Worker for (int drawMethodNdx = 0; drawMethodNdx < DE_LENGTH_OF_ARRAY(drawMethods); ++drawMethodNdx)
7190*35238bceSAndroid Build Coastguard Worker for (int uploadMethodNdx = 0; uploadMethodNdx < DE_LENGTH_OF_ARRAY(uploadMethods); ++uploadMethodNdx)
7191*35238bceSAndroid Build Coastguard Worker {
7192*35238bceSAndroid Build Coastguard Worker const std::string name = std::string() + drawMethods[drawMethodNdx].name +
7193*35238bceSAndroid Build Coastguard Worker "_upload_unrelated_with_" + uploadMethods[uploadMethodNdx].name;
7194*35238bceSAndroid Build Coastguard Worker const std::string desc = std::string() + "Measure time consumed by " +
7195*35238bceSAndroid Build Coastguard Worker drawMethods[drawMethodNdx].description +
7196*35238bceSAndroid Build Coastguard Worker " function call after an unrelated upload";
7197*35238bceSAndroid Build Coastguard Worker
7198*35238bceSAndroid Build Coastguard Worker // Time consumed by rendering command after an unrelated upload
7199*35238bceSAndroid Build Coastguard Worker
7200*35238bceSAndroid Build Coastguard Worker uploadUnrelatedGroup->addChild(new UnrelatedUploadRenderTimeCase(
7201*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), desc.c_str(), drawMethods[drawMethodNdx].drawMethod,
7202*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].uploadMethod));
7203*35238bceSAndroid Build Coastguard Worker }
7204*35238bceSAndroid Build Coastguard Worker }
7205*35238bceSAndroid Build Coastguard Worker
7206*35238bceSAndroid Build Coastguard Worker // .upload_and_draw
7207*35238bceSAndroid Build Coastguard Worker {
7208*35238bceSAndroid Build Coastguard Worker static const struct
7209*35238bceSAndroid Build Coastguard Worker {
7210*35238bceSAndroid Build Coastguard Worker const char *name;
7211*35238bceSAndroid Build Coastguard Worker const char *description;
7212*35238bceSAndroid Build Coastguard Worker BufferState bufferState;
7213*35238bceSAndroid Build Coastguard Worker UnrelatedBufferType unrelatedBuffer;
7214*35238bceSAndroid Build Coastguard Worker bool supportsPartialUpload;
7215*35238bceSAndroid Build Coastguard Worker } bufferConfigs[] = {
7216*35238bceSAndroid Build Coastguard Worker {"used_buffer", "Upload to an used buffer", BUFFERSTATE_EXISTING, UNRELATEDBUFFERTYPE_NONE, true},
7217*35238bceSAndroid Build Coastguard Worker {"new_buffer", "Upload to a new buffer", BUFFERSTATE_NEW, UNRELATEDBUFFERTYPE_NONE, false},
7218*35238bceSAndroid Build Coastguard Worker {"used_buffer_and_unrelated_upload", "Upload to an used buffer and an unrelated buffer and then draw",
7219*35238bceSAndroid Build Coastguard Worker BUFFERSTATE_EXISTING, UNRELATEDBUFFERTYPE_VERTEX, true},
7220*35238bceSAndroid Build Coastguard Worker {"new_buffer_and_unrelated_upload", "Upload to a new buffer and an unrelated buffer and then draw",
7221*35238bceSAndroid Build Coastguard Worker BUFFERSTATE_NEW, UNRELATEDBUFFERTYPE_VERTEX, false},
7222*35238bceSAndroid Build Coastguard Worker };
7223*35238bceSAndroid Build Coastguard Worker
7224*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const uploadAndDrawGroup = new tcu::TestCaseGroup(
7225*35238bceSAndroid Build Coastguard Worker m_testCtx, "upload_and_draw", "Time usage of rendering functions with modified buffers");
7226*35238bceSAndroid Build Coastguard Worker renderAfterUploadGroup->addChild(uploadAndDrawGroup);
7227*35238bceSAndroid Build Coastguard Worker
7228*35238bceSAndroid Build Coastguard Worker // .used_buffer
7229*35238bceSAndroid Build Coastguard Worker // .new_buffer
7230*35238bceSAndroid Build Coastguard Worker // .used_buffer_and_unrelated_upload
7231*35238bceSAndroid Build Coastguard Worker // .new_buffer_and_unrelated_upload
7232*35238bceSAndroid Build Coastguard Worker for (int stateNdx = 0; stateNdx < DE_LENGTH_OF_ARRAY(bufferConfigs); ++stateNdx)
7233*35238bceSAndroid Build Coastguard Worker {
7234*35238bceSAndroid Build Coastguard Worker static const struct
7235*35238bceSAndroid Build Coastguard Worker {
7236*35238bceSAndroid Build Coastguard Worker const char *name;
7237*35238bceSAndroid Build Coastguard Worker const char *description;
7238*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod;
7239*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer;
7240*35238bceSAndroid Build Coastguard Worker bool partial;
7241*35238bceSAndroid Build Coastguard Worker } uploadTargets[] = {
7242*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices",
7243*35238bceSAndroid Build Coastguard Worker "Measure time consumed by vertex attribute upload, drawArrays, and readPixels function calls",
7244*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, false},
7245*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices_partial",
7246*35238bceSAndroid Build Coastguard Worker "Measure time consumed by partial vertex attribute upload, drawArrays, and readPixels function "
7247*35238bceSAndroid Build Coastguard Worker "calls",
7248*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, true},
7249*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_vertices",
7250*35238bceSAndroid Build Coastguard Worker "Measure time consumed by vertex attribute upload, drawElements, and readPixels function calls",
7251*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_VERTEX, false},
7252*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices",
7253*35238bceSAndroid Build Coastguard Worker "Measure time consumed by index upload, drawElements, and readPixels function calls",
7254*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, false},
7255*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices_partial",
7256*35238bceSAndroid Build Coastguard Worker "Measure time consumed by partial index upload, drawElements, and readPixels function calls",
7257*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, true},
7258*35238bceSAndroid Build Coastguard Worker };
7259*35238bceSAndroid Build Coastguard Worker static const struct
7260*35238bceSAndroid Build Coastguard Worker {
7261*35238bceSAndroid Build Coastguard Worker const char *name;
7262*35238bceSAndroid Build Coastguard Worker const char *description;
7263*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod;
7264*35238bceSAndroid Build Coastguard Worker bool supportsPartialUpload;
7265*35238bceSAndroid Build Coastguard Worker } uploadMethods[] = {
7266*35238bceSAndroid Build Coastguard Worker {"buffer_data", "bufferData", UPLOADMETHOD_BUFFER_DATA, false},
7267*35238bceSAndroid Build Coastguard Worker {"buffer_sub_data", "bufferSubData", UPLOADMETHOD_BUFFER_SUB_DATA, true},
7268*35238bceSAndroid Build Coastguard Worker {"map_buffer_range", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE, true},
7269*35238bceSAndroid Build Coastguard Worker };
7270*35238bceSAndroid Build Coastguard Worker
7271*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const group = new tcu::TestCaseGroup(m_testCtx, bufferConfigs[stateNdx].name,
7272*35238bceSAndroid Build Coastguard Worker bufferConfigs[stateNdx].description);
7273*35238bceSAndroid Build Coastguard Worker uploadAndDrawGroup->addChild(group);
7274*35238bceSAndroid Build Coastguard Worker
7275*35238bceSAndroid Build Coastguard Worker for (int uploadTargetNdx = 0; uploadTargetNdx < DE_LENGTH_OF_ARRAY(uploadTargets); ++uploadTargetNdx)
7276*35238bceSAndroid Build Coastguard Worker for (int uploadMethodNdx = 0; uploadMethodNdx < DE_LENGTH_OF_ARRAY(uploadMethods);
7277*35238bceSAndroid Build Coastguard Worker ++uploadMethodNdx)
7278*35238bceSAndroid Build Coastguard Worker {
7279*35238bceSAndroid Build Coastguard Worker const std::string name = std::string() + uploadTargets[uploadTargetNdx].name + "_with_" +
7280*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].name;
7281*35238bceSAndroid Build Coastguard Worker
7282*35238bceSAndroid Build Coastguard Worker if (uploadTargets[uploadTargetNdx].partial &&
7283*35238bceSAndroid Build Coastguard Worker !uploadMethods[uploadMethodNdx].supportsPartialUpload)
7284*35238bceSAndroid Build Coastguard Worker continue;
7285*35238bceSAndroid Build Coastguard Worker if (uploadTargets[uploadTargetNdx].partial && !bufferConfigs[stateNdx].supportsPartialUpload)
7286*35238bceSAndroid Build Coastguard Worker continue;
7287*35238bceSAndroid Build Coastguard Worker
7288*35238bceSAndroid Build Coastguard Worker // Don't log unrelated buffer information to samples if there is no such buffer
7289*35238bceSAndroid Build Coastguard Worker
7290*35238bceSAndroid Build Coastguard Worker if (bufferConfigs[stateNdx].unrelatedBuffer == UNRELATEDBUFFERTYPE_NONE)
7291*35238bceSAndroid Build Coastguard Worker {
7292*35238bceSAndroid Build Coastguard Worker typedef UploadRenderReadDuration SampleType;
7293*35238bceSAndroid Build Coastguard Worker typedef GenericUploadRenderTimeCase<SampleType> TestType;
7294*35238bceSAndroid Build Coastguard Worker
7295*35238bceSAndroid Build Coastguard Worker group->addChild(new TestType(
7296*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), uploadTargets[uploadTargetNdx].description,
7297*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].drawMethod, uploadTargets[uploadTargetNdx].targetBuffer,
7298*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].uploadMethod, bufferConfigs[stateNdx].bufferState,
7299*35238bceSAndroid Build Coastguard Worker (uploadTargets[uploadTargetNdx].partial) ? (UPLOADRANGE_PARTIAL) : (UPLOADRANGE_FULL),
7300*35238bceSAndroid Build Coastguard Worker bufferConfigs[stateNdx].unrelatedBuffer));
7301*35238bceSAndroid Build Coastguard Worker }
7302*35238bceSAndroid Build Coastguard Worker else
7303*35238bceSAndroid Build Coastguard Worker {
7304*35238bceSAndroid Build Coastguard Worker typedef UploadRenderReadDurationWithUnrelatedUploadSize SampleType;
7305*35238bceSAndroid Build Coastguard Worker typedef GenericUploadRenderTimeCase<SampleType> TestType;
7306*35238bceSAndroid Build Coastguard Worker
7307*35238bceSAndroid Build Coastguard Worker group->addChild(new TestType(
7308*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), uploadTargets[uploadTargetNdx].description,
7309*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].drawMethod, uploadTargets[uploadTargetNdx].targetBuffer,
7310*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].uploadMethod, bufferConfigs[stateNdx].bufferState,
7311*35238bceSAndroid Build Coastguard Worker (uploadTargets[uploadTargetNdx].partial) ? (UPLOADRANGE_PARTIAL) : (UPLOADRANGE_FULL),
7312*35238bceSAndroid Build Coastguard Worker bufferConfigs[stateNdx].unrelatedBuffer));
7313*35238bceSAndroid Build Coastguard Worker }
7314*35238bceSAndroid Build Coastguard Worker }
7315*35238bceSAndroid Build Coastguard Worker }
7316*35238bceSAndroid Build Coastguard Worker }
7317*35238bceSAndroid Build Coastguard Worker
7318*35238bceSAndroid Build Coastguard Worker // .draw_modify_draw
7319*35238bceSAndroid Build Coastguard Worker {
7320*35238bceSAndroid Build Coastguard Worker static const struct
7321*35238bceSAndroid Build Coastguard Worker {
7322*35238bceSAndroid Build Coastguard Worker const char *name;
7323*35238bceSAndroid Build Coastguard Worker const char *description;
7324*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod;
7325*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer;
7326*35238bceSAndroid Build Coastguard Worker bool partial;
7327*35238bceSAndroid Build Coastguard Worker } uploadTargets[] = {
7328*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices",
7329*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawArrays, vertex attribute upload, another drawArrays, and readPixels "
7330*35238bceSAndroid Build Coastguard Worker "function calls.",
7331*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, false},
7332*35238bceSAndroid Build Coastguard Worker {"draw_arrays_upload_vertices_partial",
7333*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawArrays, partial vertex attribute upload, another drawArrays, and "
7334*35238bceSAndroid Build Coastguard Worker "readPixels function calls.",
7335*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ARRAYS, TARGETBUFFER_VERTEX, true},
7336*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_vertices",
7337*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, vertex attribute upload, another drawElements, and readPixels "
7338*35238bceSAndroid Build Coastguard Worker "function calls.",
7339*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_VERTEX, false},
7340*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices",
7341*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, index upload, another drawElements, and readPixels function "
7342*35238bceSAndroid Build Coastguard Worker "calls.",
7343*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, false},
7344*35238bceSAndroid Build Coastguard Worker {"draw_elements_upload_indices_partial",
7345*35238bceSAndroid Build Coastguard Worker "Measure time consumed by drawElements, partial index upload, another drawElements, and readPixels "
7346*35238bceSAndroid Build Coastguard Worker "function calls.",
7347*35238bceSAndroid Build Coastguard Worker DRAWMETHOD_DRAW_ELEMENTS, TARGETBUFFER_INDEX, true},
7348*35238bceSAndroid Build Coastguard Worker };
7349*35238bceSAndroid Build Coastguard Worker static const struct
7350*35238bceSAndroid Build Coastguard Worker {
7351*35238bceSAndroid Build Coastguard Worker const char *name;
7352*35238bceSAndroid Build Coastguard Worker const char *description;
7353*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod;
7354*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MapFlags mapFlags;
7355*35238bceSAndroid Build Coastguard Worker bool supportsPartialUpload;
7356*35238bceSAndroid Build Coastguard Worker } uploadMethods[] = {
7357*35238bceSAndroid Build Coastguard Worker {"buffer_data", "bufferData", UPLOADMETHOD_BUFFER_DATA, BufferInUseRenderTimeCase::MAPFLAG_NONE, false},
7358*35238bceSAndroid Build Coastguard Worker {"buffer_sub_data", "bufferSubData", UPLOADMETHOD_BUFFER_SUB_DATA,
7359*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_NONE, true},
7360*35238bceSAndroid Build Coastguard Worker {"map_buffer_range_invalidate_range", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE,
7361*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_INVALIDATE_RANGE, true},
7362*35238bceSAndroid Build Coastguard Worker {"map_buffer_range_invalidate_buffer", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE,
7363*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::MAPFLAG_INVALIDATE_BUFFER, false},
7364*35238bceSAndroid Build Coastguard Worker };
7365*35238bceSAndroid Build Coastguard Worker
7366*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const drawModifyDrawGroup = new tcu::TestCaseGroup(
7367*35238bceSAndroid Build Coastguard Worker m_testCtx, "draw_modify_draw",
7368*35238bceSAndroid Build Coastguard Worker "Time used in rendering functions with modified buffers while original buffer is still in use");
7369*35238bceSAndroid Build Coastguard Worker renderAfterUploadGroup->addChild(drawModifyDrawGroup);
7370*35238bceSAndroid Build Coastguard Worker
7371*35238bceSAndroid Build Coastguard Worker for (int uploadTargetNdx = 0; uploadTargetNdx < DE_LENGTH_OF_ARRAY(uploadTargets); ++uploadTargetNdx)
7372*35238bceSAndroid Build Coastguard Worker for (int uploadMethodNdx = 0; uploadMethodNdx < DE_LENGTH_OF_ARRAY(uploadMethods); ++uploadMethodNdx)
7373*35238bceSAndroid Build Coastguard Worker {
7374*35238bceSAndroid Build Coastguard Worker const std::string name = std::string() + uploadTargets[uploadTargetNdx].name + "_with_" +
7375*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].name;
7376*35238bceSAndroid Build Coastguard Worker
7377*35238bceSAndroid Build Coastguard Worker if (uploadTargets[uploadTargetNdx].partial && !uploadMethods[uploadMethodNdx].supportsPartialUpload)
7378*35238bceSAndroid Build Coastguard Worker continue;
7379*35238bceSAndroid Build Coastguard Worker
7380*35238bceSAndroid Build Coastguard Worker drawModifyDrawGroup->addChild(new BufferInUseRenderTimeCase(
7381*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), uploadTargets[uploadTargetNdx].description,
7382*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].drawMethod, uploadMethods[uploadMethodNdx].mapFlags,
7383*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].targetBuffer, uploadMethods[uploadMethodNdx].uploadMethod,
7384*35238bceSAndroid Build Coastguard Worker (uploadTargets[uploadTargetNdx].partial) ? (UPLOADRANGE_PARTIAL) : (UPLOADRANGE_FULL),
7385*35238bceSAndroid Build Coastguard Worker BufferInUseRenderTimeCase::UPLOADBUFFERTARGET_SAME_BUFFER));
7386*35238bceSAndroid Build Coastguard Worker }
7387*35238bceSAndroid Build Coastguard Worker }
7388*35238bceSAndroid Build Coastguard Worker
7389*35238bceSAndroid Build Coastguard Worker // .upload_wait_draw
7390*35238bceSAndroid Build Coastguard Worker {
7391*35238bceSAndroid Build Coastguard Worker static const struct
7392*35238bceSAndroid Build Coastguard Worker {
7393*35238bceSAndroid Build Coastguard Worker const char *name;
7394*35238bceSAndroid Build Coastguard Worker const char *description;
7395*35238bceSAndroid Build Coastguard Worker BufferState bufferState;
7396*35238bceSAndroid Build Coastguard Worker } bufferStates[] = {
7397*35238bceSAndroid Build Coastguard Worker {"new_buffer", "Uploading to just generated name", BUFFERSTATE_NEW},
7398*35238bceSAndroid Build Coastguard Worker {"used_buffer", "Uploading to a used buffer", BUFFERSTATE_EXISTING},
7399*35238bceSAndroid Build Coastguard Worker };
7400*35238bceSAndroid Build Coastguard Worker static const struct
7401*35238bceSAndroid Build Coastguard Worker {
7402*35238bceSAndroid Build Coastguard Worker const char *name;
7403*35238bceSAndroid Build Coastguard Worker const char *description;
7404*35238bceSAndroid Build Coastguard Worker DrawMethod drawMethod;
7405*35238bceSAndroid Build Coastguard Worker TargetBuffer targetBuffer;
7406*35238bceSAndroid Build Coastguard Worker } uploadTargets[] = {
7407*35238bceSAndroid Build Coastguard Worker {"draw_arrays_vertices", "Upload vertex data, draw with drawArrays", DRAWMETHOD_DRAW_ARRAYS,
7408*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_VERTEX},
7409*35238bceSAndroid Build Coastguard Worker {"draw_elements_vertices", "Upload vertex data, draw with drawElements", DRAWMETHOD_DRAW_ELEMENTS,
7410*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_VERTEX},
7411*35238bceSAndroid Build Coastguard Worker {"draw_elements_indices", "Upload index data, draw with drawElements", DRAWMETHOD_DRAW_ELEMENTS,
7412*35238bceSAndroid Build Coastguard Worker TARGETBUFFER_INDEX},
7413*35238bceSAndroid Build Coastguard Worker };
7414*35238bceSAndroid Build Coastguard Worker static const struct
7415*35238bceSAndroid Build Coastguard Worker {
7416*35238bceSAndroid Build Coastguard Worker const char *name;
7417*35238bceSAndroid Build Coastguard Worker const char *description;
7418*35238bceSAndroid Build Coastguard Worker UploadMethod uploadMethod;
7419*35238bceSAndroid Build Coastguard Worker } uploadMethods[] = {
7420*35238bceSAndroid Build Coastguard Worker {"buffer_data", "bufferData", UPLOADMETHOD_BUFFER_DATA},
7421*35238bceSAndroid Build Coastguard Worker {"buffer_sub_data", "bufferSubData", UPLOADMETHOD_BUFFER_SUB_DATA},
7422*35238bceSAndroid Build Coastguard Worker {"map_buffer_range", "mapBufferRange", UPLOADMETHOD_MAP_BUFFER_RANGE},
7423*35238bceSAndroid Build Coastguard Worker };
7424*35238bceSAndroid Build Coastguard Worker
7425*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const uploadSwapDrawGroup = new tcu::TestCaseGroup(
7426*35238bceSAndroid Build Coastguard Worker m_testCtx, "upload_wait_draw", "Time used in rendering functions after a buffer upload N frames ago");
7427*35238bceSAndroid Build Coastguard Worker renderAfterUploadGroup->addChild(uploadSwapDrawGroup);
7428*35238bceSAndroid Build Coastguard Worker
7429*35238bceSAndroid Build Coastguard Worker for (int bufferStateNdx = 0; bufferStateNdx < DE_LENGTH_OF_ARRAY(bufferStates); ++bufferStateNdx)
7430*35238bceSAndroid Build Coastguard Worker {
7431*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const bufferGroup = new tcu::TestCaseGroup(
7432*35238bceSAndroid Build Coastguard Worker m_testCtx, bufferStates[bufferStateNdx].name, bufferStates[bufferStateNdx].description);
7433*35238bceSAndroid Build Coastguard Worker uploadSwapDrawGroup->addChild(bufferGroup);
7434*35238bceSAndroid Build Coastguard Worker
7435*35238bceSAndroid Build Coastguard Worker for (int uploadTargetNdx = 0; uploadTargetNdx < DE_LENGTH_OF_ARRAY(uploadTargets); ++uploadTargetNdx)
7436*35238bceSAndroid Build Coastguard Worker for (int uploadMethodNdx = 0; uploadMethodNdx < DE_LENGTH_OF_ARRAY(uploadMethods);
7437*35238bceSAndroid Build Coastguard Worker ++uploadMethodNdx)
7438*35238bceSAndroid Build Coastguard Worker {
7439*35238bceSAndroid Build Coastguard Worker const std::string name = std::string() + uploadTargets[uploadTargetNdx].name + "_with_" +
7440*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].name;
7441*35238bceSAndroid Build Coastguard Worker
7442*35238bceSAndroid Build Coastguard Worker bufferGroup->addChild(new UploadWaitDrawCase(
7443*35238bceSAndroid Build Coastguard Worker m_context, name.c_str(), uploadTargets[uploadTargetNdx].description,
7444*35238bceSAndroid Build Coastguard Worker uploadTargets[uploadTargetNdx].drawMethod, uploadTargets[uploadTargetNdx].targetBuffer,
7445*35238bceSAndroid Build Coastguard Worker uploadMethods[uploadMethodNdx].uploadMethod, bufferStates[bufferStateNdx].bufferState));
7446*35238bceSAndroid Build Coastguard Worker }
7447*35238bceSAndroid Build Coastguard Worker }
7448*35238bceSAndroid Build Coastguard Worker }
7449*35238bceSAndroid Build Coastguard Worker }
7450*35238bceSAndroid Build Coastguard Worker }
7451*35238bceSAndroid Build Coastguard Worker
7452*35238bceSAndroid Build Coastguard Worker } // namespace Performance
7453*35238bceSAndroid Build Coastguard Worker } // namespace gles3
7454*35238bceSAndroid Build Coastguard Worker } // namespace deqp
7455