xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fBufferCopyTests.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 copying tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fBufferCopyTests.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::string;
35*35238bceSAndroid Build Coastguard Worker using std::vector;
36*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker namespace deqp
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace gles3
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace Functional
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker using namespace gls::BufferTestUtil;
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker class BasicBufferCopyCase : public BufferCase
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker public:
BasicBufferCopyCase(Context & context,const char * name,const char * desc,uint32_t srcTarget,int srcSize,uint32_t srcHint,uint32_t dstTarget,int dstSize,uint32_t dstHint,int copySrcOffset,int copyDstOffset,int copySize,VerifyType verifyType)50*35238bceSAndroid Build Coastguard Worker     BasicBufferCopyCase(Context &context, const char *name, const char *desc, uint32_t srcTarget, int srcSize,
51*35238bceSAndroid Build Coastguard Worker                         uint32_t srcHint, uint32_t dstTarget, int dstSize, uint32_t dstHint, int copySrcOffset,
52*35238bceSAndroid Build Coastguard Worker                         int copyDstOffset, int copySize, VerifyType verifyType)
53*35238bceSAndroid Build Coastguard Worker         : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
54*35238bceSAndroid Build Coastguard Worker         , m_srcTarget(srcTarget)
55*35238bceSAndroid Build Coastguard Worker         , m_srcSize(srcSize)
56*35238bceSAndroid Build Coastguard Worker         , m_srcHint(srcHint)
57*35238bceSAndroid Build Coastguard Worker         , m_dstTarget(dstTarget)
58*35238bceSAndroid Build Coastguard Worker         , m_dstSize(dstSize)
59*35238bceSAndroid Build Coastguard Worker         , m_dstHint(dstHint)
60*35238bceSAndroid Build Coastguard Worker         , m_copySrcOffset(copySrcOffset)
61*35238bceSAndroid Build Coastguard Worker         , m_copyDstOffset(copyDstOffset)
62*35238bceSAndroid Build Coastguard Worker         , m_copySize(copySize)
63*35238bceSAndroid Build Coastguard Worker         , m_verifyType(verifyType)
64*35238bceSAndroid Build Coastguard Worker     {
65*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::inBounds(m_copySrcOffset, 0, m_srcSize) &&
66*35238bceSAndroid Build Coastguard Worker                   de::inRange(m_copySrcOffset + m_copySize, m_copySrcOffset, m_srcSize));
67*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(de::inBounds(m_copyDstOffset, 0, m_dstSize) &&
68*35238bceSAndroid Build Coastguard Worker                   de::inRange(m_copyDstOffset + m_copySize, m_copyDstOffset, m_dstSize));
69*35238bceSAndroid Build Coastguard Worker     }
70*35238bceSAndroid Build Coastguard Worker 
iterate(void)71*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void)
72*35238bceSAndroid Build Coastguard Worker     {
73*35238bceSAndroid Build Coastguard Worker         BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verifyType);
74*35238bceSAndroid Build Coastguard Worker         ReferenceBuffer srcRef;
75*35238bceSAndroid Build Coastguard Worker         ReferenceBuffer dstRef;
76*35238bceSAndroid Build Coastguard Worker         uint32_t srcBuf  = 0;
77*35238bceSAndroid Build Coastguard Worker         uint32_t dstBuf  = 0;
78*35238bceSAndroid Build Coastguard Worker         uint32_t srcSeed = deStringHash(getName()) ^ 0xabcd;
79*35238bceSAndroid Build Coastguard Worker         uint32_t dstSeed = deStringHash(getName()) ^ 0xef01;
80*35238bceSAndroid Build Coastguard Worker         bool isOk        = true;
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker         srcRef.setSize(m_srcSize);
83*35238bceSAndroid Build Coastguard Worker         fillWithRandomBytes(srcRef.getPtr(), m_srcSize, srcSeed);
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker         dstRef.setSize(m_dstSize);
86*35238bceSAndroid Build Coastguard Worker         fillWithRandomBytes(dstRef.getPtr(), m_dstSize, dstSeed);
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker         // Create source buffer and fill with data.
89*35238bceSAndroid Build Coastguard Worker         srcBuf = genBuffer();
90*35238bceSAndroid Build Coastguard Worker         glBindBuffer(m_srcTarget, srcBuf);
91*35238bceSAndroid Build Coastguard Worker         glBufferData(m_srcTarget, m_srcSize, srcRef.getPtr(), m_srcHint);
92*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_MSG("glBufferData");
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker         // Create destination buffer and fill with data.
95*35238bceSAndroid Build Coastguard Worker         dstBuf = genBuffer();
96*35238bceSAndroid Build Coastguard Worker         glBindBuffer(m_dstTarget, dstBuf);
97*35238bceSAndroid Build Coastguard Worker         glBufferData(m_dstTarget, m_dstSize, dstRef.getPtr(), m_dstHint);
98*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_MSG("glBufferData");
99*35238bceSAndroid Build Coastguard Worker 
100*35238bceSAndroid Build Coastguard Worker         // Verify both buffers before executing copy.
101*35238bceSAndroid Build Coastguard Worker         isOk = verifier.verify(srcBuf, srcRef.getPtr(), 0, m_srcSize, m_srcTarget) && isOk;
102*35238bceSAndroid Build Coastguard Worker         isOk = verifier.verify(dstBuf, dstRef.getPtr(), 0, m_dstSize, m_dstTarget) && isOk;
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker         // Execute copy.
105*35238bceSAndroid Build Coastguard Worker         deMemcpy(dstRef.getPtr() + m_copyDstOffset, srcRef.getPtr() + m_copySrcOffset, m_copySize);
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker         glBindBuffer(m_srcTarget, srcBuf);
108*35238bceSAndroid Build Coastguard Worker         glBindBuffer(m_dstTarget, dstBuf);
109*35238bceSAndroid Build Coastguard Worker         glCopyBufferSubData(m_srcTarget, m_dstTarget, m_copySrcOffset, m_copyDstOffset, m_copySize);
110*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_MSG("glCopyBufferSubData");
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker         // Verify both buffers after copy.
113*35238bceSAndroid Build Coastguard Worker         isOk = verifier.verify(srcBuf, srcRef.getPtr(), 0, m_srcSize, m_srcTarget) && isOk;
114*35238bceSAndroid Build Coastguard Worker         isOk = verifier.verify(dstBuf, dstRef.getPtr(), 0, m_dstSize, m_dstTarget) && isOk;
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
117*35238bceSAndroid Build Coastguard Worker                                 isOk ? "Pass" : "Buffer verification failed");
118*35238bceSAndroid Build Coastguard Worker         return STOP;
119*35238bceSAndroid Build Coastguard Worker     }
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker private:
122*35238bceSAndroid Build Coastguard Worker     uint32_t m_srcTarget;
123*35238bceSAndroid Build Coastguard Worker     int m_srcSize;
124*35238bceSAndroid Build Coastguard Worker     uint32_t m_srcHint;
125*35238bceSAndroid Build Coastguard Worker 
126*35238bceSAndroid Build Coastguard Worker     uint32_t m_dstTarget;
127*35238bceSAndroid Build Coastguard Worker     int m_dstSize;
128*35238bceSAndroid Build Coastguard Worker     uint32_t m_dstHint;
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     int m_copySrcOffset;
131*35238bceSAndroid Build Coastguard Worker     int m_copyDstOffset;
132*35238bceSAndroid Build Coastguard Worker     int m_copySize;
133*35238bceSAndroid Build Coastguard Worker 
134*35238bceSAndroid Build Coastguard Worker     VerifyType m_verifyType;
135*35238bceSAndroid Build Coastguard Worker };
136*35238bceSAndroid Build Coastguard Worker 
137*35238bceSAndroid Build Coastguard Worker // Case B: same buffer, take range as parameter
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker class SingleBufferCopyCase : public BufferCase
140*35238bceSAndroid Build Coastguard Worker {
141*35238bceSAndroid Build Coastguard Worker public:
SingleBufferCopyCase(Context & context,const char * name,const char * desc,uint32_t srcTarget,uint32_t dstTarget,uint32_t hint,VerifyType verifyType)142*35238bceSAndroid Build Coastguard Worker     SingleBufferCopyCase(Context &context, const char *name, const char *desc, uint32_t srcTarget, uint32_t dstTarget,
143*35238bceSAndroid Build Coastguard Worker                          uint32_t hint, VerifyType verifyType)
144*35238bceSAndroid Build Coastguard Worker         : BufferCase(context.getTestContext(), context.getRenderContext(), name, desc)
145*35238bceSAndroid Build Coastguard Worker         , m_srcTarget(srcTarget)
146*35238bceSAndroid Build Coastguard Worker         , m_dstTarget(dstTarget)
147*35238bceSAndroid Build Coastguard Worker         , m_hint(hint)
148*35238bceSAndroid Build Coastguard Worker         , m_verifyType(verifyType)
149*35238bceSAndroid Build Coastguard Worker     {
150*35238bceSAndroid Build Coastguard Worker     }
151*35238bceSAndroid Build Coastguard Worker 
iterate(void)152*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void)
153*35238bceSAndroid Build Coastguard Worker     {
154*35238bceSAndroid Build Coastguard Worker         const int size = 1000;
155*35238bceSAndroid Build Coastguard Worker         BufferVerifier verifier(m_renderCtx, m_testCtx.getLog(), m_verifyType);
156*35238bceSAndroid Build Coastguard Worker         ReferenceBuffer ref;
157*35238bceSAndroid Build Coastguard Worker         uint32_t buf      = 0;
158*35238bceSAndroid Build Coastguard Worker         uint32_t baseSeed = deStringHash(getName());
159*35238bceSAndroid Build Coastguard Worker         bool isOk         = true;
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker         ref.setSize(size);
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker         // Create buffer.
164*35238bceSAndroid Build Coastguard Worker         buf = genBuffer();
165*35238bceSAndroid Build Coastguard Worker         glBindBuffer(m_srcTarget, buf);
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker         static const struct
168*35238bceSAndroid Build Coastguard Worker         {
169*35238bceSAndroid Build Coastguard Worker             int srcOffset;
170*35238bceSAndroid Build Coastguard Worker             int dstOffset;
171*35238bceSAndroid Build Coastguard Worker             int copySize;
172*35238bceSAndroid Build Coastguard Worker         } copyRanges[] = {
173*35238bceSAndroid Build Coastguard Worker             {57, 701, 101},  // Non-adjecent, from low to high.
174*35238bceSAndroid Build Coastguard Worker             {640, 101, 101}, // Non-adjecent, from high to low.
175*35238bceSAndroid Build Coastguard Worker             {0, 500, 500},   // Lower half to upper half.
176*35238bceSAndroid Build Coastguard Worker             {500, 0, 500}    // Upper half to lower half.
177*35238bceSAndroid Build Coastguard Worker         };
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(copyRanges) && isOk; ndx++)
180*35238bceSAndroid Build Coastguard Worker         {
181*35238bceSAndroid Build Coastguard Worker             int srcOffset = copyRanges[ndx].srcOffset;
182*35238bceSAndroid Build Coastguard Worker             int dstOffset = copyRanges[ndx].dstOffset;
183*35238bceSAndroid Build Coastguard Worker             int copySize  = copyRanges[ndx].copySize;
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker             fillWithRandomBytes(ref.getPtr(), size, baseSeed ^ deInt32Hash(ndx));
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker             // Fill with data.
188*35238bceSAndroid Build Coastguard Worker             glBindBuffer(m_srcTarget, buf);
189*35238bceSAndroid Build Coastguard Worker             glBufferData(m_srcTarget, size, ref.getPtr(), m_hint);
190*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_MSG("glBufferData");
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker             // Execute copy.
193*35238bceSAndroid Build Coastguard Worker             deMemcpy(ref.getPtr() + dstOffset, ref.getPtr() + srcOffset, copySize);
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker             glBindBuffer(m_dstTarget, buf);
196*35238bceSAndroid Build Coastguard Worker             glCopyBufferSubData(m_srcTarget, m_dstTarget, srcOffset, dstOffset, copySize);
197*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_MSG("glCopyBufferSubData");
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker             // Verify buffer after copy.
200*35238bceSAndroid Build Coastguard Worker             isOk = verifier.verify(buf, ref.getPtr(), 0, size, m_dstTarget) && isOk;
201*35238bceSAndroid Build Coastguard Worker         }
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
204*35238bceSAndroid Build Coastguard Worker                                 isOk ? "Pass" : "Buffer verification failed");
205*35238bceSAndroid Build Coastguard Worker         return STOP;
206*35238bceSAndroid Build Coastguard Worker     }
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker private:
209*35238bceSAndroid Build Coastguard Worker     uint32_t m_srcTarget;
210*35238bceSAndroid Build Coastguard Worker     uint32_t m_dstTarget;
211*35238bceSAndroid Build Coastguard Worker     uint32_t m_hint;
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker     VerifyType m_verifyType;
214*35238bceSAndroid Build Coastguard Worker };
215*35238bceSAndroid Build Coastguard Worker 
BufferCopyTests(Context & context)216*35238bceSAndroid Build Coastguard Worker BufferCopyTests::BufferCopyTests(Context &context) : TestCaseGroup(context, "copy", "Buffer copy tests")
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker }
219*35238bceSAndroid Build Coastguard Worker 
~BufferCopyTests(void)220*35238bceSAndroid Build Coastguard Worker BufferCopyTests::~BufferCopyTests(void)
221*35238bceSAndroid Build Coastguard Worker {
222*35238bceSAndroid Build Coastguard Worker }
223*35238bceSAndroid Build Coastguard Worker 
init(void)224*35238bceSAndroid Build Coastguard Worker void BufferCopyTests::init(void)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker     static const uint32_t bufferTargets[] = {
227*35238bceSAndroid Build Coastguard Worker         GL_ARRAY_BUFFER,      GL_COPY_READ_BUFFER,    GL_COPY_WRITE_BUFFER,         GL_ELEMENT_ARRAY_BUFFER,
228*35238bceSAndroid Build Coastguard Worker         GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, GL_UNIFORM_BUFFER};
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker     // .basic
231*35238bceSAndroid Build Coastguard Worker     {
232*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *basicGroup = new tcu::TestCaseGroup(m_testCtx, "basic", "Basic buffer copy cases");
233*35238bceSAndroid Build Coastguard Worker         addChild(basicGroup);
234*35238bceSAndroid Build Coastguard Worker 
235*35238bceSAndroid Build Coastguard Worker         for (int srcTargetNdx = 0; srcTargetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); srcTargetNdx++)
236*35238bceSAndroid Build Coastguard Worker         {
237*35238bceSAndroid Build Coastguard Worker             for (int dstTargetNdx = 0; dstTargetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); dstTargetNdx++)
238*35238bceSAndroid Build Coastguard Worker             {
239*35238bceSAndroid Build Coastguard Worker                 if (srcTargetNdx == dstTargetNdx)
240*35238bceSAndroid Build Coastguard Worker                     continue;
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker                 uint32_t srcTarget  = bufferTargets[srcTargetNdx];
243*35238bceSAndroid Build Coastguard Worker                 uint32_t dstTarget  = bufferTargets[dstTargetNdx];
244*35238bceSAndroid Build Coastguard Worker                 const int size      = 1017;
245*35238bceSAndroid Build Coastguard Worker                 const uint32_t hint = GL_STATIC_DRAW;
246*35238bceSAndroid Build Coastguard Worker                 VerifyType verify   = VERIFY_AS_VERTEX_ARRAY;
247*35238bceSAndroid Build Coastguard Worker                 string name         = string(getBufferTargetName(srcTarget)) + "_" + getBufferTargetName(dstTarget);
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker                 basicGroup->addChild(new BasicBufferCopyCase(m_context, name.c_str(), "", srcTarget, size, hint,
250*35238bceSAndroid Build Coastguard Worker                                                              dstTarget, size, hint, 0, 0, size, verify));
251*35238bceSAndroid Build Coastguard Worker             }
252*35238bceSAndroid Build Coastguard Worker         }
253*35238bceSAndroid Build Coastguard Worker     }
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker     // .subrange
256*35238bceSAndroid Build Coastguard Worker     {
257*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *subrangeGroup = new tcu::TestCaseGroup(m_testCtx, "subrange", "Buffer subrange copy tests");
258*35238bceSAndroid Build Coastguard Worker         addChild(subrangeGroup);
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker         static const struct
261*35238bceSAndroid Build Coastguard Worker         {
262*35238bceSAndroid Build Coastguard Worker             const char *name;
263*35238bceSAndroid Build Coastguard Worker             int srcSize;
264*35238bceSAndroid Build Coastguard Worker             int dstSize;
265*35238bceSAndroid Build Coastguard Worker             int srcOffset;
266*35238bceSAndroid Build Coastguard Worker             int dstOffset;
267*35238bceSAndroid Build Coastguard Worker             int copySize;
268*35238bceSAndroid Build Coastguard Worker         } cases[] = {//                        srcSize        dstSize        srcOffs        dstOffs        copySize
269*35238bceSAndroid Build Coastguard Worker                      {"middle", 1000, 1000, 250, 250, 500},      {"small_to_large", 100, 1000, 0, 409, 100},
270*35238bceSAndroid Build Coastguard Worker                      {"large_to_small", 1000, 100, 409, 0, 100}, {"low_to_high_1", 1000, 1000, 0, 500, 500},
271*35238bceSAndroid Build Coastguard Worker                      {"low_to_high_2", 997, 1027, 0, 701, 111},  {"high_to_low_1", 1000, 1000, 500, 0, 500},
272*35238bceSAndroid Build Coastguard Worker                      {"high_to_low_2", 1027, 997, 701, 17, 111}};
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(cases); ndx++)
275*35238bceSAndroid Build Coastguard Worker         {
276*35238bceSAndroid Build Coastguard Worker             uint32_t srcTarget = GL_COPY_READ_BUFFER;
277*35238bceSAndroid Build Coastguard Worker             uint32_t dstTarget = GL_COPY_WRITE_BUFFER;
278*35238bceSAndroid Build Coastguard Worker             uint32_t hint      = GL_STATIC_DRAW;
279*35238bceSAndroid Build Coastguard Worker             VerifyType verify  = VERIFY_AS_VERTEX_ARRAY;
280*35238bceSAndroid Build Coastguard Worker 
281*35238bceSAndroid Build Coastguard Worker             subrangeGroup->addChild(new BasicBufferCopyCase(
282*35238bceSAndroid Build Coastguard Worker                 m_context, cases[ndx].name, "", srcTarget, cases[ndx].srcSize, hint, dstTarget, cases[ndx].dstSize,
283*35238bceSAndroid Build Coastguard Worker                 hint, cases[ndx].srcOffset, cases[ndx].dstOffset, cases[ndx].copySize, verify));
284*35238bceSAndroid Build Coastguard Worker         }
285*35238bceSAndroid Build Coastguard Worker     }
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker     // .single_buffer
288*35238bceSAndroid Build Coastguard Worker     {
289*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *singleBufGroup =
290*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "single_buffer", "Copies within single buffer");
291*35238bceSAndroid Build Coastguard Worker         addChild(singleBufGroup);
292*35238bceSAndroid Build Coastguard Worker 
293*35238bceSAndroid Build Coastguard Worker         for (int srcTargetNdx = 0; srcTargetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); srcTargetNdx++)
294*35238bceSAndroid Build Coastguard Worker         {
295*35238bceSAndroid Build Coastguard Worker             for (int dstTargetNdx = 0; dstTargetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); dstTargetNdx++)
296*35238bceSAndroid Build Coastguard Worker             {
297*35238bceSAndroid Build Coastguard Worker                 if (srcTargetNdx == dstTargetNdx)
298*35238bceSAndroid Build Coastguard Worker                     continue;
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker                 uint32_t srcTarget  = bufferTargets[srcTargetNdx];
301*35238bceSAndroid Build Coastguard Worker                 uint32_t dstTarget  = bufferTargets[dstTargetNdx];
302*35238bceSAndroid Build Coastguard Worker                 const uint32_t hint = GL_STATIC_DRAW;
303*35238bceSAndroid Build Coastguard Worker                 VerifyType verify   = VERIFY_AS_VERTEX_ARRAY;
304*35238bceSAndroid Build Coastguard Worker                 string name         = string(getBufferTargetName(srcTarget)) + "_" + getBufferTargetName(dstTarget);
305*35238bceSAndroid Build Coastguard Worker 
306*35238bceSAndroid Build Coastguard Worker                 singleBufGroup->addChild(
307*35238bceSAndroid Build Coastguard Worker                     new SingleBufferCopyCase(m_context, name.c_str(), "", srcTarget, dstTarget, hint, verify));
308*35238bceSAndroid Build Coastguard Worker             }
309*35238bceSAndroid Build Coastguard Worker         }
310*35238bceSAndroid Build Coastguard Worker     }
311*35238bceSAndroid Build Coastguard Worker }
312*35238bceSAndroid Build Coastguard Worker 
313*35238bceSAndroid Build Coastguard Worker } // namespace Functional
314*35238bceSAndroid Build Coastguard Worker } // namespace gles3
315*35238bceSAndroid Build Coastguard Worker } // namespace deqp
316