xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fBufferMapTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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