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