3 class OcclusionQueriesTest : public ANGLETest
11 setConfigGreenBits(8);
13 setConfigAlphaBits(8);
14 setConfigDepthBits(24);
23 const std::string passthroughVS = SHADER_SOURCE
25 attribute highp vec4 position;
28 gl_Position = position;
32 const std::string passthroughPS = SHADER_SOURCE
34 precision highp float;
37 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
41 mProgram = compileProgram(passthroughVS, passthroughPS);
44 FAIL() << "shader compilation failed.";
48 virtual void TearDown()
50 glDeleteProgram(mProgram);
52 ANGLETest::TearDown();
58 TEST_F(OcclusionQueriesTest, IsOccluded)
61 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
63 // draw a quad at depth 0.3
64 glEnable(GL_DEPTH_TEST);
65 glUseProgram(mProgram);
66 drawQuad(mProgram, "position", 0.3f);
72 glGenQueriesEXT(1, &query);
73 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
74 drawQuad(mProgram, "position", 0.8f); // this quad should be occluded by first quad
75 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
81 GLuint ready = GL_FALSE;
82 while (ready == GL_FALSE)
85 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &ready);
88 GLuint result = GL_TRUE;
89 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result);
93 glDeleteQueriesEXT(1, &query);
95 EXPECT_EQ(result, GL_FALSE);
98 TEST_F(OcclusionQueriesTest, IsNotOccluded)
100 glDepthMask(GL_TRUE);
101 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
103 EXPECT_GL_NO_ERROR();
106 glGenQueriesEXT(1, &query);
107 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
108 drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded
109 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
111 EXPECT_GL_NO_ERROR();
115 GLuint result = GL_TRUE;
116 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); // will block waiting for result
118 EXPECT_GL_NO_ERROR();
120 glDeleteQueriesEXT(1, &query);
122 EXPECT_EQ(result, GL_TRUE);
125 TEST_F(OcclusionQueriesTest, Errors)
127 glDepthMask(GL_TRUE);
128 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
130 EXPECT_GL_NO_ERROR();
134 glGenQueriesEXT(1, &query);
136 EXPECT_EQ(glIsQueryEXT(query), GL_FALSE);
137 EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE);
139 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0); // can't pass 0 as query id
140 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
142 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
143 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // can't initiate a query while one's already active
144 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
146 EXPECT_EQ(glIsQueryEXT(query), GL_TRUE);
147 EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE); // have not called begin
149 drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded
150 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // no active query for this target
151 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
152 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
154 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query); // can't begin a query as a different type than previously used
155 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
157 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // have to call genqueries first
158 EXPECT_EQ(glGetError(), GL_INVALID_OPERATION);
160 glGenQueriesEXT(1, &query2);
161 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // should be ok now
162 EXPECT_EQ(glIsQueryEXT(query2), GL_TRUE);
164 drawQuad(mProgram, "position", 0.3f); // this should draw in front of other quad
165 glDeleteQueriesEXT(1, &query2); // should delete when query becomes inactive
166 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // should not incur error; should delete query + 1 at end of execution.
167 EXPECT_GL_NO_ERROR();
171 EXPECT_GL_NO_ERROR();
173 GLuint ready = GL_FALSE;
174 glGetQueryObjectuivEXT(query2, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); // this query is now deleted
175 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
177 EXPECT_GL_NO_ERROR();