Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / angle_tests / OcclusionQueriesTest.cpp
1 #include "ANGLETest.h"
2
3 // Needed for Sleep()
4 #include <Windows.h>
5
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);
9
10 template<typename T>
11 class OcclusionQueriesTest : public ANGLETest
12 {
13 protected:
14     OcclusionQueriesTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
15     {
16         setWindowWidth(128);
17         setWindowHeight(128);
18         setConfigRedBits(8);
19         setConfigGreenBits(8);
20         setConfigBlueBits(8);
21         setConfigAlphaBits(8);
22         setConfigDepthBits(24);
23
24         mProgram = 0;
25     }
26
27     virtual void SetUp()
28     {
29         ANGLETest::SetUp();
30
31         const std::string passthroughVS = SHADER_SOURCE
32         (
33             attribute highp vec4 position;
34             void main(void)
35             {
36                 gl_Position = position;
37             }
38         );
39
40         const std::string passthroughPS = SHADER_SOURCE
41         (
42             precision highp float;
43             void main(void)
44             {
45                gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
46             }
47         );
48
49         mProgram = CompileProgram(passthroughVS, passthroughPS);
50         if (mProgram == 0)
51         {
52             FAIL() << "shader compilation failed.";
53         }
54     }
55
56     virtual void TearDown()
57     {
58         glDeleteProgram(mProgram);
59
60         ANGLETest::TearDown();
61     }
62
63     GLuint mProgram;
64 };
65
66 TYPED_TEST(OcclusionQueriesTest, IsOccluded)
67 {
68     glDepthMask(GL_TRUE);
69     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
70
71     // draw a quad at depth 0.3
72     glEnable(GL_DEPTH_TEST);
73     glUseProgram(mProgram);
74     drawQuad(mProgram, "position", 0.3f);
75     glUseProgram(0);
76
77     EXPECT_GL_NO_ERROR();
78
79     GLuint query = 0;
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);
84
85     EXPECT_GL_NO_ERROR();
86
87     swapBuffers();
88
89     GLuint ready = GL_FALSE;
90     while (ready == GL_FALSE)
91     {
92         Sleep(0);
93         glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT, &ready);
94     }
95
96     GLuint result = GL_TRUE;
97     glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result);
98
99     EXPECT_GL_NO_ERROR();
100
101     glDeleteQueriesEXT(1, &query);
102
103     EXPECT_EQ(result, GL_FALSE);
104 }
105
106 TYPED_TEST(OcclusionQueriesTest, IsNotOccluded)
107 {
108     glDepthMask(GL_TRUE);
109     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
110
111     EXPECT_GL_NO_ERROR();
112
113     GLuint query = 0;
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);
118
119     EXPECT_GL_NO_ERROR();
120
121     swapBuffers();
122
123     GLuint result = GL_TRUE;
124     glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_EXT, &result); // will block waiting for result
125
126     EXPECT_GL_NO_ERROR();
127
128     glDeleteQueriesEXT(1, &query);
129
130     EXPECT_EQ(result, GL_TRUE);
131 }
132
133 TYPED_TEST(OcclusionQueriesTest, Errors)
134 {
135     glDepthMask(GL_TRUE);
136     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
137
138     EXPECT_GL_NO_ERROR();
139
140     GLuint query = 0;
141     GLuint query2 = 0;
142     glGenQueriesEXT(1, &query);
143
144     EXPECT_EQ(glIsQueryEXT(query), GL_FALSE);
145     EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE);
146
147     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, 0); // can't pass 0 as query id
148     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
149
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);
153
154     EXPECT_EQ(glIsQueryEXT(query), GL_TRUE);
155     EXPECT_EQ(glIsQueryEXT(query2), GL_FALSE); // have not called begin
156
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);
161
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);
164
165     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // have to call genqueries first
166     EXPECT_EQ(glGetError(), GL_INVALID_OPERATION);
167
168     glGenQueriesEXT(1, &query2);
169     glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, query2); // should be ok now
170     EXPECT_EQ(glIsQueryEXT(query2), GL_TRUE);
171
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();
176
177     swapBuffers();
178
179     EXPECT_GL_NO_ERROR();
180
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);
184
185     EXPECT_GL_NO_ERROR();
186 }