OSDN Git Service

Adding Texture3D support.
[android-x86/external-swiftshader.git] / src / OpenGL / libGLESv2 / Query.cpp
1 // SwiftShader Software Renderer\r
2 //\r
3 // Copyright(c) 2005-2012 TransGaming Inc.\r
4 //\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,\r
6 // transcribed, stored in a retrieval system, translated into any human or computer\r
7 // language by any means, or disclosed to third parties without the explicit written\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express\r
9 // or implied, including but not limited to any patent rights, are granted to you.\r
10 //\r
11 \r
12 // Query.cpp: Implements the es2::Query class\r
13 \r
14 #include "Query.h"\r
15 \r
16 #include "main.h"\r
17 #include "Common/Thread.hpp"\r
18 \r
19 namespace es2\r
20 {\r
21 \r
22 Query::Query(GLuint id, GLenum type) : RefCountObject(id)\r
23\r
24     mQuery = NULL;\r
25     mStatus = GL_FALSE;\r
26     mResult = GL_FALSE;\r
27     mType = type;\r
28 }\r
29 \r
30 Query::~Query()\r
31 {\r
32     if(mQuery != NULL)\r
33     {\r
34         delete mQuery;\r
35     }\r
36 }\r
37 \r
38 void Query::begin()\r
39 {\r
40     if(mQuery == NULL)\r
41     {\r
42                 mQuery = new sw::Query();\r
43         \r
44                 if(!mQuery)\r
45         {\r
46             return error(GL_OUT_OF_MEMORY);\r
47         }\r
48     }\r
49 \r
50         Device *device = getDevice();\r
51 \r
52         mQuery->begin();\r
53         device->addQuery(mQuery);\r
54         device->setOcclusionEnabled(true);\r
55 }\r
56 \r
57 void Query::end()\r
58 {\r
59     if(mQuery == NULL)\r
60     {\r
61         return error(GL_INVALID_OPERATION);\r
62         }\r
63 \r
64         Device *device = getDevice();\r
65 \r
66     mQuery->end();\r
67         device->removeQuery(mQuery);\r
68         device->setOcclusionEnabled(false);\r
69     \r
70     mStatus = GL_FALSE;\r
71     mResult = GL_FALSE;\r
72 }\r
73 \r
74 GLuint Query::getResult()\r
75 {\r
76     if(mQuery != NULL)\r
77     {\r
78         while(!testQuery())\r
79         {\r
80             sw::Thread::yield();\r
81         }\r
82     }\r
83 \r
84     return (GLuint)mResult;\r
85 }\r
86 \r
87 GLboolean Query::isResultAvailable()\r
88 {\r
89     if(mQuery != NULL)\r
90     {\r
91         testQuery();\r
92     }\r
93     \r
94     return mStatus;\r
95 }\r
96 \r
97 GLenum Query::getType() const\r
98 {\r
99     return mType;\r
100 }\r
101 \r
102 GLboolean Query::testQuery()\r
103 {\r
104     if(mQuery != NULL && mStatus != GL_TRUE)\r
105     {\r
106         if(!mQuery->building && mQuery->reference == 0)\r
107         {\r
108                         unsigned int numPixels = mQuery->data;\r
109             mStatus = GL_TRUE;\r
110 \r
111             switch(mType)\r
112             {\r
113             case GL_ANY_SAMPLES_PASSED_EXT:\r
114             case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:\r
115                 mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;\r
116                 break;\r
117             default:\r
118                 ASSERT(false);\r
119             }\r
120         }\r
121         \r
122         return mStatus;\r
123     }\r
124 \r
125     return GL_TRUE;   // Prevent blocking when query is null\r
126 }\r
127 }\r