1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.0 Module
3 * -------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Buffer map tests.
22 *//*--------------------------------------------------------------------*/
24 #include "es3fBufferMapTests.hpp"
25 #include "glsBufferTestUtil.hpp"
26 #include "tcuTestLog.hpp"
29 #include "glwEnums.hpp"
30 #include "glwFunctions.hpp"
46 using namespace gls::BufferTestUtil;
50 class BufferMapReadCase : public BufferCase
53 BufferMapReadCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, int bufferSize, int mapOffset, int mapSize, WriteType write)
54 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
55 , m_bufferTarget (bufferTarget)
57 , m_bufferSize (bufferSize)
58 , m_mapOffset (mapOffset)
64 IterateResult iterate (void)
66 TestLog& log = m_testCtx.getLog();
67 deUint32 dataSeed = deStringHash(getName());
68 ReferenceBuffer refBuf;
69 BufferWriter writer (m_renderCtx, m_testCtx.getLog(), m_write);
72 // Setup reference data.
73 refBuf.setSize(m_bufferSize);
74 fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
76 deUint32 buf = genBuffer();
77 glBindBuffer(m_bufferTarget, buf);
78 glBufferData(m_bufferTarget, m_bufferSize, DE_NULL, m_usage);
79 writer.write(buf, 0, m_bufferSize, refBuf.getPtr(), m_bufferTarget);
81 glBindBuffer(m_bufferTarget, buf);
82 void* ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_READ_BIT);
83 GLU_CHECK_MSG("glMapBufferRange");
86 isOk = compareByteArrays(log, (const deUint8*)ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
88 glUnmapBuffer(m_bufferTarget);
89 GLU_CHECK_MSG("glUnmapBuffer");
93 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
94 isOk ? "Pass" : "Buffer verification failed");
99 deUint32 m_bufferTarget;
107 class BufferMapWriteCase : public BufferCase
110 BufferMapWriteCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, int size, VerifyType verify)
111 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
112 , m_bufferTarget (bufferTarget)
119 IterateResult iterate (void)
121 deUint32 dataSeed = deStringHash(getName());
122 ReferenceBuffer refBuf;
123 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
125 // Setup reference data.
126 refBuf.setSize(m_size);
127 fillWithRandomBytes(refBuf.getPtr(), m_size, dataSeed);
129 deUint32 buf = genBuffer();
130 glBindBuffer(m_bufferTarget, buf);
131 glBufferData(m_bufferTarget, m_size, DE_NULL, m_usage);
133 void* ptr = glMapBufferRange(m_bufferTarget, 0, m_size, GL_MAP_WRITE_BIT);
134 GLU_CHECK_MSG("glMapBufferRange");
137 fillWithRandomBytes((deUint8*)ptr, m_size, dataSeed);
138 glUnmapBuffer(m_bufferTarget);
139 GLU_CHECK_MSG("glUnmapBuffer");
141 bool isOk = verifier.verify(buf, refBuf.getPtr(), 0, m_size, m_bufferTarget);
144 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
145 isOk ? "Pass" : "Buffer verification failed");
150 deUint32 m_bufferTarget;
156 class BufferPartialMapWriteCase : public BufferCase
159 BufferPartialMapWriteCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, int bufferSize, int mapOffset, int mapSize, VerifyType verify)
160 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
161 , m_bufferTarget (bufferTarget)
163 , m_bufferSize (bufferSize)
164 , m_mapOffset (mapOffset)
165 , m_mapSize (mapSize)
170 IterateResult iterate (void)
172 deUint32 dataSeed = deStringHash(getName());
173 ReferenceBuffer refBuf;
174 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
176 // Setup reference data.
177 refBuf.setSize(m_bufferSize);
178 fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
180 deUint32 buf = genBuffer();
181 glBindBuffer(m_bufferTarget, buf);
182 glBufferData(m_bufferTarget, m_bufferSize, refBuf.getPtr(), m_usage);
185 fillWithRandomBytes(refBuf.getPtr(m_mapOffset), m_mapSize, dataSeed&0xabcdef);
187 void* ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_WRITE_BIT);
188 GLU_CHECK_MSG("glMapBufferRange");
191 deMemcpy(ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
192 glUnmapBuffer(m_bufferTarget);
193 GLU_CHECK_MSG("glUnmapBuffer");
195 bool isOk = verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget);
198 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
199 isOk ? "Pass" : "Buffer verification failed");
204 deUint32 m_bufferTarget;
212 class BufferMapInvalidateCase : public BufferCase
215 BufferMapInvalidateCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, bool partialWrite, VerifyType verify)
216 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
217 , m_bufferTarget (bufferTarget)
219 , m_partialWrite (partialWrite)
224 IterateResult iterate (void)
226 deUint32 dataSeed = deStringHash(getName());
228 ReferenceBuffer refBuf;
229 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
230 const int bufferSize = 1300;
231 const int mapOffset = 200;
232 const int mapSize = 1011;
233 const int mapWriteOffs = m_partialWrite ? 91 : 0;
234 const int verifyOffset = mapOffset+mapWriteOffs;
235 const int verifySize = mapSize-mapWriteOffs;
237 // Setup reference data.
238 refBuf.setSize(bufferSize);
239 fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
242 glBindBuffer(m_bufferTarget, buf);
243 glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
246 fillWithRandomBytes(refBuf.getPtr(mapOffset+mapWriteOffs), mapSize-mapWriteOffs, dataSeed&0xabcdef);
248 void* ptr = glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_BUFFER_BIT);
249 GLU_CHECK_MSG("glMapBufferRange");
252 deMemcpy((deUint8*)ptr+mapWriteOffs, refBuf.getPtr(mapOffset+mapWriteOffs), mapSize-mapWriteOffs);
253 glUnmapBuffer(m_bufferTarget);
254 GLU_CHECK_MSG("glUnmapBuffer");
256 bool isOk = verifier.verify(buf, refBuf.getPtr(), verifyOffset, verifySize, m_bufferTarget);
259 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
260 isOk ? "Pass" : "Buffer verification failed");
265 deUint32 m_bufferTarget;
271 class BufferMapPartialInvalidateCase : public BufferCase
274 BufferMapPartialInvalidateCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, bool partialWrite, VerifyType verify)
275 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
276 , m_bufferTarget (bufferTarget)
278 , m_partialWrite (partialWrite)
283 IterateResult iterate (void)
285 deUint32 dataSeed = deStringHash(getName());
287 ReferenceBuffer refBuf;
288 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
289 const int bufferSize = 1300;
290 const int mapOffset = 200;
291 const int mapSize = 1011;
292 const int mapWriteOffs = m_partialWrite ? 91 : 0;
293 const int verifyOffset = m_partialWrite ? mapOffset+mapWriteOffs : 0;
294 const int verifySize = bufferSize-verifyOffset;
296 // Setup reference data.
297 refBuf.setSize(bufferSize);
298 fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
301 glBindBuffer(m_bufferTarget, buf);
302 glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
305 fillWithRandomBytes(refBuf.getPtr(mapOffset+mapWriteOffs), mapSize-mapWriteOffs, dataSeed&0xabcdef);
307 void* ptr = glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT);
308 GLU_CHECK_MSG("glMapBufferRange");
311 deMemcpy((deUint8*)ptr+mapWriteOffs, refBuf.getPtr(mapOffset+mapWriteOffs), mapSize-mapWriteOffs);
312 glUnmapBuffer(m_bufferTarget);
313 GLU_CHECK_MSG("glUnmapBuffer");
315 bool isOk = verifier.verify(buf, refBuf.getPtr(), verifyOffset, verifySize, m_bufferTarget);
318 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
319 isOk ? "Pass" : "Buffer verification failed");
324 deUint32 m_bufferTarget;
330 class BufferMapExplicitFlushCase : public BufferCase
333 BufferMapExplicitFlushCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, bool partialWrite, VerifyType verify)
334 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
335 , m_bufferTarget (bufferTarget)
337 , m_partialWrite (partialWrite)
342 IterateResult iterate (void)
344 deUint32 dataSeed = deStringHash(getName());
346 ReferenceBuffer refBuf;
347 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
348 const int bufferSize = 1300;
349 const int mapOffset = 200;
350 const int mapSize = 1011;
351 const int sliceAOffs = m_partialWrite ? 1 : 0;
352 const int sliceASize = m_partialWrite ? 96 : 473;
353 const int sliceBOffs = m_partialWrite ? 503 : sliceAOffs+sliceASize;
354 const int sliceBSize = mapSize-sliceBOffs;
357 // Setup reference data.
358 refBuf.setSize(bufferSize);
359 fillWithRandomBytes(refBuf.getPtr(), bufferSize, dataSeed);
362 glBindBuffer(m_bufferTarget, buf);
363 glBufferData(m_bufferTarget, bufferSize, refBuf.getPtr(), m_usage);
366 fillWithRandomBytes(refBuf.getPtr(mapOffset), mapSize, dataSeed&0xabcdef);
368 void* ptr = glMapBufferRange(m_bufferTarget, mapOffset, mapSize, GL_MAP_WRITE_BIT|GL_MAP_FLUSH_EXPLICIT_BIT);
369 GLU_CHECK_MSG("glMapBufferRange");
372 deMemcpy(ptr, refBuf.getPtr(mapOffset), mapSize);
374 glFlushMappedBufferRange(m_bufferTarget, sliceAOffs, sliceASize);
375 GLU_CHECK_MSG("glFlushMappedBufferRange");
376 glFlushMappedBufferRange(m_bufferTarget, sliceBOffs, sliceBSize);
377 GLU_CHECK_MSG("glFlushMappedBufferRange");
379 glUnmapBuffer(m_bufferTarget);
380 GLU_CHECK_MSG("glUnmapBuffer");
384 if (!verifier.verify(buf, refBuf.getPtr(), mapOffset+sliceAOffs, sliceASize, m_bufferTarget))
387 if (!verifier.verify(buf, refBuf.getPtr(), mapOffset+sliceBOffs, sliceBSize, m_bufferTarget))
392 if (!verifier.verify(buf, refBuf.getPtr(), mapOffset, mapSize, m_bufferTarget))
398 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
399 isOk ? "Pass" : "Buffer verification failed");
404 deUint32 m_bufferTarget;
410 class BufferMapUnsyncWriteCase : public BufferCase
413 BufferMapUnsyncWriteCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage)
414 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
415 , m_bufferTarget (bufferTarget)
420 IterateResult iterate (void)
422 VertexArrayVerifier verifier (m_renderCtx, m_testCtx.getLog());
423 deUint32 dataSeed = deStringHash(getName());
424 ReferenceBuffer refBuf;
427 const int size = 1200;
429 // Setup reference data.
430 refBuf.setSize(size);
431 fillWithRandomBytes(refBuf.getPtr(), size, dataSeed);
434 glBindBuffer(m_bufferTarget, buf);
435 glBufferData(m_bufferTarget, size, refBuf.getPtr(), m_usage);
437 // Use for rendering.
438 if (!verifier.verify(buf, refBuf.getPtr(), 0, size))
440 // \note ReadPixels() implies Finish
442 glBindBuffer(m_bufferTarget, buf);
443 void* ptr = glMapBufferRange(m_bufferTarget, 0, size, GL_MAP_WRITE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);
444 GLU_CHECK_MSG("glMapBufferRange");
447 fillWithRandomBytes(refBuf.getPtr(), size, dataSeed&0xabcdef);
448 deMemcpy(ptr, refBuf.getPtr(), size);
450 glUnmapBuffer(m_bufferTarget);
451 GLU_CHECK_MSG("glUnmapBuffer");
456 if (!verifier.verify(buf, refBuf.getPtr(), 0, size))
461 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
462 isOk ? "Pass" : "Buffer verification failed");
467 deUint32 m_bufferTarget;
471 class BufferMapReadWriteCase : public BufferCase
474 BufferMapReadWriteCase (Context& context, const char* name, const char* desc, deUint32 bufferTarget, deUint32 usage, int bufferSize, int mapOffset, int mapSize, VerifyType verify)
475 : BufferCase (context.getTestContext(), context.getRenderContext(), name, desc)
476 , m_bufferTarget (bufferTarget)
478 , m_bufferSize (bufferSize)
479 , m_mapOffset (mapOffset)
480 , m_mapSize (mapSize)
485 IterateResult iterate (void)
487 TestLog& log = m_testCtx.getLog();
488 deUint32 dataSeed = deStringHash(getName());
490 ReferenceBuffer refBuf;
491 BufferVerifier verifier (m_renderCtx, m_testCtx.getLog(), m_verify);
494 // Setup reference data.
495 refBuf.setSize(m_bufferSize);
496 fillWithRandomBytes(refBuf.getPtr(), m_bufferSize, dataSeed);
499 glBindBuffer(m_bufferTarget, buf);
500 glBufferData(m_bufferTarget, m_bufferSize, refBuf.getPtr(), m_usage);
502 // Verify before mapping.
503 if (!verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget))
506 glBindBuffer(m_bufferTarget, buf);
507 void* ptr = glMapBufferRange(m_bufferTarget, m_mapOffset, m_mapSize, GL_MAP_READ_BIT|GL_MAP_WRITE_BIT);
508 GLU_CHECK_MSG("glMapBufferRange");
511 // Compare mapped ptr.
512 if (!compareByteArrays(log, (const deUint8*)ptr, refBuf.getPtr(m_mapOffset), m_mapSize))
515 fillWithRandomBytes(refBuf.getPtr(m_mapOffset), m_mapSize, dataSeed&0xabcdef);
516 deMemcpy(ptr, refBuf.getPtr(m_mapOffset), m_mapSize);
518 glUnmapBuffer(m_bufferTarget);
519 GLU_CHECK_MSG("glUnmapBuffer");
521 // Compare final buffer.
522 if (!verifier.verify(buf, refBuf.getPtr(), 0, m_bufferSize, m_bufferTarget))
527 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
528 isOk ? "Pass" : "Buffer verification failed");
533 deUint32 m_bufferTarget;
541 BufferMapTests::BufferMapTests (Context& context)
542 : TestCaseGroup(context, "map", "Buffer map tests")
546 BufferMapTests::~BufferMapTests (void)
550 void BufferMapTests::init (void)
552 static const deUint32 bufferTargets[] =
556 GL_COPY_WRITE_BUFFER,
557 GL_ELEMENT_ARRAY_BUFFER,
558 GL_PIXEL_PACK_BUFFER,
559 GL_PIXEL_UNPACK_BUFFER,
560 GL_TRANSFORM_FEEDBACK_BUFFER,
564 static const deUint32 usageHints[] =
581 } bufferDataSources[] =
583 { "sub_data", WRITE_BUFFER_SUB_DATA },
584 { "map_write", WRITE_BUFFER_WRITE_MAP }
593 { "map_read", VERIFY_BUFFER_READ_MAP },
594 { "render_as_vertex_array", VERIFY_AS_VERTEX_ARRAY },
595 { "render_as_index_array", VERIFY_AS_INDEX_ARRAY }
600 tcu::TestCaseGroup* mapReadGroup = new tcu::TestCaseGroup(m_testCtx, "read", "Buffer read using glMapBufferRange()");
601 addChild(mapReadGroup);
604 for (int srcNdx = 0; srcNdx < DE_LENGTH_OF_ARRAY(bufferDataSources); srcNdx++)
606 WriteType write = bufferDataSources[srcNdx].write;
607 tcu::TestCaseGroup* writeGroup = new tcu::TestCaseGroup(m_testCtx, bufferDataSources[srcNdx].name, "");
608 mapReadGroup->addChild(writeGroup);
610 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
612 deUint32 target = bufferTargets[targetNdx];
613 const deUint32 hint = GL_STATIC_READ;
614 const int size = 1019;
615 const int partialOffs = 17;
616 const int partialSize = 501;
618 writeGroup->addChild(new BufferMapReadCase(m_context, (string(getBufferTargetName(target)) + "_full").c_str(), "", target, hint, size, 0, size, write));
619 writeGroup->addChild(new BufferMapReadCase(m_context, (string(getBufferTargetName(target)) + "_partial").c_str(), "", target, hint, size, partialOffs, partialSize, write));
625 tcu::TestCaseGroup* hintsGroup = new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Different usage hints with glMapBufferRange()");
626 mapReadGroup->addChild(hintsGroup);
628 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
630 for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
632 deUint32 target = bufferTargets[targetNdx];
633 deUint32 hint = usageHints[hintNdx];
634 const int size = 1019;
635 string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
637 hintsGroup->addChild(new BufferMapReadCase(m_context, name.c_str(), "", target, hint, size, 0, size, WRITE_BUFFER_SUB_DATA));
645 tcu::TestCaseGroup* mapWriteGroup = new tcu::TestCaseGroup(m_testCtx, "write", "Buffer write using glMapBufferRange()");
646 addChild(mapWriteGroup);
649 for (int useNdx = 0; useNdx < DE_LENGTH_OF_ARRAY(bufferUses); useNdx++)
651 VerifyType verify = bufferUses[useNdx].verify;
652 tcu::TestCaseGroup* useGroup = new tcu::TestCaseGroup(m_testCtx, bufferUses[useNdx].name, "");
653 mapWriteGroup->addChild(useGroup);
655 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
657 deUint32 target = bufferTargets[targetNdx];
658 deUint32 hint = GL_STATIC_DRAW;
659 const int size = 1019;
660 const int partialOffs = 17;
661 const int partialSize = 501;
662 string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
664 useGroup->addChild(new BufferMapWriteCase (m_context, (string(getBufferTargetName(target)) + "_full").c_str(), "", target, hint, size, verify));
665 useGroup->addChild(new BufferPartialMapWriteCase (m_context, (string(getBufferTargetName(target)) + "_partial").c_str(), "", target, hint, size, partialOffs, partialSize, verify));
671 tcu::TestCaseGroup* hintsGroup = new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Usage hints");
672 mapWriteGroup->addChild(hintsGroup);
674 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
676 for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
678 deUint32 target = bufferTargets[targetNdx];
679 deUint32 hint = usageHints[hintNdx];
680 const int size = 1019;
681 string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
683 hintsGroup->addChild(new BufferMapWriteCase(m_context, name.c_str(), "", target, hint, size, VERIFY_AS_VERTEX_ARRAY));
690 tcu::TestCaseGroup* invalidateGroup = new tcu::TestCaseGroup(m_testCtx, "invalidate", "Buffer invalidate");
691 mapWriteGroup->addChild(invalidateGroup);
693 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
695 deUint32 target = bufferTargets[targetNdx];
696 deUint32 hint = GL_STATIC_DRAW;
698 invalidateGroup->addChild(new BufferMapInvalidateCase(m_context, (string(getBufferTargetName(target)) + "_write_all").c_str(), "", target, hint, false, VERIFY_AS_VERTEX_ARRAY));
699 invalidateGroup->addChild(new BufferMapInvalidateCase(m_context, (string(getBufferTargetName(target)) + "_write_partial").c_str(), "", target, hint, true, VERIFY_AS_VERTEX_ARRAY));
703 // .partial_invalidate
705 tcu::TestCaseGroup* invalidateGroup = new tcu::TestCaseGroup(m_testCtx, "partial_invalidate", "Partial invalidate");
706 mapWriteGroup->addChild(invalidateGroup);
708 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
710 deUint32 target = bufferTargets[targetNdx];
711 deUint32 hint = GL_STATIC_DRAW;
713 invalidateGroup->addChild(new BufferMapPartialInvalidateCase(m_context, (string(getBufferTargetName(target)) + "_write_all").c_str(), "", target, hint, false, VERIFY_AS_VERTEX_ARRAY));
714 invalidateGroup->addChild(new BufferMapPartialInvalidateCase(m_context, (string(getBufferTargetName(target)) + "_write_partial").c_str(), "", target, hint, true, VERIFY_AS_VERTEX_ARRAY));
720 tcu::TestCaseGroup* flushGroup = new tcu::TestCaseGroup(m_testCtx, "explicit_flush", "Explicit flush");
721 mapWriteGroup->addChild(flushGroup);
723 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
725 deUint32 target = bufferTargets[targetNdx];
726 deUint32 hint = GL_STATIC_DRAW;
728 flushGroup->addChild(new BufferMapExplicitFlushCase(m_context, (string(getBufferTargetName(target)) + "_all").c_str(), "", target, hint, false, VERIFY_AS_VERTEX_ARRAY));
729 flushGroup->addChild(new BufferMapExplicitFlushCase(m_context, (string(getBufferTargetName(target)) + "_partial").c_str(), "", target, hint, true, VERIFY_AS_VERTEX_ARRAY));
735 tcu::TestCaseGroup* unsyncGroup = new tcu::TestCaseGroup(m_testCtx, "unsynchronized", "Unsynchronized map");
736 mapWriteGroup->addChild(unsyncGroup);
738 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
740 deUint32 target = bufferTargets[targetNdx];
741 deUint32 hint = GL_STATIC_DRAW;
743 unsyncGroup->addChild(new BufferMapUnsyncWriteCase(m_context, getBufferTargetName(target), "", target, hint));
750 tcu::TestCaseGroup* mapReadWriteGroup = new tcu::TestCaseGroup(m_testCtx, "read_write", "Buffer read and write using glMapBufferRange()");
751 addChild(mapReadWriteGroup);
754 for (int useNdx = 0; useNdx < DE_LENGTH_OF_ARRAY(bufferUses); useNdx++)
756 VerifyType verify = bufferUses[useNdx].verify;
757 tcu::TestCaseGroup* useGroup = new tcu::TestCaseGroup(m_testCtx, bufferUses[useNdx].name, "");
758 mapReadWriteGroup->addChild(useGroup);
760 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
762 deUint32 target = bufferTargets[targetNdx];
763 deUint32 hint = GL_STATIC_DRAW;
764 const int size = 1019;
765 const int partialOffs = 17;
766 const int partialSize = 501;
767 string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
769 useGroup->addChild(new BufferMapReadWriteCase(m_context, (string(getBufferTargetName(target)) + "_full").c_str(), "", target, hint, size, 0, size, verify));
770 useGroup->addChild(new BufferMapReadWriteCase(m_context, (string(getBufferTargetName(target)) + "_partial").c_str(), "", target, hint, size, partialOffs, partialSize, verify));
776 tcu::TestCaseGroup* hintsGroup = new tcu::TestCaseGroup(m_testCtx, "usage_hints", "Usage hints");
777 mapReadWriteGroup->addChild(hintsGroup);
779 for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(bufferTargets); targetNdx++)
781 for (int hintNdx = 0; hintNdx < DE_LENGTH_OF_ARRAY(usageHints); hintNdx++)
783 deUint32 target = bufferTargets[targetNdx];
784 deUint32 hint = usageHints[hintNdx];
785 const int size = 1019;
786 string name = string(getBufferTargetName(target)) + "_" + getUsageHintName(hint);
788 hintsGroup->addChild(new BufferMapReadWriteCase(m_context, name.c_str(), "", target, hint, size, 0, size, VERIFY_AS_VERTEX_ARRAY));