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 map tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fBufferMapTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsBufferTestUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
28*35238bceSAndroid Build Coastguard Worker #include "deString.h"
29*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker #include <algorithm>
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker using std::set;
35*35238bceSAndroid Build Coastguard Worker using std::string;
36*35238bceSAndroid Build Coastguard Worker using std::vector;
37*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker namespace deqp
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace gles3
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace Functional
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker using namespace gls::BufferTestUtil;
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker // Test cases.
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker class BufferMapReadCase : public BufferCase
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker public:
BufferMapReadCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,int bufferSize,int mapOffset,int mapSize,WriteType write)53*35238bceSAndroid Build Coastguard Worker BufferMapReadCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget, uint32_t usage,
54*35238bceSAndroid Build Coastguard Worker int bufferSize, int mapOffset, int mapSize, WriteType write)
55*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
56*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
57*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
58*35238bceSAndroid Build Coastguard Worker , m_bufferSize(bufferSize)
59*35238bceSAndroid Build Coastguard Worker , m_mapOffset(mapOffset)
60*35238bceSAndroid Build Coastguard Worker , m_mapSize(mapSize)
61*35238bceSAndroid Build Coastguard Worker , m_write(write)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
iterate(void)65*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
68*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
69*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
70*35238bceSAndroid Build Coastguard Worker BufferWriter writer(m_renderCtx, m_testCtx.getLog(), m_write);
71*35238bceSAndroid Build Coastguard Worker bool isOk = false;
72*35238bceSAndroid Build Coastguard Worker
73*35238bceSAndroid Build Coastguard Worker // Setup reference data.
74*35238bceSAndroid Build Coastguard Worker refBuf.setSize(m_bufferSize);
75*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
76*35238bceSAndroid Build Coastguard Worker
77*35238bceSAndroid Build Coastguard Worker uint32_t buf = genBuffer();
78*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
79*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, m_bufferSize, DE_NULL, m_usage);
80*35238bceSAndroid Build Coastguard Worker writer.write(buf, 0, m_bufferSize, refBuf.getPtr(), m_bufferTarget);
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
83*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_READ_BIT);
84*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
85*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker isOk = compareByteArrays(log, (const uint8_t *)ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
88*35238bceSAndroid Build Coastguard Worker
89*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
90*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
95*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
96*35238bceSAndroid Build Coastguard Worker return STOP;
97*35238bceSAndroid Build Coastguard Worker }
98*35238bceSAndroid Build Coastguard Worker
99*35238bceSAndroid Build Coastguard Worker private:
100*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
101*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
102*35238bceSAndroid Build Coastguard Worker int m_bufferSize;
103*35238bceSAndroid Build Coastguard Worker int m_mapOffset;
104*35238bceSAndroid Build Coastguard Worker int m_mapSize;
105*35238bceSAndroid Build Coastguard Worker WriteType m_write;
106*35238bceSAndroid Build Coastguard Worker };
107*35238bceSAndroid Build Coastguard Worker
108*35238bceSAndroid Build Coastguard Worker class BufferMapWriteCase : public BufferCase
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker public:
BufferMapWriteCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,int size,VerifyType verify)111*35238bceSAndroid Build Coastguard Worker BufferMapWriteCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget, uint32_t usage,
112*35238bceSAndroid Build Coastguard Worker int size, VerifyType verify)
113*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
114*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
115*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
116*35238bceSAndroid Build Coastguard Worker , m_size(size)
117*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker }
120*35238bceSAndroid Build Coastguard Worker
iterate(void)121*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
122*35238bceSAndroid Build Coastguard Worker {
123*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
124*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
125*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker // Setup reference data.
128*35238bceSAndroid Build Coastguard Worker refBuf.setSize(m_size);
129*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), m_size, dataSeed);
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker uint32_t buf = genBuffer();
132*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
133*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, m_size, DE_NULL, m_usage);
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, 0, m_size, GL_MAP_WRITE_BIT);
136*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
137*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
138*35238bceSAndroid Build Coastguard Worker
139*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes((uint8_t *)ptr, m_size, dataSeed);
140*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
141*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker bool isOk = verifier.verify(buf, refBuf.getPtr(), 0, m_size, m_bufferTarget);
144*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
147*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
148*35238bceSAndroid Build Coastguard Worker return STOP;
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker
151*35238bceSAndroid Build Coastguard Worker private:
152*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
153*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
154*35238bceSAndroid Build Coastguard Worker int m_size;
155*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
156*35238bceSAndroid Build Coastguard Worker };
157*35238bceSAndroid Build Coastguard Worker
158*35238bceSAndroid Build Coastguard Worker class BufferPartialMapWriteCase : public BufferCase
159*35238bceSAndroid Build Coastguard Worker {
160*35238bceSAndroid Build Coastguard Worker public:
BufferPartialMapWriteCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,int bufferSize,int mapOffset,int mapSize,VerifyType verify)161*35238bceSAndroid Build Coastguard Worker BufferPartialMapWriteCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget,
162*35238bceSAndroid Build Coastguard Worker uint32_t usage, int bufferSize, int mapOffset, int mapSize, VerifyType verify)
163*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
164*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
165*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
166*35238bceSAndroid Build Coastguard Worker , m_bufferSize(bufferSize)
167*35238bceSAndroid Build Coastguard Worker , m_mapOffset(mapOffset)
168*35238bceSAndroid Build Coastguard Worker , m_mapSize(mapSize)
169*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker
iterate(void)173*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
176*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
177*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker // Setup reference data.
180*35238bceSAndroid Build Coastguard Worker refBuf.setSize(m_bufferSize);
181*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker uint32_t buf = genBuffer();
184*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
185*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, m_bufferSize, refBuf.getPtr(), m_usage);
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker // Do reference map.
188*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(m_mapOffset), m_mapSize, dataSeed & 0xabcdef);
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_WRITE_BIT);
191*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
192*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
193*35238bceSAndroid Build Coastguard Worker
194*35238bceSAndroid Build Coastguard Worker deMemcpy(ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
195*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
196*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker bool isOk = verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget);
199*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
200*35238bceSAndroid Build Coastguard Worker
201*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
202*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
203*35238bceSAndroid Build Coastguard Worker return STOP;
204*35238bceSAndroid Build Coastguard Worker }
205*35238bceSAndroid Build Coastguard Worker
206*35238bceSAndroid Build Coastguard Worker private:
207*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
208*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
209*35238bceSAndroid Build Coastguard Worker int m_bufferSize;
210*35238bceSAndroid Build Coastguard Worker int m_mapOffset;
211*35238bceSAndroid Build Coastguard Worker int m_mapSize;
212*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
213*35238bceSAndroid Build Coastguard Worker };
214*35238bceSAndroid Build Coastguard Worker
215*35238bceSAndroid Build Coastguard Worker class BufferMapInvalidateCase : public BufferCase
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker public:
BufferMapInvalidateCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,bool partialWrite,VerifyType verify)218*35238bceSAndroid Build Coastguard Worker BufferMapInvalidateCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget, uint32_t usage,
219*35238bceSAndroid Build Coastguard Worker bool partialWrite, VerifyType verify)
220*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
221*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
222*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
223*35238bceSAndroid Build Coastguard Worker , m_partialWrite(partialWrite)
224*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker
iterate(void)228*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
229*35238bceSAndroid Build Coastguard Worker {
230*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
231*35238bceSAndroid Build Coastguard Worker uint32_t buf = 0;
232*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
233*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
234*35238bceSAndroid Build Coastguard Worker const int bufferSize = 1300;
235*35238bceSAndroid Build Coastguard Worker const int mapOffset = 200;
236*35238bceSAndroid Build Coastguard Worker const int mapSize = 1011;
237*35238bceSAndroid Build Coastguard Worker const int mapWriteOffs = m_partialWrite ? 91 : 0;
238*35238bceSAndroid Build Coastguard Worker const int verifyOffset = mapOffset + mapWriteOffs;
239*35238bceSAndroid Build Coastguard Worker const int verifySize = mapSize - mapWriteOffs;
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker // Setup reference data.
242*35238bceSAndroid Build Coastguard Worker refBuf.setSize(bufferSize);
243*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Worker buf = genBuffer();
246*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
247*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker // Do reference map.
250*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(mapOffset + mapWriteOffs), mapSize - mapWriteOffs, dataSeed & 0xabcdef);
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker void *ptr =
253*35238bceSAndroid Build Coastguard Worker glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
254*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
255*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
256*35238bceSAndroid Build Coastguard Worker
257*35238bceSAndroid Build Coastguard Worker deMemcpy((uint8_t *)ptr + mapWriteOffs, refBuf.getPtr(mapOffset + mapWriteOffs), mapSize - mapWriteOffs);
258*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
259*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
260*35238bceSAndroid Build Coastguard Worker
261*35238bceSAndroid Build Coastguard Worker bool isOk = verifier.verify(buf, refBuf.getPtr(), verifyOffset, verifySize, m_bufferTarget);
262*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
265*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
266*35238bceSAndroid Build Coastguard Worker return STOP;
267*35238bceSAndroid Build Coastguard Worker }
268*35238bceSAndroid Build Coastguard Worker
269*35238bceSAndroid Build Coastguard Worker private:
270*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
271*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
272*35238bceSAndroid Build Coastguard Worker bool m_partialWrite;
273*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
274*35238bceSAndroid Build Coastguard Worker };
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker class BufferMapPartialInvalidateCase : public BufferCase
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker public:
BufferMapPartialInvalidateCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,bool partialWrite,VerifyType verify)279*35238bceSAndroid Build Coastguard Worker BufferMapPartialInvalidateCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget,
280*35238bceSAndroid Build Coastguard Worker uint32_t usage, bool partialWrite, VerifyType verify)
281*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
282*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
283*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
284*35238bceSAndroid Build Coastguard Worker , m_partialWrite(partialWrite)
285*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker }
288*35238bceSAndroid Build Coastguard Worker
iterate(void)289*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
292*35238bceSAndroid Build Coastguard Worker uint32_t buf = 0;
293*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
294*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
295*35238bceSAndroid Build Coastguard Worker const int bufferSize = 1300;
296*35238bceSAndroid Build Coastguard Worker const int mapOffset = 200;
297*35238bceSAndroid Build Coastguard Worker const int mapSize = 1011;
298*35238bceSAndroid Build Coastguard Worker const int mapWriteOffs = m_partialWrite ? 91 : 0;
299*35238bceSAndroid Build Coastguard Worker const int verifyOffset = m_partialWrite ? mapOffset + mapWriteOffs : 0;
300*35238bceSAndroid Build Coastguard Worker const int verifySize = bufferSize - verifyOffset;
301*35238bceSAndroid Build Coastguard Worker
302*35238bceSAndroid Build Coastguard Worker // Setup reference data.
303*35238bceSAndroid Build Coastguard Worker refBuf.setSize(bufferSize);
304*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
305*35238bceSAndroid Build Coastguard Worker
306*35238bceSAndroid Build Coastguard Worker buf = genBuffer();
307*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
308*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker // Do reference map.
311*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(mapOffset + mapWriteOffs), mapSize - mapWriteOffs, dataSeed & 0xabcdef);
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Worker void *ptr =
314*35238bceSAndroid Build Coastguard Worker glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
315*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
316*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker deMemcpy((uint8_t *)ptr + mapWriteOffs, refBuf.getPtr(mapOffset + mapWriteOffs), mapSize - mapWriteOffs);
319*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
320*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
321*35238bceSAndroid Build Coastguard Worker
322*35238bceSAndroid Build Coastguard Worker bool isOk = verifier.verify(buf, refBuf.getPtr(), verifyOffset, verifySize, m_bufferTarget);
323*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
324*35238bceSAndroid Build Coastguard Worker
325*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
326*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
327*35238bceSAndroid Build Coastguard Worker return STOP;
328*35238bceSAndroid Build Coastguard Worker }
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker private:
331*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
332*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
333*35238bceSAndroid Build Coastguard Worker bool m_partialWrite;
334*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
335*35238bceSAndroid Build Coastguard Worker };
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker class BufferMapExplicitFlushCase : public BufferCase
338*35238bceSAndroid Build Coastguard Worker {
339*35238bceSAndroid Build Coastguard Worker public:
BufferMapExplicitFlushCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,bool partialWrite,VerifyType verify)340*35238bceSAndroid Build Coastguard Worker BufferMapExplicitFlushCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget,
341*35238bceSAndroid Build Coastguard Worker uint32_t usage, bool partialWrite, VerifyType verify)
342*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
343*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
344*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
345*35238bceSAndroid Build Coastguard Worker , m_partialWrite(partialWrite)
346*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
347*35238bceSAndroid Build Coastguard Worker {
348*35238bceSAndroid Build Coastguard Worker }
349*35238bceSAndroid Build Coastguard Worker
iterate(void)350*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
351*35238bceSAndroid Build Coastguard Worker {
352*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
353*35238bceSAndroid Build Coastguard Worker uint32_t buf = 0;
354*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
355*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
356*35238bceSAndroid Build Coastguard Worker const int bufferSize = 1300;
357*35238bceSAndroid Build Coastguard Worker const int mapOffset = 200;
358*35238bceSAndroid Build Coastguard Worker const int mapSize = 1011;
359*35238bceSAndroid Build Coastguard Worker const int sliceAOffs = m_partialWrite ? 1 : 0;
360*35238bceSAndroid Build Coastguard Worker const int sliceASize = m_partialWrite ? 96 : 473;
361*35238bceSAndroid Build Coastguard Worker const int sliceBOffs = m_partialWrite ? 503 : sliceAOffs + sliceASize;
362*35238bceSAndroid Build Coastguard Worker const int sliceBSize = mapSize - sliceBOffs;
363*35238bceSAndroid Build Coastguard Worker bool isOk = true;
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker // Setup reference data.
366*35238bceSAndroid Build Coastguard Worker refBuf.setSize(bufferSize);
367*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
368*35238bceSAndroid Build Coastguard Worker
369*35238bceSAndroid Build Coastguard Worker buf = genBuffer();
370*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
371*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
372*35238bceSAndroid Build Coastguard Worker
373*35238bceSAndroid Build Coastguard Worker // Do reference map.
374*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(mapOffset), mapSize, dataSeed & 0xabcdef);
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
377*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
378*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker deMemcpy(ptr, refBuf.getPtr(mapOffset), mapSize);
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker glFlushMappedBufferRange(m_bufferTarget, sliceAOffs, sliceASize);
383*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glFlushMappedBufferRange");
384*35238bceSAndroid Build Coastguard Worker glFlushMappedBufferRange(m_bufferTarget, sliceBOffs, sliceBSize);
385*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glFlushMappedBufferRange");
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
388*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
389*35238bceSAndroid Build Coastguard Worker
390*35238bceSAndroid Build Coastguard Worker if (m_partialWrite)
391*35238bceSAndroid Build Coastguard Worker {
392*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), mapOffset + sliceAOffs, sliceASize, m_bufferTarget))
393*35238bceSAndroid Build Coastguard Worker isOk = false;
394*35238bceSAndroid Build Coastguard Worker
395*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), mapOffset + sliceBOffs, sliceBSize, m_bufferTarget))
396*35238bceSAndroid Build Coastguard Worker isOk = false;
397*35238bceSAndroid Build Coastguard Worker }
398*35238bceSAndroid Build Coastguard Worker else
399*35238bceSAndroid Build Coastguard Worker {
400*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), mapOffset, mapSize, m_bufferTarget))
401*35238bceSAndroid Build Coastguard Worker isOk = false;
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
407*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
408*35238bceSAndroid Build Coastguard Worker return STOP;
409*35238bceSAndroid Build Coastguard Worker }
410*35238bceSAndroid Build Coastguard Worker
411*35238bceSAndroid Build Coastguard Worker private:
412*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
413*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
414*35238bceSAndroid Build Coastguard Worker bool m_partialWrite;
415*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
416*35238bceSAndroid Build Coastguard Worker };
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker class BufferMapUnsyncWriteCase : public BufferCase
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker public:
BufferMapUnsyncWriteCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage)421*35238bceSAndroid Build Coastguard Worker BufferMapUnsyncWriteCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget,
422*35238bceSAndroid Build Coastguard Worker uint32_t usage)
423*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
424*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
425*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
426*35238bceSAndroid Build Coastguard Worker {
427*35238bceSAndroid Build Coastguard Worker }
428*35238bceSAndroid Build Coastguard Worker
iterate(void)429*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
430*35238bceSAndroid Build Coastguard Worker {
431*35238bceSAndroid Build Coastguard Worker VertexArrayVerifier verifier(m_renderCtx, m_testCtx.getLog());
432*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
433*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
434*35238bceSAndroid Build Coastguard Worker uint32_t buf = 0;
435*35238bceSAndroid Build Coastguard Worker bool isOk = true;
436*35238bceSAndroid Build Coastguard Worker const int size = 1200;
437*35238bceSAndroid Build Coastguard Worker
438*35238bceSAndroid Build Coastguard Worker // Setup reference data.
439*35238bceSAndroid Build Coastguard Worker refBuf.setSize(size);
440*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), size, dataSeed);
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Worker buf = genBuffer();
443*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
444*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, size, refBuf.getPtr(), m_usage);
445*35238bceSAndroid Build Coastguard Worker
446*35238bceSAndroid Build Coastguard Worker // Use for rendering.
447*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), 0, size))
448*35238bceSAndroid Build Coastguard Worker isOk = false;
449*35238bceSAndroid Build Coastguard Worker // \note ReadPixels() implies Finish
450*35238bceSAndroid Build Coastguard Worker
451*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
452*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, 0, size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
453*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
454*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
455*35238bceSAndroid Build Coastguard Worker
456*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), size, dataSeed & 0xabcdef);
457*35238bceSAndroid Build Coastguard Worker deMemcpy(ptr, refBuf.getPtr(), size);
458*35238bceSAndroid Build Coastguard Worker
459*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
460*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
461*35238bceSAndroid Build Coastguard Worker
462*35238bceSAndroid Build Coastguard Worker // Synchronize.
463*35238bceSAndroid Build Coastguard Worker glFinish();
464*35238bceSAndroid Build Coastguard Worker
465*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), 0, size))
466*35238bceSAndroid Build Coastguard Worker isOk = false;
467*35238bceSAndroid Build Coastguard Worker
468*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
469*35238bceSAndroid Build Coastguard Worker
470*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
471*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
472*35238bceSAndroid Build Coastguard Worker return STOP;
473*35238bceSAndroid Build Coastguard Worker }
474*35238bceSAndroid Build Coastguard Worker
475*35238bceSAndroid Build Coastguard Worker private:
476*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
477*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
478*35238bceSAndroid Build Coastguard Worker };
479*35238bceSAndroid Build Coastguard Worker
480*35238bceSAndroid Build Coastguard Worker class BufferMapReadWriteCase : public BufferCase
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker public:
BufferMapReadWriteCase(Context & context,const char * name,const char * desc,uint32_t bufferTarget,uint32_t usage,int bufferSize,int mapOffset,int mapSize,VerifyType verify)483*35238bceSAndroid Build Coastguard Worker BufferMapReadWriteCase(Context &context, const char *name, const char *desc, uint32_t bufferTarget, uint32_t usage,
484*35238bceSAndroid Build Coastguard Worker int bufferSize, int mapOffset, int mapSize, VerifyType verify)
485*35238bceSAndroid Build Coastguard Worker : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
486*35238bceSAndroid Build Coastguard Worker , m_bufferTarget(bufferTarget)
487*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
488*35238bceSAndroid Build Coastguard Worker , m_bufferSize(bufferSize)
489*35238bceSAndroid Build Coastguard Worker , m_mapOffset(mapOffset)
490*35238bceSAndroid Build Coastguard Worker , m_mapSize(mapSize)
491*35238bceSAndroid Build Coastguard Worker , m_verify(verify)
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker }
494*35238bceSAndroid Build Coastguard Worker
iterate(void)495*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void)
496*35238bceSAndroid Build Coastguard Worker {
497*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
498*35238bceSAndroid Build Coastguard Worker uint32_t dataSeed = deStringHash(getName());
499*35238bceSAndroid Build Coastguard Worker uint32_t buf = 0;
500*35238bceSAndroid Build Coastguard Worker ReferenceBuffer refBuf;
501*35238bceSAndroid Build Coastguard Worker BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verify);
502*35238bceSAndroid Build Coastguard Worker bool isOk = true;
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker // Setup reference data.
505*35238bceSAndroid Build Coastguard Worker refBuf.setSize(m_bufferSize);
506*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker buf = genBuffer();
509*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
510*35238bceSAndroid Build Coastguard Worker glBufferData(m_bufferTarget, m_bufferSize, refBuf.getPtr(), m_usage);
511*35238bceSAndroid Build Coastguard Worker
512*35238bceSAndroid Build Coastguard Worker // Verify before mapping.
513*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget))
514*35238bceSAndroid Build Coastguard Worker isOk = false;
515*35238bceSAndroid Build Coastguard Worker
516*35238bceSAndroid Build Coastguard Worker glBindBuffer(m_bufferTarget, buf);
517*35238bceSAndroid Build Coastguard Worker void *ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
518*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange");
519*35238bceSAndroid Build Coastguard Worker TCU_CHECK(ptr);
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker // Compare mapped ptr.
522*35238bceSAndroid Build Coastguard Worker if (!compareByteArrays(log, (const uint8_t *)ptr, refBuf.getPtr(m_mapOffset), m_mapSize))
523*35238bceSAndroid Build Coastguard Worker isOk = false;
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker fillWithRandomBytes(refBuf.getPtr(m_mapOffset), m_mapSize, dataSeed & 0xabcdef);
526*35238bceSAndroid Build Coastguard Worker deMemcpy(ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(m_bufferTarget);
529*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glUnmapBuffer");
530*35238bceSAndroid Build Coastguard Worker
531*35238bceSAndroid Build Coastguard Worker // Compare final buffer.
532*35238bceSAndroid Build Coastguard Worker if (!verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget))
533*35238bceSAndroid Build Coastguard Worker isOk = false;
534*35238bceSAndroid Build Coastguard Worker
535*35238bceSAndroid Build Coastguard Worker deleteBuffer(buf);
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
538*35238bceSAndroid Build Coastguard Worker isOk ? "Pass" : "Buffer verification failed");
539*35238bceSAndroid Build Coastguard Worker return STOP;
540*35238bceSAndroid Build Coastguard Worker }
541*35238bceSAndroid Build Coastguard Worker
542*35238bceSAndroid Build Coastguard Worker private:
543*35238bceSAndroid Build Coastguard Worker uint32_t m_bufferTarget;
544*35238bceSAndroid Build Coastguard Worker uint32_t m_usage;
545*35238bceSAndroid Build Coastguard Worker int m_bufferSize;
546*35238bceSAndroid Build Coastguard Worker int m_mapOffset;
547*35238bceSAndroid Build Coastguard Worker int m_mapSize;
548*35238bceSAndroid Build Coastguard Worker VerifyType m_verify;
549*35238bceSAndroid Build Coastguard Worker };
550*35238bceSAndroid Build Coastguard Worker
BufferMapTests(Context & context)551*35238bceSAndroid Build Coastguard Worker BufferMapTests::BufferMapTests(Context &context) : TestCaseGroup(context, "map", "Buffer map tests")
552*35238bceSAndroid Build Coastguard Worker {
553*35238bceSAndroid Build Coastguard Worker }
554*35238bceSAndroid Build Coastguard Worker
~BufferMapTests(void)555*35238bceSAndroid Build Coastguard Worker BufferMapTests::~BufferMapTests(void)
556*35238bceSAndroid Build Coastguard Worker {
557*35238bceSAndroid Build Coastguard Worker }
558*35238bceSAndroid Build Coastguard Worker
init(void)559*35238bceSAndroid Build Coastguard Worker void BufferMapTests::init(void)
560*35238bceSAndroid Build Coastguard Worker {
561*35238bceSAndroid Build Coastguard Worker static const uint32_t bufferTargets[] = {
562*35238bceSAndroid Build Coastguard Worker GL_ARRAY_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_ELEMENT_ARRAY_BUFFER,
563*35238bceSAndroid Build Coastguard Worker GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, GL_UNIFORM_BUFFER};
564*35238bceSAndroid Build Coastguard Worker
565*35238bceSAndroid Build Coastguard Worker static const uint32_t usageHints[] = {GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY,
566*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY,
567*35238bceSAndroid Build Coastguard Worker GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY};
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker static const struct
570*35238bceSAndroid Build Coastguard Worker {
571*35238bceSAndroid Build Coastguard Worker const char *name;
572*35238bceSAndroid Build Coastguard Worker WriteType write;
573*35238bceSAndroid Build Coastguard Worker } bufferDataSources[] = {{"sub_data", WRITE_BUFFER_SUB_DATA}, {"map_write", WRITE_BUFFER_WRITE_MAP}};
574*35238bceSAndroid Build Coastguard Worker
575*35238bceSAndroid Build Coastguard Worker static const struct
576*35238bceSAndroid Build Coastguard Worker {
577*35238bceSAndroid Build Coastguard Worker const char *name;
578*35238bceSAndroid Build Coastguard Worker VerifyType verify;
579*35238bceSAndroid Build Coastguard Worker } bufferUses[] = {{"map_read", VERIFY_BUFFER_READ_MAP},
580*35238bceSAndroid Build Coastguard Worker {"render_as_vertex_array", VERIFY_AS_VERTEX_ARRAY},
581*35238bceSAndroid Build Coastguard Worker {"render_as_index_array", VERIFY_AS_INDEX_ARRAY}};
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker // .read
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *mapReadGroup =
586*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "read", "Buffer read using glMapBufferRange()");
587*35238bceSAndroid Build Coastguard Worker addChild(mapReadGroup);
588*35238bceSAndroid Build Coastguard Worker
589*35238bceSAndroid Build Coastguard Worker // .[data src]
590*35238bceSAndroid Build Coastguard Worker for (int srcNdx = 0; srcNdx < DE_LENGTH_OF_ARRAY(bufferDataSources); srcNdx++)
591*35238bceSAndroid Build Coastguard Worker {
592*35238bceSAndroid Build Coastguard Worker WriteType write = bufferDataSources[srcNdx].write;
593*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *writeGroup = new tcu::TestCaseGroup(m_testCtx, bufferDataSources[srcNdx].name, "");
594*35238bceSAndroid Build Coastguard Worker mapReadGroup->addChild(writeGroup);
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
597*35238bceSAndroid Build Coastguard Worker {
598*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
599*35238bceSAndroid Build Coastguard Worker const uint32_t hint = GL_STATIC_READ;
600*35238bceSAndroid Build Coastguard Worker const int size = 1019;
601*35238bceSAndroid Build Coastguard Worker const int partialOffs = 17;
602*35238bceSAndroid Build Coastguard Worker const int partialSize = 501;
603*35238bceSAndroid Build Coastguard Worker
604*35238bceSAndroid Build Coastguard Worker writeGroup->addChild(new BufferMapReadCase(m_context,
605*35238bceSAndroid Build Coastguard Worker (string(getBufferTargetName(target)) + "_full").c_str(), "",
606*35238bceSAndroid Build Coastguard Worker target, hint, size, 0, size, write));
607*35238bceSAndroid Build Coastguard Worker writeGroup->addChild(new BufferMapReadCase(m_context,
608*35238bceSAndroid Build Coastguard Worker (string(getBufferTargetName(target)) + "_partial").c_str(),
609*35238bceSAndroid Build Coastguard Worker "", target, hint, size, partialOffs, partialSize, write));
610*35238bceSAndroid Build Coastguard Worker }
611*35238bceSAndroid Build Coastguard Worker }
612*35238bceSAndroid Build Coastguard Worker
613*35238bceSAndroid Build Coastguard Worker // .usage_hints
614*35238bceSAndroid Build Coastguard Worker {
615*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *hintsGroup =
616*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Different usage hints with glMapBufferRange()");
617*35238bceSAndroid Build Coastguard Worker mapReadGroup->addChild(hintsGroup);
618*35238bceSAndroid Build Coastguard Worker
619*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
620*35238bceSAndroid Build Coastguard Worker {
621*35238bceSAndroid Build Coastguard Worker for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
622*35238bceSAndroid Build Coastguard Worker {
623*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
624*35238bceSAndroid Build Coastguard Worker uint32_t hint = usageHints[hintNdx];
625*35238bceSAndroid Build Coastguard Worker const int size = 1019;
626*35238bceSAndroid Build Coastguard Worker string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker hintsGroup->addChild(new BufferMapReadCase(m_context, name.c_str(), "", target, hint, size, 0, size,
629*35238bceSAndroid Build Coastguard Worker WRITE_BUFFER_SUB_DATA));
630*35238bceSAndroid Build Coastguard Worker }
631*35238bceSAndroid Build Coastguard Worker }
632*35238bceSAndroid Build Coastguard Worker }
633*35238bceSAndroid Build Coastguard Worker }
634*35238bceSAndroid Build Coastguard Worker
635*35238bceSAndroid Build Coastguard Worker // .write
636*35238bceSAndroid Build Coastguard Worker {
637*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *mapWriteGroup =
638*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "write", "Buffer write using glMapBufferRange()");
639*35238bceSAndroid Build Coastguard Worker addChild(mapWriteGroup);
640*35238bceSAndroid Build Coastguard Worker
641*35238bceSAndroid Build Coastguard Worker // .[verify type]
642*35238bceSAndroid Build Coastguard Worker for (int useNdx = 0; useNdx < DE_LENGTH_OF_ARRAY(bufferUses); useNdx++)
643*35238bceSAndroid Build Coastguard Worker {
644*35238bceSAndroid Build Coastguard Worker VerifyType verify = bufferUses[useNdx].verify;
645*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *useGroup = new tcu::TestCaseGroup(m_testCtx, bufferUses[useNdx].name, "");
646*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(useGroup);
647*35238bceSAndroid Build Coastguard Worker
648*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
649*35238bceSAndroid Build Coastguard Worker {
650*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
651*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
652*35238bceSAndroid Build Coastguard Worker const int size = 1019;
653*35238bceSAndroid Build Coastguard Worker const int partialOffs = 17;
654*35238bceSAndroid Build Coastguard Worker const int partialSize = 501;
655*35238bceSAndroid Build Coastguard Worker string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
656*35238bceSAndroid Build Coastguard Worker
657*35238bceSAndroid Build Coastguard Worker useGroup->addChild(new BufferMapWriteCase(m_context,
658*35238bceSAndroid Build Coastguard Worker (string(getBufferTargetName(target)) + "_full").c_str(), "",
659*35238bceSAndroid Build Coastguard Worker target, hint, size, verify));
660*35238bceSAndroid Build Coastguard Worker useGroup->addChild(
661*35238bceSAndroid Build Coastguard Worker new BufferPartialMapWriteCase(m_context, (string(getBufferTargetName(target)) + "_partial").c_str(),
662*35238bceSAndroid Build Coastguard Worker "", target, hint, size, partialOffs, partialSize, verify));
663*35238bceSAndroid Build Coastguard Worker }
664*35238bceSAndroid Build Coastguard Worker }
665*35238bceSAndroid Build Coastguard Worker
666*35238bceSAndroid Build Coastguard Worker // .usage_hints
667*35238bceSAndroid Build Coastguard Worker {
668*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *hintsGroup = new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Usage hints");
669*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(hintsGroup);
670*35238bceSAndroid Build Coastguard Worker
671*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
672*35238bceSAndroid Build Coastguard Worker {
673*35238bceSAndroid Build Coastguard Worker for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
674*35238bceSAndroid Build Coastguard Worker {
675*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
676*35238bceSAndroid Build Coastguard Worker uint32_t hint = usageHints[hintNdx];
677*35238bceSAndroid Build Coastguard Worker const int size = 1019;
678*35238bceSAndroid Build Coastguard Worker string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
679*35238bceSAndroid Build Coastguard Worker
680*35238bceSAndroid Build Coastguard Worker hintsGroup->addChild(new BufferMapWriteCase(m_context, name.c_str(), "", target, hint, size,
681*35238bceSAndroid Build Coastguard Worker VERIFY_AS_VERTEX_ARRAY));
682*35238bceSAndroid Build Coastguard Worker }
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker }
685*35238bceSAndroid Build Coastguard Worker
686*35238bceSAndroid Build Coastguard Worker // .invalidate
687*35238bceSAndroid Build Coastguard Worker {
688*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *invalidateGroup = new tcu::TestCaseGroup(m_testCtx, "invalidate", "Buffer invalidate");
689*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(invalidateGroup);
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
692*35238bceSAndroid Build Coastguard Worker {
693*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
694*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
695*35238bceSAndroid Build Coastguard Worker
696*35238bceSAndroid Build Coastguard Worker invalidateGroup->addChild(
697*35238bceSAndroid Build Coastguard Worker new BufferMapInvalidateCase(m_context, (string(getBufferTargetName(target)) + "_write_all").c_str(),
698*35238bceSAndroid Build Coastguard Worker "", target, hint, false, VERIFY_AS_VERTEX_ARRAY));
699*35238bceSAndroid Build Coastguard Worker invalidateGroup->addChild(new BufferMapInvalidateCase(
700*35238bceSAndroid Build Coastguard Worker m_context, (string(getBufferTargetName(target)) + "_write_partial").c_str(), "", target, hint, true,
701*35238bceSAndroid Build Coastguard Worker VERIFY_AS_VERTEX_ARRAY));
702*35238bceSAndroid Build Coastguard Worker }
703*35238bceSAndroid Build Coastguard Worker }
704*35238bceSAndroid Build Coastguard Worker
705*35238bceSAndroid Build Coastguard Worker // .partial_invalidate
706*35238bceSAndroid Build Coastguard Worker {
707*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *invalidateGroup =
708*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "partial_invalidate", "Partial invalidate");
709*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(invalidateGroup);
710*35238bceSAndroid Build Coastguard Worker
711*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
714*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker invalidateGroup->addChild(new BufferMapPartialInvalidateCase(
717*35238bceSAndroid Build Coastguard Worker m_context, (string(getBufferTargetName(target)) + "_write_all").c_str(), "", target, hint, false,
718*35238bceSAndroid Build Coastguard Worker VERIFY_AS_VERTEX_ARRAY));
719*35238bceSAndroid Build Coastguard Worker invalidateGroup->addChild(new BufferMapPartialInvalidateCase(
720*35238bceSAndroid Build Coastguard Worker m_context, (string(getBufferTargetName(target)) + "_write_partial").c_str(), "", target, hint, true,
721*35238bceSAndroid Build Coastguard Worker VERIFY_AS_VERTEX_ARRAY));
722*35238bceSAndroid Build Coastguard Worker }
723*35238bceSAndroid Build Coastguard Worker }
724*35238bceSAndroid Build Coastguard Worker
725*35238bceSAndroid Build Coastguard Worker // .explicit_flush
726*35238bceSAndroid Build Coastguard Worker {
727*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *flushGroup = new tcu::TestCaseGroup(m_testCtx, "explicit_flush", "Explicit flush");
728*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(flushGroup);
729*35238bceSAndroid Build Coastguard Worker
730*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
731*35238bceSAndroid Build Coastguard Worker {
732*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
733*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
734*35238bceSAndroid Build Coastguard Worker
735*35238bceSAndroid Build Coastguard Worker flushGroup->addChild(
736*35238bceSAndroid Build Coastguard Worker new BufferMapExplicitFlushCase(m_context, (string(getBufferTargetName(target)) + "_all").c_str(),
737*35238bceSAndroid Build Coastguard Worker "", target, hint, false, VERIFY_AS_VERTEX_ARRAY));
738*35238bceSAndroid Build Coastguard Worker flushGroup->addChild(new BufferMapExplicitFlushCase(
739*35238bceSAndroid Build Coastguard Worker m_context, (string(getBufferTargetName(target)) + "_partial").c_str(), "", target, hint, true,
740*35238bceSAndroid Build Coastguard Worker VERIFY_AS_VERTEX_ARRAY));
741*35238bceSAndroid Build Coastguard Worker }
742*35238bceSAndroid Build Coastguard Worker }
743*35238bceSAndroid Build Coastguard Worker
744*35238bceSAndroid Build Coastguard Worker // .unsynchronized
745*35238bceSAndroid Build Coastguard Worker {
746*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *unsyncGroup = new tcu::TestCaseGroup(m_testCtx, "unsynchronized", "Unsynchronized map");
747*35238bceSAndroid Build Coastguard Worker mapWriteGroup->addChild(unsyncGroup);
748*35238bceSAndroid Build Coastguard Worker
749*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
750*35238bceSAndroid Build Coastguard Worker {
751*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
752*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
753*35238bceSAndroid Build Coastguard Worker
754*35238bceSAndroid Build Coastguard Worker unsyncGroup->addChild(
755*35238bceSAndroid Build Coastguard Worker new BufferMapUnsyncWriteCase(m_context, getBufferTargetName(target), "", target, hint));
756*35238bceSAndroid Build Coastguard Worker }
757*35238bceSAndroid Build Coastguard Worker }
758*35238bceSAndroid Build Coastguard Worker }
759*35238bceSAndroid Build Coastguard Worker
760*35238bceSAndroid Build Coastguard Worker // .read_write
761*35238bceSAndroid Build Coastguard Worker {
762*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *mapReadWriteGroup =
763*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "read_write", "Buffer read and write using glMapBufferRange()");
764*35238bceSAndroid Build Coastguard Worker addChild(mapReadWriteGroup);
765*35238bceSAndroid Build Coastguard Worker
766*35238bceSAndroid Build Coastguard Worker // .[verify type]
767*35238bceSAndroid Build Coastguard Worker for (int useNdx = 0; useNdx < DE_LENGTH_OF_ARRAY(bufferUses); useNdx++)
768*35238bceSAndroid Build Coastguard Worker {
769*35238bceSAndroid Build Coastguard Worker VerifyType verify = bufferUses[useNdx].verify;
770*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *useGroup = new tcu::TestCaseGroup(m_testCtx, bufferUses[useNdx].name, "");
771*35238bceSAndroid Build Coastguard Worker mapReadWriteGroup->addChild(useGroup);
772*35238bceSAndroid Build Coastguard Worker
773*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
774*35238bceSAndroid Build Coastguard Worker {
775*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
776*35238bceSAndroid Build Coastguard Worker uint32_t hint = GL_STATIC_DRAW;
777*35238bceSAndroid Build Coastguard Worker const int size = 1019;
778*35238bceSAndroid Build Coastguard Worker const int partialOffs = 17;
779*35238bceSAndroid Build Coastguard Worker const int partialSize = 501;
780*35238bceSAndroid Build Coastguard Worker string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
781*35238bceSAndroid Build Coastguard Worker
782*35238bceSAndroid Build Coastguard Worker useGroup->addChild(new BufferMapReadWriteCase(m_context,
783*35238bceSAndroid Build Coastguard Worker (string(getBufferTargetName(target)) + "_full").c_str(),
784*35238bceSAndroid Build Coastguard Worker "", target, hint, size, 0, size, verify));
785*35238bceSAndroid Build Coastguard Worker useGroup->addChild(
786*35238bceSAndroid Build Coastguard Worker new BufferMapReadWriteCase(m_context, (string(getBufferTargetName(target)) + "_partial").c_str(),
787*35238bceSAndroid Build Coastguard Worker "", target, hint, size, partialOffs, partialSize, verify));
788*35238bceSAndroid Build Coastguard Worker }
789*35238bceSAndroid Build Coastguard Worker }
790*35238bceSAndroid Build Coastguard Worker
791*35238bceSAndroid Build Coastguard Worker // .usage_hints
792*35238bceSAndroid Build Coastguard Worker {
793*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *hintsGroup = new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Usage hints");
794*35238bceSAndroid Build Coastguard Worker mapReadWriteGroup->addChild(hintsGroup);
795*35238bceSAndroid Build Coastguard Worker
796*35238bceSAndroid Build Coastguard Worker for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
797*35238bceSAndroid Build Coastguard Worker {
798*35238bceSAndroid Build Coastguard Worker for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
799*35238bceSAndroid Build Coastguard Worker {
800*35238bceSAndroid Build Coastguard Worker uint32_t target = bufferTargets[targetNdx];
801*35238bceSAndroid Build Coastguard Worker uint32_t hint = usageHints[hintNdx];
802*35238bceSAndroid Build Coastguard Worker const int size = 1019;
803*35238bceSAndroid Build Coastguard Worker string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
804*35238bceSAndroid Build Coastguard Worker
805*35238bceSAndroid Build Coastguard Worker hintsGroup->addChild(new BufferMapReadWriteCase(m_context, name.c_str(), "", target, hint, size, 0,
806*35238bceSAndroid Build Coastguard Worker size, VERIFY_AS_VERTEX_ARRAY));
807*35238bceSAndroid Build Coastguard Worker }
808*35238bceSAndroid Build Coastguard Worker }
809*35238bceSAndroid Build Coastguard Worker }
810*35238bceSAndroid Build Coastguard Worker }
811*35238bceSAndroid Build Coastguard Worker }
812*35238bceSAndroid Build Coastguard Worker
813*35238bceSAndroid Build Coastguard Worker } // namespace Functional
814*35238bceSAndroid Build Coastguard Worker } // namespace gles3
815*35238bceSAndroid Build Coastguard Worker } // namespace deqp
816