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