// // Copyright 2024 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // DrawElementsIndirect tests: // Test issuing DrawElementsIndirect commands. // #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" using namespace angle; namespace { class DrawElementsIndirectTest : public ANGLETest<> { protected: DrawElementsIndirectTest() { setWindowWidth(64); setWindowHeight(64); setConfigRedBits(8); setConfigGreenBits(8); setConfigBlueBits(8); setConfigAlphaBits(8); } }; // Test that DrawElementsIndirect works when count is zero. TEST_P(DrawElementsIndirectTest, CountIsZero) { constexpr char kVS[] = "attribute vec3 a_pos;\n" "void main()\n" "{\n" " gl_Position = vec4(a_pos, 1.0);\n" "}\n"; GLProgram program; program.makeRaster(kVS, essl1_shaders::fs::Blue()); glUseProgram(program); GLVertexArray va; glBindVertexArray(va); GLBuffer vertexBuffer; glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); static float vertexData[3] = {0}; glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); GLBuffer indexBuffer; glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); static GLuint indexData[3] = {0}; glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW); GLBuffer indirectBuffer; glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirectBuffer); static GLuint indirectData[5] = {0}; glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(indirectData), indirectData, GL_STATIC_DRAW); GLint posLocation = glGetAttribLocation(program, "a_pos"); glEnableVertexAttribArray(posLocation); glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); glDrawElementsIndirect(GL_TRIANGLE_FAN, GL_UNSIGNED_INT, nullptr); ASSERT_GL_NO_ERROR(); } GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DrawElementsIndirectTest); ANGLE_INSTANTIATE_TEST_ES31(DrawElementsIndirectTest); } // namespace