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