xref: /aosp_15_r20/external/angle/src/tests/gl_tests/DrawRangeElementsTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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