6 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
7 typedef ::testing::Types<TFT<Gles::Two, Rend::D3D11>, TFT<Gles::Two, Rend::D3D9>> TestFixtureTypes;
8 TYPED_TEST_CASE(OcclusionQueriesTest, TestFixtureTypes);
11 class OcclusionQueriesTest : public ANGLETest
14 OcclusionQueriesTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
19 setConfigGreenBits(8);
21 setConfigAlphaBits(8);
22 setConfigDepthBits(24);
31 const std::string passthroughVS = SHADER_SOURCE
33 attribute highp vec4 position;
36 gl_Position = position;
40 const std::string passthroughPS = SHADER_SOURCE
42 precision highp float;
45 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
49 mProgram = CompileProgram(passthroughVS, passthroughPS);
52 FAIL() << "shader compilation failed.";
56 virtual void TearDown()
58 glDeleteProgram(mProgram);
60 ANGLETest::TearDown();
66 TYPED_TEST(OcclusionQueriesTest, IsOccluded)
69 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
71 // draw a quad at depth 0.3
72 glEnable(GL_DEPTH_TEST);
73 glUseProgram(mProgram);
74 drawQuad(mProgram, "position", 0.3f);
80 glGenQueriesEXT(1, &query);
81 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
82 drawQuad(mProgram, "position", 0.8f); // this quad should be occluded by first quad
83 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
89 GLuint ready = GL_FALSE;
90 while (ready == GL_FALSE)
93 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &ready);
96 GLuint result = GL_TRUE;
97 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result);
101 glDeleteQueriesEXT(1, &query);
103 EXPECT_EQ(result, GL_FALSE);
106 TYPED_TEST(OcclusionQueriesTest, IsNotOccluded)
108 glDepthMask(GL_TRUE);
109 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
111 EXPECT_GL_NO_ERROR();
114 glGenQueriesEXT(1, &query);
115 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
116 drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded
117 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
119 EXPECT_GL_NO_ERROR();
123 GLuint result = GL_TRUE;
124 glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); // will block waiting for result
126 EXPECT_GL_NO_ERROR();
128 glDeleteQueriesEXT(1, &query);
130 EXPECT_EQ(result, GL_TRUE);
133 TYPED_TEST(OcclusionQueriesTest, Errors)
135 glDepthMask(GL_TRUE);
136 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
138 EXPECT_GL_NO_ERROR();
142 glGenQueriesEXT(1, &query);
144 EXPECT_EQ(glIsQueryEXT(query), GL_FALSE);
145 EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE);
147 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0); // can't pass 0 as query id
148 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
150 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, query);
151 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // can't initiate a query while one's already active
152 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
154 EXPECT_EQ(glIsQueryEXT(query), GL_TRUE);
155 EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE); // have not called begin
157 drawQuad(mProgram, "position", 0.8f); // this quad should not be occluded
158 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // no active query for this target
159 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
160 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
162 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query); // can't begin a query as a different type than previously used
163 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
165 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // have to call genqueries first
166 EXPECT_EQ(glGetError(), GL_INVALID_OPERATION);
168 glGenQueriesEXT(1, &query2);
169 glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // should be ok now
170 EXPECT_EQ(glIsQueryEXT(query2), GL_TRUE);
172 drawQuad(mProgram, "position", 0.3f); // this should draw in front of other quad
173 glDeleteQueriesEXT(1, &query2); // should delete when query becomes inactive
174 glEndQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT); // should not incur error; should delete query + 1 at end of execution.
175 EXPECT_GL_NO_ERROR();
179 EXPECT_GL_NO_ERROR();
181 GLuint ready = GL_FALSE;
182 glGetQueryObjectuivEXT(query2, GL_QUERY_RESULT_AVAILABLE_EXT, &ready); // this query is now deleted
183 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
185 EXPECT_GL_NO_ERROR();