xref: /aosp_15_r20/external/angle/src/tests/gl_tests/gles1/MatrixStackTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // MatrixStackTest.cpp: Tests basic usage of gl(Push|Pop)Matrix.
8 
9 #include "test_utils/ANGLETest.h"
10 #include "test_utils/gl_raii.h"
11 
12 #include <vector>
13 
14 using namespace angle;
15 
16 class MatrixStackTest : public ANGLETest<>
17 {
18   protected:
MatrixStackTest()19     MatrixStackTest()
20     {
21         setWindowWidth(32);
22         setWindowHeight(32);
23         setConfigRedBits(8);
24         setConfigGreenBits(8);
25         setConfigBlueBits(8);
26         setConfigAlphaBits(8);
27         setConfigDepthBits(24);
28     }
29 };
30 
31 // State query: Checks the initial state is correct; that there is only one matrix on the stack.
TEST_P(MatrixStackTest,InitialState)32 TEST_P(MatrixStackTest, InitialState)
33 {
34     glMatrixMode(GL_MODELVIEW);
35     glPopMatrix();
36     EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);
37 
38     glMatrixMode(GL_PROJECTION);
39     glPopMatrix();
40     EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);
41 
42     glMatrixMode(GL_TEXTURE);
43     glPopMatrix();
44     EXPECT_GL_ERROR(GL_STACK_UNDERFLOW);
45 }
46 
47 // Tests that caps are greater than or equal to spec minimums and that we can actually push them
48 // that much.
TEST_P(MatrixStackTest,Limits)49 TEST_P(MatrixStackTest, Limits)
50 {
51     GLint modelviewMatrixMax;
52     GLint projectionMatrixMax;
53     GLint textureMatrixMax;
54     GLint textureUnits;  // For iterating over texture matrices
55 
56     glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &modelviewMatrixMax);
57     glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH, &projectionMatrixMax);
58     glGetIntegerv(GL_MAX_TEXTURE_STACK_DEPTH, &textureMatrixMax);
59     glGetIntegerv(GL_MAX_TEXTURE_UNITS, &textureUnits);
60 
61     EXPECT_GE(modelviewMatrixMax, 16);
62     EXPECT_GE(projectionMatrixMax, 2);
63     EXPECT_GE(textureMatrixMax, 2);
64 
65     glMatrixMode(GL_MODELVIEW);
66 
67     for (int i = 0; i < modelviewMatrixMax; i++)
68     {
69         glPushMatrix();
70         if (i == modelviewMatrixMax - 1)
71         {
72             EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
73         }
74         else
75         {
76             EXPECT_GL_NO_ERROR();
77         }
78     }
79 
80     glMatrixMode(GL_PROJECTION);
81 
82     for (int i = 0; i < projectionMatrixMax; i++)
83     {
84         glPushMatrix();
85         if (i == projectionMatrixMax - 1)
86         {
87             EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
88         }
89         else
90         {
91             EXPECT_GL_NO_ERROR();
92         }
93     }
94 
95     glMatrixMode(GL_TEXTURE);
96 
97     for (int i = 0; i < textureUnits; i++)
98     {
99         glActiveTexture(GL_TEXTURE0 + i);
100         for (int j = 0; j < textureMatrixMax; j++)
101         {
102             glPushMatrix();
103             if (j == textureMatrixMax - 1)
104             {
105                 EXPECT_GL_ERROR(GL_STACK_OVERFLOW);
106             }
107             else
108             {
109                 EXPECT_GL_NO_ERROR();
110             }
111         }
112     }
113 }
114 
115 ANGLE_INSTANTIATE_TEST_ES1(MatrixStackTest);
116