1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
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.
22 */ /*-------------------------------------------------------------------*/
26 * \file gl4cShaderDrawParametersTests.cpp
27 * \brief Conformance tests for the GL_ARB_shader_draw_parameters functionality.
28 */ /*-------------------------------------------------------------------*/
30 #include "gl4cShaderDrawParametersTests.hpp"
31 #include "gluContextInfo.hpp"
32 #include "gluDefs.hpp"
33 #include "gluDrawUtil.hpp"
34 #include "gluShaderProgram.hpp"
35 #include "glwEnums.hpp"
36 #include "glwFunctions.hpp"
37 #include "tcuRenderTarget.hpp"
38 #include "tcuTestLog.hpp"
46 const char* sdp_compute_extensionCheck = "#version 450 core\n"
48 "#extension GL_ARB_shader_draw_parameters : require\n"
50 "#ifndef GL_ARB_shader_draw_parameters\n"
51 " #error GL_ARB_shader_draw_parameters not defined\n"
53 " #if (GL_ARB_shader_draw_parameters != 1)\n"
54 " #error GL_ARB_shader_draw_parameters wrong value\n"
56 "#endif // GL_ARB_shader_draw_parameters\n"
58 "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
64 static const char* sdp_vertShader = "#version 450\n"
66 "#extension GL_ARB_shader_draw_parameters : enable\n"
73 " float hOffset = float(gl_BaseVertexARB) / 5.0;\n"
74 " float vOffset = float(gl_BaseInstanceARB) / 5.0;\n"
75 " color = vec3(0.0);\n"
76 " if (gl_DrawIDARB % 3 == 0) color.r = 1;\n"
77 " else if (gl_DrawIDARB % 3 == 1) color.g = 1;\n"
78 " else if (gl_DrawIDARB % 3 == 2) color.b = 1;\n"
79 " gl_Position = vec4(vertex + vec3(hOffset, vOffset, 0), 1);\n"
82 static const char* sdp_fragShader = "#version 450\n"
84 "#extension GL_ARB_shader_draw_parameters : enable\n"
87 "out vec4 fragColor;\n"
91 " fragColor = vec4(color, 1.0);\n"
96 * @param context Rendering context
98 ShaderDrawParametersExtensionTestCase::ShaderDrawParametersExtensionTestCase(deqp::Context& context)
99 : TestCase(context, "ShaderDrawParametersExtension",
100 "Verifies if GL_ARB_shader_draw_parameters extension is available for GLSL")
102 /* Left blank intentionally */
105 /** Executes test iteration.
107 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
109 tcu::TestNode::IterateResult ShaderDrawParametersExtensionTestCase::iterate()
111 if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_draw_parameters"))
113 m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
117 const Functions& gl = m_context.getRenderContext().getFunctions();
119 std::string shader = sdp_compute_extensionCheck;
121 ProgramSources sources;
122 sources << ComputeSource(shader);
123 ShaderProgram program(gl, sources);
127 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
128 m_testCtx.getLog() << tcu::TestLog::Message << "Checking shader preprocessor directives failed. Source:\n"
129 << shader.c_str() << "InfoLog:\n"
130 << program.getShaderInfo(SHADERTYPE_COMPUTE).infoLog << "\n"
131 << tcu::TestLog::EndMessage;
135 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
141 * @param context Rendering context
142 * @param name Test case name
143 * @param description Test case description
145 ShaderDrawParametersTestBase::ShaderDrawParametersTestBase(deqp::Context& context, const char* name,
146 const char* description)
147 : TestCase(context, name, description)
151 , m_drawIndirectBuffer(0)
152 , m_parameterBuffer(0)
154 /* Left blank intentionally */
157 /** Stub init method */
158 void ShaderDrawParametersTestBase::init()
160 if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_draw_parameters"))
161 TCU_THROW(NotSupportedError, "Extension GL_ARB_shader_draw_parameters not supported");
165 const Functions& gl = m_context.getRenderContext().getFunctions();
167 const GLfloat vertices[] = {
168 -1.0f, -1.0f, 0.0f, -1.0f, -0.8f, 0.0f, -0.9f, -1.0f, 0.0f,
169 -0.9f, -0.8f, 0.0f, -0.8f, -1.0f, 0.0f, -0.8f, -0.8f, 0.0f,
172 const GLushort elements[] = { 0, 1, 2, 3, 4, 5 };
174 // Generate vertex array object
175 gl.genVertexArrays(1, &m_vao);
176 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays");
178 gl.bindVertexArray(m_vao);
179 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray");
181 // Setup vertex array buffer
182 gl.genBuffers(1, &m_arrayBuffer);
183 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
185 gl.bindBuffer(GL_ARRAY_BUFFER, m_arrayBuffer);
186 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
188 gl.bufferData(GL_ARRAY_BUFFER, 24 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
189 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
191 // Setup element array buffer
192 gl.genBuffers(1, &m_elementBuffer);
193 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
195 gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_elementBuffer);
196 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
198 gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLushort), elements, GL_STATIC_DRAW);
199 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
202 /** Stub deinit method */
203 void ShaderDrawParametersTestBase::deinit()
205 const Functions& gl = m_context.getRenderContext().getFunctions();
208 gl.deleteVertexArrays(1, &m_vao);
210 gl.deleteBuffers(1, &m_arrayBuffer);
212 gl.deleteBuffers(1, &m_elementBuffer);
217 /** Executes test iteration.
219 * @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
221 tcu::TestNode::IterateResult ShaderDrawParametersTestBase::iterate()
223 if (draw() && verify())
224 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
226 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
231 /** Draws scene using specific case parameters.
233 * @return Returns true if no error occurred, false otherwise.
235 bool ShaderDrawParametersTestBase::draw()
237 const Functions& gl = m_context.getRenderContext().getFunctions();
239 ProgramSources sources = makeVtxFragSources(sdp_vertShader, sdp_fragShader);
240 ShaderProgram program(gl, sources);
244 m_testCtx.getLog() << tcu::TestLog::Message << "Shader build failed.\n"
245 << "Vertex: " << program.getShaderInfo(SHADERTYPE_VERTEX).infoLog << "\n"
246 << "Fragment: " << program.getShaderInfo(SHADERTYPE_FRAGMENT).infoLog << "\n"
247 << "Program: " << program.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
251 gl.useProgram(program.getProgram());
252 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
254 gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
255 gl.clear(GL_COLOR_BUFFER_BIT);
258 gl.blendFunc(GL_ONE, GL_ONE);
260 gl.enableVertexAttribArray(0);
261 GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
262 gl.vertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
263 GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
267 gl.disableVertexAttribArray(0);
268 GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
270 gl.disable(GL_BLEND);
275 /** Verifies if drawing result is as expected.
277 * @return Returns true if verifying process has been successfully completed, false otherwise.
279 bool ShaderDrawParametersTestBase::verify()
281 const Functions& gl = m_context.getRenderContext().getFunctions();
282 const tcu::RenderTarget& rt = m_context.getRenderContext().getRenderTarget();
284 const int width = rt.getWidth();
285 const int height = rt.getHeight();
287 std::vector<GLubyte> pixels;
288 pixels.resize(width * height * 3);
290 gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
291 gl.readPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels.data());
292 gl.pixelStorei(GL_PACK_ALIGNMENT, 4);
294 std::vector<ResultPoint>::iterator it;
295 for (it = m_resultPoints.begin(); it != m_resultPoints.end(); ++it)
297 int x = (int)(((it->x + 1.0f) / 2) * width);
298 int y = (int)(((it->y + 1.0f) / 2) * height);
299 int red = (int)(it->red * 255);
300 int green = (int)(it->green * 255);
301 int blue = (int)(it->blue * 255);
303 if (pixels[(x + y * width) * 3 + 0] != red || pixels[(x + y * width) * 3 + 1] != green ||
304 pixels[(x + y * width) * 3 + 2] != blue)
306 m_testCtx.getLog() << tcu::TestLog::Message << "Verification failed (" << x << "/" << y << ")\n"
307 << "Expected point: (" << red << "," << green << "," << blue << ")\n"
308 << "Result point: (" << (int)pixels[(x + y * width) * 3 + 0] << ","
309 << (int)pixels[(x + y * width) * 3 + 1] << "," << (int)pixels[(x + y * width) * 3 + 2]
311 << tcu::TestLog::EndMessage;
319 /** Child case initialization method.
321 void ShaderDrawParametersTestBase::initChild()
326 /** Child case deinitialization method.
328 void ShaderDrawParametersTestBase::deinitChild()
333 /** Child case drawing command invocation.
335 void ShaderDrawParametersTestBase::drawCommand()
340 /* ShaderDrawArraysParametersTestCase */
342 void ShaderDrawArraysParametersTestCase::initChild()
344 // Set expected result vector [x, y, red, green, blue]
345 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
346 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
347 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
348 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
351 void ShaderDrawArraysParametersTestCase::deinitChild()
356 void ShaderDrawArraysParametersTestCase::drawCommand()
358 const Functions& gl = m_context.getRenderContext().getFunctions();
360 gl.drawArrays(GL_TRIANGLE_STRIP, 1, 4);
361 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays");
364 /* ---------------------------------- */
366 /* ShaderDrawElementsParametersTestCase */
368 void ShaderDrawElementsParametersTestCase::initChild()
370 // Set expected result vector [x, y, red, green, blue]
371 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
372 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
373 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
374 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
377 void ShaderDrawElementsParametersTestCase::deinitChild()
382 void ShaderDrawElementsParametersTestCase::drawCommand()
384 const Functions& gl = m_context.getRenderContext().getFunctions();
386 gl.drawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (GLvoid*)(2 * sizeof(GLushort)));
387 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElements");
390 /* ---------------------------------- */
392 /* ShaderDrawArraysIndirectParametersTestCase */
394 void ShaderDrawArraysIndirectParametersTestCase::initChild()
396 const Functions& gl = m_context.getRenderContext().getFunctions();
398 // Set expected result vector [x, y, red, green, blue]
399 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
400 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
401 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
402 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
404 const SDPDrawArraysIndirectCommand indirect[] = {
408 // Setup indirect command buffer
409 gl.genBuffers(1, &m_drawIndirectBuffer);
410 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
412 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
413 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
415 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 1 * sizeof(SDPDrawArraysIndirectCommand), indirect, GL_STATIC_DRAW);
416 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
419 void ShaderDrawArraysIndirectParametersTestCase::deinitChild()
421 const Functions& gl = m_context.getRenderContext().getFunctions();
423 if (m_drawIndirectBuffer)
424 gl.deleteBuffers(1, &m_drawIndirectBuffer);
427 void ShaderDrawArraysIndirectParametersTestCase::drawCommand()
429 const Functions& gl = m_context.getRenderContext().getFunctions();
431 gl.drawArraysIndirect(GL_TRIANGLE_STRIP, (GLvoid*)0);
432 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArraysIndirect");
435 /* ---------------------------------- */
437 /* ShaderDrawElementsIndirectParametersTestCase */
439 void ShaderDrawElementsIndirectParametersTestCase::initChild()
441 const Functions& gl = m_context.getRenderContext().getFunctions();
443 // Set expected result vector [x, y, red, green, blue]
444 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
445 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
446 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
447 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
449 const SDPDrawElementsIndirectCommand indirect[] = {
453 // Setup indirect command buffer
454 gl.genBuffers(1, &m_drawIndirectBuffer);
455 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
457 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
458 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
460 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 1 * sizeof(SDPDrawElementsIndirectCommand), indirect, GL_STATIC_DRAW);
461 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
464 void ShaderDrawElementsIndirectParametersTestCase::deinitChild()
466 const Functions& gl = m_context.getRenderContext().getFunctions();
468 if (m_drawIndirectBuffer)
469 gl.deleteBuffers(1, &m_drawIndirectBuffer);
472 void ShaderDrawElementsIndirectParametersTestCase::drawCommand()
474 const Functions& gl = m_context.getRenderContext().getFunctions();
476 gl.drawElementsIndirect(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT, (GLvoid*)0);
477 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsIndirect");
480 /* ---------------------------------- */
482 /* ShaderDrawArraysInstancedParametersTestCase */
484 void ShaderDrawArraysInstancedParametersTestCase::initChild()
486 // Set expected result vector [x, y, red, green, blue]
487 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
488 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
489 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
490 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
493 void ShaderDrawArraysInstancedParametersTestCase::deinitChild()
498 void ShaderDrawArraysInstancedParametersTestCase::drawCommand()
500 const Functions& gl = m_context.getRenderContext().getFunctions();
502 gl.drawArraysInstanced(GL_TRIANGLE_STRIP, 2, 4, 2);
503 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArraysInstanced");
506 /* ---------------------------------- */
508 /* ShaderDrawElementsInstancedParametersTestCase */
510 void ShaderDrawElementsInstancedParametersTestCase::initChild()
512 // Set expected result vector [x, y, red, green, blue]
513 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
514 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
515 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
516 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
519 void ShaderDrawElementsInstancedParametersTestCase::deinitChild()
524 void ShaderDrawElementsInstancedParametersTestCase::drawCommand()
526 const Functions& gl = m_context.getRenderContext().getFunctions();
528 gl.drawElementsInstanced(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_SHORT, (GLvoid*)0, 3);
529 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawElementsInstanced");
532 /* ---------------------------------- */
534 /* ShaderMultiDrawArraysParametersTestCase */
536 void ShaderMultiDrawArraysParametersTestCase::initChild()
538 // Set expected result vector [x, y, red, green, blue]
539 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
540 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 1.0f, 0.0f));
541 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 0.0f, 1.0f, 0.0f));
542 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
545 void ShaderMultiDrawArraysParametersTestCase::deinitChild()
550 void ShaderMultiDrawArraysParametersTestCase::drawCommand()
552 const Functions& gl = m_context.getRenderContext().getFunctions();
554 const GLint dFirst[] = { 0, 1 };
555 const GLsizei dCount[] = { 4, 4 };
557 gl.multiDrawArrays(GL_TRIANGLE_STRIP, dFirst, dCount, 2);
558 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawArrays");
561 /* ---------------------------------- */
563 /* ShaderMultiDrawElementsParametersTestCase */
565 void ShaderMultiDrawElementsParametersTestCase::initChild()
567 // Set expected result vector [x, y, red, green, blue]
568 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
569 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 1.0f, 0.0f));
570 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 1.0f, 0.0f));
571 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
574 void ShaderMultiDrawElementsParametersTestCase::deinitChild()
579 void ShaderMultiDrawElementsParametersTestCase::drawCommand()
581 const Functions& gl = m_context.getRenderContext().getFunctions();
583 const GLsizei dCount[] = { 5, 4 };
584 const GLvoid* dIndices[] = { (GLvoid*)(1 * sizeof(GLushort)), (GLvoid*)(1 * sizeof(GLushort)) };
586 gl.multiDrawElements(GL_TRIANGLE_STRIP, dCount, GL_UNSIGNED_SHORT, dIndices, 2);
587 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawElements");
590 /* ---------------------------------- */
592 /* ShaderMultiDrawArraysIndirectParametersTestCase */
594 void ShaderMultiDrawArraysIndirectParametersTestCase::initChild()
596 const Functions& gl = m_context.getRenderContext().getFunctions();
598 // Set expected result vector [x, y, red, green, blue]
599 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 1.0f, 0.0f));
600 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 1.0f, 0.0f));
601 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
602 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
603 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.05f, 0.0f, 0.0f, 1.0f));
604 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.15f, 0.0f, 0.0f, 0.0f));
605 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.05f, 0.0f, 0.0f, 0.0f));
606 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.15f, 0.0f, 0.0f, 0.0f));
608 const SDPDrawArraysIndirectCommand indirect[] = {
609 { 5, 1, 1, 0 }, { 4, 1, 0, 0 }, { 3, 1, 0, 1 },
612 // Setup indirect command buffer
613 gl.genBuffers(1, &m_drawIndirectBuffer);
614 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
616 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
617 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
619 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 3 * sizeof(SDPDrawArraysIndirectCommand), indirect, GL_STATIC_DRAW);
620 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
623 void ShaderMultiDrawArraysIndirectParametersTestCase::deinitChild()
625 const Functions& gl = m_context.getRenderContext().getFunctions();
627 if (m_drawIndirectBuffer)
628 gl.deleteBuffers(1, &m_drawIndirectBuffer);
631 void ShaderMultiDrawArraysIndirectParametersTestCase::drawCommand()
633 const Functions& gl = m_context.getRenderContext().getFunctions();
635 gl.multiDrawArraysIndirect(GL_TRIANGLE_STRIP, (GLvoid*)0, 3, sizeof(SDPDrawArraysIndirectCommand));
636 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawArraysIndirect");
639 /* ---------------------------------- */
641 /* ShaderMultiDrawElementsIndirectParametersTestCase */
643 void ShaderMultiDrawElementsIndirectParametersTestCase::initChild()
645 const Functions& gl = m_context.getRenderContext().getFunctions();
647 // Set expected result vector [x, y, red, green, blue]
648 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
649 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
650 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
651 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
652 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.05f, 0.0f, 0.0f, 0.0f));
653 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.15f, 0.0f, 0.0f, 0.0f));
654 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.05f, 0.0f, 0.0f, 0.0f));
655 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.15f, 0.0f, 1.0f, 0.0f));
656 m_resultPoints.push_back(ResultPoint(-0.8f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
657 m_resultPoints.push_back(ResultPoint(-0.8f + 0.05f, -1.0f + 0.15f, 0.0f, 0.0f, 1.0f));
658 m_resultPoints.push_back(ResultPoint(-0.8f + 0.15f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
659 m_resultPoints.push_back(ResultPoint(-0.8f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
661 const SDPDrawElementsIndirectCommand indirect[] = {
662 { 4, 1, 0, 0, 0 }, { 3, 1, 3, 0, 1 }, { 3, 1, 0, 1, 0 },
665 // Setup indirect command buffer
666 gl.genBuffers(1, &m_drawIndirectBuffer);
667 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
669 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
670 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
672 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 3 * sizeof(SDPDrawElementsIndirectCommand), indirect, GL_STATIC_DRAW);
673 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
676 void ShaderMultiDrawElementsIndirectParametersTestCase::deinitChild()
678 const Functions& gl = m_context.getRenderContext().getFunctions();
680 if (m_drawIndirectBuffer)
681 gl.deleteBuffers(1, &m_drawIndirectBuffer);
684 void ShaderMultiDrawElementsIndirectParametersTestCase::drawCommand()
686 const Functions& gl = m_context.getRenderContext().getFunctions();
688 gl.multiDrawElementsIndirect(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT, (GLvoid*)0, 3,
689 sizeof(SDPDrawElementsIndirectCommand));
690 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawElementsIndirect");
693 /* ---------------------------------- */
695 /* ShaderMultiDrawArraysIndirectCountParametersTestCase */
697 void ShaderMultiDrawArraysIndirectCountParametersTestCase::initChild()
699 if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_indirect_parameters"))
700 TCU_THROW(NotSupportedError, "Extension GL_ARB_indirect_parameters not supported");
702 const Functions& gl = m_context.getRenderContext().getFunctions();
704 // Set expected result vector [x, y, red, green, blue]
705 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
706 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
707 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
708 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 1.0f, 0.0f, 0.0f));
709 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.05f, 0.0f, 1.0f, 0.0f));
710 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.8f + 0.15f, 0.0f, 1.0f, 0.0f));
711 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.05f, 0.0f, 1.0f, 0.0f));
712 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.8f + 0.15f, 0.0f, 1.0f, 0.0f));
713 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.6f + 0.05f, 0.0f, 0.0f, 0.0f));
714 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -0.6f + 0.15f, 0.0f, 0.0f, 0.0f));
715 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.6f + 0.05f, 0.0f, 0.0f, 1.0f));
716 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -0.6f + 0.15f, 0.0f, 0.0f, 1.0f));
718 const SDPDrawArraysIndirectCommand indirect[] = {
719 { 5, 1, 1, 0 }, { 6, 1, 0, 1 }, { 4, 1, 2, 2 },
722 const GLushort parameters[] = { 1, 1, 1 };
724 // Setup indirect command buffer
725 gl.genBuffers(1, &m_drawIndirectBuffer);
726 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
728 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
729 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
731 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 4 * sizeof(SDPDrawArraysIndirectCommand), indirect, GL_STATIC_DRAW);
732 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
734 // Setup indirect command buffer
735 gl.genBuffers(1, &m_parameterBuffer);
736 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
738 gl.bindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameterBuffer);
739 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
741 gl.bufferData(GL_PARAMETER_BUFFER_ARB, 3 * sizeof(GLushort), parameters, GL_STATIC_DRAW);
742 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
745 void ShaderMultiDrawArraysIndirectCountParametersTestCase::deinitChild()
747 const Functions& gl = m_context.getRenderContext().getFunctions();
749 if (m_drawIndirectBuffer)
750 gl.deleteBuffers(1, &m_drawIndirectBuffer);
751 if (m_parameterBuffer)
752 gl.deleteBuffers(1, &m_parameterBuffer);
755 void ShaderMultiDrawArraysIndirectCountParametersTestCase::drawCommand()
757 const Functions& gl = m_context.getRenderContext().getFunctions();
759 gl.multiDrawArraysIndirectCountARB(GL_TRIANGLE_STRIP, 0, 0, 3, sizeof(SDPDrawArraysIndirectCommand));
760 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawArraysIndirect");
763 /* ---------------------------------- */
765 /* ShaderMultiDrawElementsIndirectCountParametersTestCase */
767 void ShaderMultiDrawElementsIndirectCountParametersTestCase::initChild()
769 if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_indirect_parameters"))
770 TCU_THROW(NotSupportedError, "Extension GL_ARB_indirect_parameters not supported");
772 const Functions& gl = m_context.getRenderContext().getFunctions();
774 // Set expected result vector [x, y, red, green, blue]
775 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.05f, 1.0f, 0.0f, 0.0f));
776 m_resultPoints.push_back(ResultPoint(-1.0f + 0.05f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
777 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.05f, 0.0f, 0.0f, 0.0f));
778 m_resultPoints.push_back(ResultPoint(-1.0f + 0.15f, -1.0f + 0.15f, 0.0f, 0.0f, 0.0f));
779 m_resultPoints.push_back(ResultPoint(-0.8f + 0.05f, -0.8f + 0.05f, 0.0f, 0.0f, 0.0f));
780 m_resultPoints.push_back(ResultPoint(-0.8f + 0.05f, -0.8f + 0.15f, 0.0f, 1.0f, 1.0f));
781 m_resultPoints.push_back(ResultPoint(-0.8f + 0.15f, -0.8f + 0.05f, 0.0f, 0.0f, 1.0f));
782 m_resultPoints.push_back(ResultPoint(-0.8f + 0.15f, -0.8f + 0.15f, 0.0f, 0.0f, 0.0f));
784 const SDPDrawElementsIndirectCommand indirect[] = {
785 { 3, 1, 0, 0, 0 }, { 3, 1, 0, 1, 1 }, { 4, 1, 0, 1, 1 },
788 const GLushort parameters[] = { 1, 1, 1 };
790 // Setup indirect command buffer
791 gl.genBuffers(1, &m_drawIndirectBuffer);
792 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
794 gl.bindBuffer(GL_DRAW_INDIRECT_BUFFER, m_drawIndirectBuffer);
795 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
797 gl.bufferData(GL_DRAW_INDIRECT_BUFFER, 3 * sizeof(SDPDrawElementsIndirectCommand), indirect, GL_STATIC_DRAW);
798 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
800 // Setup indirect command buffer
801 gl.genBuffers(1, &m_parameterBuffer);
802 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
804 gl.bindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameterBuffer);
805 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
807 gl.bufferData(GL_PARAMETER_BUFFER_ARB, 3 * sizeof(GLushort), parameters, GL_STATIC_DRAW);
808 GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
811 void ShaderMultiDrawElementsIndirectCountParametersTestCase::deinitChild()
813 const Functions& gl = m_context.getRenderContext().getFunctions();
815 if (m_drawIndirectBuffer)
816 gl.deleteBuffers(1, &m_drawIndirectBuffer);
817 if (m_parameterBuffer)
818 gl.deleteBuffers(1, &m_parameterBuffer);
821 void ShaderMultiDrawElementsIndirectCountParametersTestCase::drawCommand()
823 const Functions& gl = m_context.getRenderContext().getFunctions();
825 gl.multiDrawElementsIndirectCountARB(GL_TRIANGLE_STRIP, GL_UNSIGNED_SHORT, 0, 0, 3,
826 sizeof(SDPDrawElementsIndirectCommand));
827 GLU_EXPECT_NO_ERROR(gl.getError(), "glMultiDrawElementsIndirect");
830 /* ---------------------------------- */
834 * @param context Rendering context.
836 ShaderDrawParametersTests::ShaderDrawParametersTests(deqp::Context& context)
837 : TestCaseGroup(context, "shader_draw_parameters_tests",
838 "Verify conformance of GL_ARB_shader_draw_parameters implementation")
842 /** Initializes the test group contents. */
843 void ShaderDrawParametersTests::init()
845 addChild(new ShaderDrawParametersExtensionTestCase(m_context));
846 addChild(new ShaderDrawArraysParametersTestCase(m_context));
847 addChild(new ShaderDrawElementsParametersTestCase(m_context));
848 addChild(new ShaderDrawArraysIndirectParametersTestCase(m_context));
849 addChild(new ShaderDrawElementsIndirectParametersTestCase(m_context));
850 addChild(new ShaderDrawArraysInstancedParametersTestCase(m_context));
851 addChild(new ShaderDrawElementsInstancedParametersTestCase(m_context));
852 addChild(new ShaderMultiDrawArraysParametersTestCase(m_context));
853 addChild(new ShaderMultiDrawElementsParametersTestCase(m_context));
854 addChild(new ShaderMultiDrawArraysIndirectParametersTestCase(m_context));
855 addChild(new ShaderMultiDrawElementsIndirectParametersTestCase(m_context));
856 addChild(new ShaderMultiDrawArraysIndirectCountParametersTestCase(m_context));
857 addChild(new ShaderMultiDrawElementsIndirectCountParametersTestCase(m_context));
860 } /* gl4cts namespace */