1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // DrawElementsTest:
7*8975f5c5SAndroid Build Coastguard Worker // Tests for indexed draws.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker namespace
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker enum class DrawCallVariants
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker DrawRangeElements,
21*8975f5c5SAndroid Build Coastguard Worker DrawRangeElementsBaseVertex,
22*8975f5c5SAndroid Build Coastguard Worker DrawRangeElementsBaseVertexEXT,
23*8975f5c5SAndroid Build Coastguard Worker DrawRangeElementsBaseVertexOES,
24*8975f5c5SAndroid Build Coastguard Worker };
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker class DrawRangeElementsTest : public ANGLETest<>
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker protected:
DrawRangeElementsTest()29*8975f5c5SAndroid Build Coastguard Worker DrawRangeElementsTest()
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(64);
32*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(64);
33*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
34*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
35*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
36*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker
drawRangeElementsVariant(DrawCallVariants drawCallVariant,GLsizei count,GLint baseVertex)39*8975f5c5SAndroid Build Coastguard Worker void drawRangeElementsVariant(DrawCallVariants drawCallVariant, GLsizei count, GLint baseVertex)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker switch (drawCallVariant)
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker case DrawCallVariants::DrawRangeElements:
44*8975f5c5SAndroid Build Coastguard Worker glDrawRangeElements(GL_TRIANGLES, 0, 1000, count, GL_UNSIGNED_BYTE, nullptr);
45*8975f5c5SAndroid Build Coastguard Worker break;
46*8975f5c5SAndroid Build Coastguard Worker case DrawCallVariants::DrawRangeElementsBaseVertex:
47*8975f5c5SAndroid Build Coastguard Worker glDrawRangeElementsBaseVertex(GL_TRIANGLES, 0, 1000, count, GL_UNSIGNED_BYTE,
48*8975f5c5SAndroid Build Coastguard Worker nullptr, baseVertex);
49*8975f5c5SAndroid Build Coastguard Worker break;
50*8975f5c5SAndroid Build Coastguard Worker case DrawCallVariants::DrawRangeElementsBaseVertexEXT:
51*8975f5c5SAndroid Build Coastguard Worker glDrawRangeElementsBaseVertexEXT(GL_TRIANGLES, 0, 1000, count, GL_UNSIGNED_BYTE,
52*8975f5c5SAndroid Build Coastguard Worker nullptr, baseVertex);
53*8975f5c5SAndroid Build Coastguard Worker break;
54*8975f5c5SAndroid Build Coastguard Worker case DrawCallVariants::DrawRangeElementsBaseVertexOES:
55*8975f5c5SAndroid Build Coastguard Worker glDrawRangeElementsBaseVertexOES(GL_TRIANGLES, 0, 1000, count, GL_UNSIGNED_BYTE,
56*8975f5c5SAndroid Build Coastguard Worker nullptr, baseVertex);
57*8975f5c5SAndroid Build Coastguard Worker break;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker }
60*8975f5c5SAndroid Build Coastguard Worker
doDrawRangeElementsVariant(DrawCallVariants drawCallVariant)61*8975f5c5SAndroid Build Coastguard Worker void doDrawRangeElementsVariant(DrawCallVariants drawCallVariant)
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
64*8975f5c5SAndroid Build Coastguard Worker "attribute vec3 a_pos;\n"
65*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
66*8975f5c5SAndroid Build Coastguard Worker "{\n"
67*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(a_pos, 1.0);\n"
68*8975f5c5SAndroid Build Coastguard Worker "}\n";
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, essl1_shaders::fs::Blue());
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker GLint posLocation = glGetAttribLocation(program, "a_pos");
73*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, posLocation);
74*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker const auto &vertices = GetQuadVertices();
77*8975f5c5SAndroid Build Coastguard Worker
78*8975f5c5SAndroid Build Coastguard Worker GLBuffer vertexBuffer;
79*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
80*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
81*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
82*8975f5c5SAndroid Build Coastguard Worker
83*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(posLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
84*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(posLocation);
85*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
86*8975f5c5SAndroid Build Coastguard Worker
87*8975f5c5SAndroid Build Coastguard Worker GLBuffer indexBuffer;
88*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker drawRangeElementsVariant(drawCallVariant, 1, 0);
91*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker // count == 0 so it's fine to have no data in the element array buffer bound.
94*8975f5c5SAndroid Build Coastguard Worker drawRangeElementsVariant(drawCallVariant, 0, 0);
95*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker };
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker class WebGLDrawRangeElementsTest : public DrawRangeElementsTest
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker public:
WebGLDrawRangeElementsTest()102*8975f5c5SAndroid Build Coastguard Worker WebGLDrawRangeElementsTest() { setWebGLCompatibilityEnabled(true); }
103*8975f5c5SAndroid Build Coastguard Worker };
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker // Test that glDrawRangeElements generates an error when trying to draw from an
106*8975f5c5SAndroid Build Coastguard Worker // empty element array buffer with count other than 0 and no error when count
107*8975f5c5SAndroid Build Coastguard Worker // equals 0.
TEST_P(WebGLDrawRangeElementsTest,DrawRangeElementArrayZeroCount)108*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGLDrawRangeElementsTest, DrawRangeElementArrayZeroCount)
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker doDrawRangeElementsVariant(DrawCallVariants::DrawRangeElements);
113*8975f5c5SAndroid Build Coastguard Worker }
114*8975f5c5SAndroid Build Coastguard Worker
115*8975f5c5SAndroid Build Coastguard Worker // Test that glDrawRangeElementsBaseVertex generates an error when trying to
116*8975f5c5SAndroid Build Coastguard Worker // draw from an empty element array buffer with count other than 0 and no error
117*8975f5c5SAndroid Build Coastguard Worker // when count equals 0.
TEST_P(WebGLDrawRangeElementsTest,DrawRangeElementBaseVertexArrayZeroCount)118*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGLDrawRangeElementsTest, DrawRangeElementBaseVertexArrayZeroCount)
119*8975f5c5SAndroid Build Coastguard Worker {
120*8975f5c5SAndroid Build Coastguard Worker doDrawRangeElementsVariant(DrawCallVariants::DrawRangeElementsBaseVertex);
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker // Test that glDrawRangeElementsBaseVertexEXT generates an error when trying to
124*8975f5c5SAndroid Build Coastguard Worker // draw from an empty element array buffer with count other than 0 and no error
125*8975f5c5SAndroid Build Coastguard Worker // when count equals 0.
TEST_P(WebGLDrawRangeElementsTest,DrawRangeElementBaseVertexEXTArrayZeroCount)126*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGLDrawRangeElementsTest, DrawRangeElementBaseVertexEXTArrayZeroCount)
127*8975f5c5SAndroid Build Coastguard Worker {
128*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_elements_base_vertex"));
129*8975f5c5SAndroid Build Coastguard Worker
130*8975f5c5SAndroid Build Coastguard Worker doDrawRangeElementsVariant(DrawCallVariants::DrawRangeElementsBaseVertexEXT);
131*8975f5c5SAndroid Build Coastguard Worker }
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Worker // Test that glDrawRangeElementsBaseVertexOES generates an error when trying to
134*8975f5c5SAndroid Build Coastguard Worker // draw from an empty element array buffer with count other than 0 and no error
135*8975f5c5SAndroid Build Coastguard Worker // when count equals 0.
TEST_P(WebGLDrawRangeElementsTest,DrawRangeElementBaseVertexOESArrayZeroCount)136*8975f5c5SAndroid Build Coastguard Worker TEST_P(WebGLDrawRangeElementsTest, DrawRangeElementBaseVertexOESArrayZeroCount)
137*8975f5c5SAndroid Build Coastguard Worker {
138*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OES_draw_elements_base_vertex"));
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker doDrawRangeElementsVariant(DrawCallVariants::DrawRangeElementsBaseVertexOES);
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DrawRangeElementsTest);
144*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLDrawRangeElementsTest);
145*8975f5c5SAndroid Build Coastguard Worker
146*8975f5c5SAndroid Build Coastguard Worker } // namespace
147