xref: /aosp_15_r20/external/deqp/external/openglcts/modules/gl/gl4cMapBufferAlignmentTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * OpenGL Conformance Test Suite
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright (c) 2015-2016 The Khronos Group Inc.
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
22*35238bceSAndroid Build Coastguard Worker  */ /*-------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker /**
25*35238bceSAndroid Build Coastguard Worker  * \file  gl4cMapBufferAlignmentTests.cpp
26*35238bceSAndroid Build Coastguard Worker  * \brief Implements conformance tests for "Map Buffer Alignment" functionality.
27*35238bceSAndroid Build Coastguard Worker  */ /*-------------------------------------------------------------------*/
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "gl4cMapBufferAlignmentTests.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker #include <algorithm>
37*35238bceSAndroid Build Coastguard Worker #include <vector>
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker using namespace glw;
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker namespace gl4cts
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace MapBufferAlignment
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker /** Implementation of Query test, description follows:
46*35238bceSAndroid Build Coastguard Worker  *
47*35238bceSAndroid Build Coastguard Worker  * Verify that GetInteger returns at least 64 when MIN_MAP_BUFFER_ALIGNEMENT is
48*35238bceSAndroid Build Coastguard Worker  * requested.
49*35238bceSAndroid Build Coastguard Worker  **/
50*35238bceSAndroid Build Coastguard Worker class Query : public deqp::TestCase
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker public:
53*35238bceSAndroid Build Coastguard Worker     /* Public methods */
Query(deqp::Context & context)54*35238bceSAndroid Build Coastguard Worker     Query(deqp::Context &context) : TestCase(context, "query", "Verifies value of MIN_MAP_BUFFER_ALIGNEMENT")
55*35238bceSAndroid Build Coastguard Worker     {
56*35238bceSAndroid Build Coastguard Worker         /* Nothing to be done */
57*35238bceSAndroid Build Coastguard Worker     }
~Query()58*35238bceSAndroid Build Coastguard Worker     virtual ~Query()
59*35238bceSAndroid Build Coastguard Worker     {
60*35238bceSAndroid Build Coastguard Worker         /* Nothing to be done */
61*35238bceSAndroid Build Coastguard Worker     }
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker     /** Execute test
64*35238bceSAndroid Build Coastguard Worker      *
65*35238bceSAndroid Build Coastguard Worker      * @return tcu::TestNode::STOP
66*35238bceSAndroid Build Coastguard Worker      **/
67*35238bceSAndroid Build Coastguard Worker     virtual tcu::TestNode::IterateResult iterate(void);
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker     static const GLint m_min_map_buffer_alignment = 64;
70*35238bceSAndroid Build Coastguard Worker };
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker /** Implementation of Functional test, description follows:
73*35238bceSAndroid Build Coastguard Worker  *
74*35238bceSAndroid Build Coastguard Worker  * Verifies that results of MapBuffer operations are as required.
75*35238bceSAndroid Build Coastguard Worker  *
76*35238bceSAndroid Build Coastguard Worker  * Steps:
77*35238bceSAndroid Build Coastguard Worker  * - prepare buffer filled with specific content;
78*35238bceSAndroid Build Coastguard Worker  * - map buffer with MapBuffer;
79*35238bceSAndroid Build Coastguard Worker  * - verify that returned data match contents of the buffer;
80*35238bceSAndroid Build Coastguard Worker  * - unmap buffer;
81*35238bceSAndroid Build Coastguard Worker  * - map buffer with MapBufferRange;
82*35238bceSAndroid Build Coastguard Worker  * - verify that returned data match contents of the buffer;
83*35238bceSAndroid Build Coastguard Worker  * - unmap buffer;
84*35238bceSAndroid Build Coastguard Worker  * - verify that pointers returned by map operations fulfil alignment
85*35238bceSAndroid Build Coastguard Worker  * requirements.
86*35238bceSAndroid Build Coastguard Worker  *
87*35238bceSAndroid Build Coastguard Worker  * Repeat steps for all valid:
88*35238bceSAndroid Build Coastguard Worker  * - <buffer> values;
89*35238bceSAndroid Build Coastguard Worker  * - <access> combinations.
90*35238bceSAndroid Build Coastguard Worker  *
91*35238bceSAndroid Build Coastguard Worker  * <offset> should be set to MIN_MAP_BUFFER_ALIGNEMENT - 1.
92*35238bceSAndroid Build Coastguard Worker  **/
93*35238bceSAndroid Build Coastguard Worker class Functional : public deqp::TestCase
94*35238bceSAndroid Build Coastguard Worker {
95*35238bceSAndroid Build Coastguard Worker public:
96*35238bceSAndroid Build Coastguard Worker     /* Public methods */
Functional(deqp::Context & context)97*35238bceSAndroid Build Coastguard Worker     Functional(deqp::Context &context)
98*35238bceSAndroid Build Coastguard Worker         : TestCase(context, "functional", "Verifies alignment of memory returned by MapBuffer operations")
99*35238bceSAndroid Build Coastguard Worker     {
100*35238bceSAndroid Build Coastguard Worker         /* Nothing to be done */
101*35238bceSAndroid Build Coastguard Worker     }
102*35238bceSAndroid Build Coastguard Worker 
~Functional()103*35238bceSAndroid Build Coastguard Worker     virtual ~Functional()
104*35238bceSAndroid Build Coastguard Worker     {
105*35238bceSAndroid Build Coastguard Worker         /* Nothing to be done */
106*35238bceSAndroid Build Coastguard Worker     }
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     void init();
109*35238bceSAndroid Build Coastguard Worker     /** Execute test
110*35238bceSAndroid Build Coastguard Worker      *
111*35238bceSAndroid Build Coastguard Worker      * @return tcu::TestNode::STOP
112*35238bceSAndroid Build Coastguard Worker      **/
113*35238bceSAndroid Build Coastguard Worker     virtual tcu::TestNode::IterateResult iterate(void);
114*35238bceSAndroid Build Coastguard Worker };
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker /** Execute test
117*35238bceSAndroid Build Coastguard Worker  *
118*35238bceSAndroid Build Coastguard Worker  * @return tcu::TestNode::STOP
119*35238bceSAndroid Build Coastguard Worker  **/
iterate()120*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult Query::iterate()
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker     GLint min_map_buffer_alignment = 0;
123*35238bceSAndroid Build Coastguard Worker     bool test_result               = true;
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker     const Functions &gl = m_context.getRenderContext().getFunctions();
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker     gl.getIntegerv(GL_MIN_MAP_BUFFER_ALIGNMENT, &min_map_buffer_alignment);
128*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     if (m_min_map_buffer_alignment > min_map_buffer_alignment)
131*35238bceSAndroid Build Coastguard Worker     {
132*35238bceSAndroid Build Coastguard Worker         test_result = false;
133*35238bceSAndroid Build Coastguard Worker     }
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     /* Set result */
136*35238bceSAndroid Build Coastguard Worker     if (true == test_result)
137*35238bceSAndroid Build Coastguard Worker     {
138*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
139*35238bceSAndroid Build Coastguard Worker     }
140*35238bceSAndroid Build Coastguard Worker     else
141*35238bceSAndroid Build Coastguard Worker     {
142*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
143*35238bceSAndroid Build Coastguard Worker     }
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     /* Done */
146*35238bceSAndroid Build Coastguard Worker     return tcu::TestNode::STOP;
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker struct BufferEnums
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker     GLenum m_target;
152*35238bceSAndroid Build Coastguard Worker     GLenum m_max_size;
153*35238bceSAndroid Build Coastguard Worker };
154*35238bceSAndroid Build Coastguard Worker 
init(void)155*35238bceSAndroid Build Coastguard Worker void Functional::init(void)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker     if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_buffer_storage"))
158*35238bceSAndroid Build Coastguard Worker     {
159*35238bceSAndroid Build Coastguard Worker         TCU_THROW(NotSupportedError, "GL_ARB_buffer_storage not supported");
160*35238bceSAndroid Build Coastguard Worker     }
161*35238bceSAndroid Build Coastguard Worker }
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker /** Execute test
164*35238bceSAndroid Build Coastguard Worker  *
165*35238bceSAndroid Build Coastguard Worker  * @return tcu::TestNode::STOP
166*35238bceSAndroid Build Coastguard Worker  **/
iterate()167*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult Functional::iterate()
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker     static const GLenum storage_flags[] = {
170*35238bceSAndroid Build Coastguard Worker         GL_MAP_READ_BIT,
171*35238bceSAndroid Build Coastguard Worker         GL_MAP_WRITE_BIT,
172*35238bceSAndroid Build Coastguard Worker         GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
173*35238bceSAndroid Build Coastguard Worker         GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT,
174*35238bceSAndroid Build Coastguard Worker         GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT,
175*35238bceSAndroid Build Coastguard Worker         GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
176*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT,
177*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT,
178*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
179*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT,
180*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT,
181*35238bceSAndroid Build Coastguard Worker         GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
182*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT,
183*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT,
184*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
185*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT,
186*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT,
187*35238bceSAndroid Build Coastguard Worker         GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
188*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT,
189*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT,
190*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
191*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT,
192*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT,
193*35238bceSAndroid Build Coastguard Worker         GL_CLIENT_STORAGE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT |
194*35238bceSAndroid Build Coastguard Worker             GL_MAP_WRITE_BIT,
195*35238bceSAndroid Build Coastguard Worker     };
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker     static const size_t n_storage_flags = sizeof(storage_flags) / sizeof(storage_flags[0]);
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker     static const BufferEnums buffers[] = {
200*35238bceSAndroid Build Coastguard Worker         {GL_ARRAY_BUFFER, GL_MAX_VARYING_COMPONENTS},
201*35238bceSAndroid Build Coastguard Worker         {GL_ATOMIC_COUNTER_BUFFER, GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE},
202*35238bceSAndroid Build Coastguard Worker         {GL_COPY_READ_BUFFER, 0},
203*35238bceSAndroid Build Coastguard Worker         {GL_COPY_WRITE_BUFFER, 0},
204*35238bceSAndroid Build Coastguard Worker         {GL_DISPATCH_INDIRECT_BUFFER, 0},
205*35238bceSAndroid Build Coastguard Worker         {GL_DRAW_INDIRECT_BUFFER, 0},
206*35238bceSAndroid Build Coastguard Worker         {GL_ELEMENT_ARRAY_BUFFER, GL_MAX_ELEMENTS_INDICES},
207*35238bceSAndroid Build Coastguard Worker         {GL_PIXEL_PACK_BUFFER, 0},
208*35238bceSAndroid Build Coastguard Worker         {GL_PIXEL_UNPACK_BUFFER, 0},
209*35238bceSAndroid Build Coastguard Worker         {GL_QUERY_BUFFER, 0},
210*35238bceSAndroid Build Coastguard Worker         {GL_SHADER_STORAGE_BUFFER, GL_MAX_SHADER_STORAGE_BLOCK_SIZE},
211*35238bceSAndroid Build Coastguard Worker         {GL_TEXTURE_BUFFER, GL_MAX_TEXTURE_BUFFER_SIZE},
212*35238bceSAndroid Build Coastguard Worker         {GL_TRANSFORM_FEEDBACK_BUFFER, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS},
213*35238bceSAndroid Build Coastguard Worker         {GL_UNIFORM_BUFFER, GL_MAX_UNIFORM_BLOCK_SIZE}};
214*35238bceSAndroid Build Coastguard Worker     static const size_t n_buffers = sizeof(buffers) / sizeof(buffers[0]);
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker     const Functions &gl = m_context.getRenderContext().getFunctions();
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker     std::vector<GLubyte> buffer_data;
219*35238bceSAndroid Build Coastguard Worker     size_t buffer_data_size        = 0;
220*35238bceSAndroid Build Coastguard Worker     GLuint buffer_id               = 0;
221*35238bceSAndroid Build Coastguard Worker     GLint buffer_size              = 0;
222*35238bceSAndroid Build Coastguard Worker     GLint min_map_buffer_alignment = 0;
223*35238bceSAndroid Build Coastguard Worker     GLuint offset                  = 0;
224*35238bceSAndroid Build Coastguard Worker     bool test_result               = true;
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker     /* Get min alignment */
227*35238bceSAndroid Build Coastguard Worker     gl.getIntegerv(GL_MIN_MAP_BUFFER_ALIGNMENT, &min_map_buffer_alignment);
228*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker     /* Prepare storage */
231*35238bceSAndroid Build Coastguard Worker     buffer_data_size = 2 * min_map_buffer_alignment;
232*35238bceSAndroid Build Coastguard Worker     buffer_data.resize(buffer_data_size);
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker     /* Prepare data */
235*35238bceSAndroid Build Coastguard Worker     for (size_t i = 0; i < buffer_data_size; ++i)
236*35238bceSAndroid Build Coastguard Worker     {
237*35238bceSAndroid Build Coastguard Worker         buffer_data[i] = (GLubyte)i;
238*35238bceSAndroid Build Coastguard Worker     }
239*35238bceSAndroid Build Coastguard Worker 
240*35238bceSAndroid Build Coastguard Worker     /* Run test */
241*35238bceSAndroid Build Coastguard Worker     try
242*35238bceSAndroid Build Coastguard Worker     {
243*35238bceSAndroid Build Coastguard Worker         for (size_t buffer_idx = 0; buffer_idx < n_buffers; ++buffer_idx)
244*35238bceSAndroid Build Coastguard Worker         {
245*35238bceSAndroid Build Coastguard Worker             const BufferEnums &buffer = buffers[buffer_idx];
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker             buffer_size = static_cast<GLint>(buffer_data_size);
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker             /* Get max size */
250*35238bceSAndroid Build Coastguard Worker             if (0 != buffer.m_max_size)
251*35238bceSAndroid Build Coastguard Worker             {
252*35238bceSAndroid Build Coastguard Worker                 gl.getIntegerv(buffer.m_max_size, &buffer_size);
253*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv");
254*35238bceSAndroid Build Coastguard Worker             }
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker             switch (buffer.m_max_size)
257*35238bceSAndroid Build Coastguard Worker             {
258*35238bceSAndroid Build Coastguard Worker             case GL_MAX_VARYING_COMPONENTS:
259*35238bceSAndroid Build Coastguard Worker             case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
260*35238bceSAndroid Build Coastguard Worker                 buffer_size = static_cast<glw::GLint>(buffer_size * sizeof(GLfloat));
261*35238bceSAndroid Build Coastguard Worker                 break;
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker             case GL_MAX_ELEMENTS_INDICES:
264*35238bceSAndroid Build Coastguard Worker                 buffer_size = static_cast<glw::GLint>(buffer_size * sizeof(GLuint));
265*35238bceSAndroid Build Coastguard Worker                 break;
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker             default:
268*35238bceSAndroid Build Coastguard Worker                 break;
269*35238bceSAndroid Build Coastguard Worker             }
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker             buffer_size = std::min(buffer_size, (GLint)buffer_data_size);
272*35238bceSAndroid Build Coastguard Worker             offset      = std::min(buffer_size - 1, min_map_buffer_alignment - 1);
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker             for (size_t set_idx = 0; set_idx < n_storage_flags; ++set_idx)
275*35238bceSAndroid Build Coastguard Worker             {
276*35238bceSAndroid Build Coastguard Worker                 const GLenum &storage_set = storage_flags[set_idx];
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker                 /* Prepare buffer */
279*35238bceSAndroid Build Coastguard Worker                 gl.genBuffers(1, &buffer_id);
280*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "GenBuffers");
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(buffer.m_target, buffer_id);
283*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer");
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker                 gl.bufferStorage(buffer.m_target, buffer_size, &buffer_data[0], storage_set);
286*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "BufferStorage");
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker                 /* Test MapBuffer */
289*35238bceSAndroid Build Coastguard Worker                 GLenum map_buffer_access = GL_READ_WRITE;
290*35238bceSAndroid Build Coastguard Worker                 if (0 == (storage_set & GL_MAP_READ_BIT))
291*35238bceSAndroid Build Coastguard Worker                 {
292*35238bceSAndroid Build Coastguard Worker                     map_buffer_access = GL_WRITE_ONLY;
293*35238bceSAndroid Build Coastguard Worker                 }
294*35238bceSAndroid Build Coastguard Worker                 else if (0 == (storage_set & GL_MAP_WRITE_BIT))
295*35238bceSAndroid Build Coastguard Worker                 {
296*35238bceSAndroid Build Coastguard Worker                     map_buffer_access = GL_READ_ONLY;
297*35238bceSAndroid Build Coastguard Worker                 }
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker                 GLubyte *map_buffer_ptr = (GLubyte *)gl.mapBuffer(buffer.m_target, map_buffer_access);
300*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "MapBuffer");
301*35238bceSAndroid Build Coastguard Worker 
302*35238bceSAndroid Build Coastguard Worker                 if (GL_WRITE_ONLY != map_buffer_access)
303*35238bceSAndroid Build Coastguard Worker                 {
304*35238bceSAndroid Build Coastguard Worker                     for (size_t i = 0; i < (size_t)buffer_size; ++i)
305*35238bceSAndroid Build Coastguard Worker                     {
306*35238bceSAndroid Build Coastguard Worker                         if (buffer_data[i] != map_buffer_ptr[i])
307*35238bceSAndroid Build Coastguard Worker                         {
308*35238bceSAndroid Build Coastguard Worker                             test_result = false;
309*35238bceSAndroid Build Coastguard Worker                             break;
310*35238bceSAndroid Build Coastguard Worker                         }
311*35238bceSAndroid Build Coastguard Worker                     }
312*35238bceSAndroid Build Coastguard Worker                 }
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker                 gl.unmapBuffer(buffer.m_target);
315*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "UnmapBuffer");
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker                 /* Test MapBufferRange */
318*35238bceSAndroid Build Coastguard Worker                 static const GLenum map_buffer_range_access_mask = GL_DYNAMIC_STORAGE_BIT | GL_CLIENT_STORAGE_BIT;
319*35238bceSAndroid Build Coastguard Worker                 GLenum map_buffer_range_access                   = (storage_set & (~map_buffer_range_access_mask));
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker                 GLubyte *map_buffer_range_ptr = (GLubyte *)gl.mapBufferRange(
322*35238bceSAndroid Build Coastguard Worker                     buffer.m_target, offset, buffer_size - offset, map_buffer_range_access);
323*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "MapBufferRange");
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker                 if (0 != (GL_MAP_READ_BIT & map_buffer_range_access))
326*35238bceSAndroid Build Coastguard Worker                 {
327*35238bceSAndroid Build Coastguard Worker                     for (size_t i = 0; i < (size_t)buffer_size - (size_t)offset; ++i)
328*35238bceSAndroid Build Coastguard Worker                     {
329*35238bceSAndroid Build Coastguard Worker                         if (buffer_data[i + offset] != map_buffer_range_ptr[i])
330*35238bceSAndroid Build Coastguard Worker                         {
331*35238bceSAndroid Build Coastguard Worker                             test_result = false;
332*35238bceSAndroid Build Coastguard Worker                             break;
333*35238bceSAndroid Build Coastguard Worker                         }
334*35238bceSAndroid Build Coastguard Worker                     }
335*35238bceSAndroid Build Coastguard Worker                 }
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker                 gl.unmapBuffer(buffer.m_target);
338*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "UnmapBuffer");
339*35238bceSAndroid Build Coastguard Worker 
340*35238bceSAndroid Build Coastguard Worker                 gl.bindBuffer(buffer.m_target, 0 /* id */);
341*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer");
342*35238bceSAndroid Build Coastguard Worker 
343*35238bceSAndroid Build Coastguard Worker                 /* Remove buffer */
344*35238bceSAndroid Build Coastguard Worker                 gl.deleteBuffers(1, &buffer_id);
345*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "DeleteBuffers");
346*35238bceSAndroid Build Coastguard Worker 
347*35238bceSAndroid Build Coastguard Worker                 buffer_id = 0;
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker                 /* Verify that pointers are properly aligned */
350*35238bceSAndroid Build Coastguard Worker                 if (0 != ((GLintptr)map_buffer_ptr % min_map_buffer_alignment))
351*35238bceSAndroid Build Coastguard Worker                 {
352*35238bceSAndroid Build Coastguard Worker                     test_result = false;
353*35238bceSAndroid Build Coastguard Worker                     break;
354*35238bceSAndroid Build Coastguard Worker                 }
355*35238bceSAndroid Build Coastguard Worker 
356*35238bceSAndroid Build Coastguard Worker                 if (0 != (((GLintptr)map_buffer_range_ptr - offset) % min_map_buffer_alignment))
357*35238bceSAndroid Build Coastguard Worker                 {
358*35238bceSAndroid Build Coastguard Worker                     test_result = false;
359*35238bceSAndroid Build Coastguard Worker                     break;
360*35238bceSAndroid Build Coastguard Worker                 }
361*35238bceSAndroid Build Coastguard Worker             }
362*35238bceSAndroid Build Coastguard Worker         }
363*35238bceSAndroid Build Coastguard Worker     }
364*35238bceSAndroid Build Coastguard Worker     catch (const std::exception &exc)
365*35238bceSAndroid Build Coastguard Worker     {
366*35238bceSAndroid Build Coastguard Worker         if (0 != buffer_id)
367*35238bceSAndroid Build Coastguard Worker         {
368*35238bceSAndroid Build Coastguard Worker             gl.deleteBuffers(1, &buffer_id);
369*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "DeleteBuffers");
370*35238bceSAndroid Build Coastguard Worker         }
371*35238bceSAndroid Build Coastguard Worker 
372*35238bceSAndroid Build Coastguard Worker         TCU_FAIL(exc.what());
373*35238bceSAndroid Build Coastguard Worker     }
374*35238bceSAndroid Build Coastguard Worker 
375*35238bceSAndroid Build Coastguard Worker     /* Set result */
376*35238bceSAndroid Build Coastguard Worker     if (true == test_result)
377*35238bceSAndroid Build Coastguard Worker     {
378*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
379*35238bceSAndroid Build Coastguard Worker     }
380*35238bceSAndroid Build Coastguard Worker     else
381*35238bceSAndroid Build Coastguard Worker     {
382*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
383*35238bceSAndroid Build Coastguard Worker     }
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker     /* Done */
386*35238bceSAndroid Build Coastguard Worker     return tcu::TestNode::STOP;
387*35238bceSAndroid Build Coastguard Worker }
388*35238bceSAndroid Build Coastguard Worker } // namespace MapBufferAlignment
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker /** Constructor.
391*35238bceSAndroid Build Coastguard Worker  *
392*35238bceSAndroid Build Coastguard Worker  *  @param context Rendering context.
393*35238bceSAndroid Build Coastguard Worker  **/
MapBufferAlignmentTests(deqp::Context & context)394*35238bceSAndroid Build Coastguard Worker MapBufferAlignmentTests::MapBufferAlignmentTests(deqp::Context &context)
395*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "map_buffer_alignment", "Verifies \"map buffer alignment\" functionality")
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker     /* Left blank on purpose */
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker /** Initializes a texture_storage_multisample test group.
401*35238bceSAndroid Build Coastguard Worker  *
402*35238bceSAndroid Build Coastguard Worker  **/
init(void)403*35238bceSAndroid Build Coastguard Worker void MapBufferAlignmentTests::init(void)
404*35238bceSAndroid Build Coastguard Worker {
405*35238bceSAndroid Build Coastguard Worker     addChild(new MapBufferAlignment::Query(m_context));
406*35238bceSAndroid Build Coastguard Worker     addChild(new MapBufferAlignment::Functional(m_context));
407*35238bceSAndroid Build Coastguard Worker }
408*35238bceSAndroid Build Coastguard Worker 
409*35238bceSAndroid Build Coastguard Worker } // namespace gl4cts
410