blob: 38a2911c7f31aedfdc560ab8611d85362f3ab332 [file] [log] [blame]
//
// 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