Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / renderer / d3d / d3d9 / Query9.cpp
1 //
2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // Query9.cpp: Defines the rx::Query9 class which implements rx::QueryImpl.
8
9 #include "libGLESv2/renderer/d3d/d3d9/Query9.h"
10 #include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h"
11 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
12 #include "libGLESv2/main.h"
13
14 #include <GLES2/gl2ext.h>
15
16 namespace rx
17 {
18 Query9::Query9(rx::Renderer9 *renderer, GLenum type)
19     : QueryImpl(type),
20       mResult(GL_FALSE),
21       mQueryFinished(false),
22       mRenderer(renderer),
23       mQuery(NULL)
24 {
25 }
26
27 Query9::~Query9()
28 {
29     SafeRelease(mQuery);
30 }
31
32 gl::Error Query9::begin()
33 {
34     if (mQuery == NULL)
35     {
36         HRESULT result = mRenderer->getDevice()->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery);
37         if (FAILED(result))
38         {
39             return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result);
40         }
41     }
42
43     HRESULT result = mQuery->Issue(D3DISSUE_BEGIN);
44     ASSERT(SUCCEEDED(result));
45     if (FAILED(result))
46     {
47         return gl::Error(GL_OUT_OF_MEMORY, "Failed to begin internal query, result: 0x%X.", result);
48     }
49
50     return gl::Error(GL_NO_ERROR);
51 }
52
53 gl::Error Query9::end()
54 {
55     ASSERT(mQuery);
56
57     HRESULT result = mQuery->Issue(D3DISSUE_END);
58     ASSERT(SUCCEEDED(result));
59     if (FAILED(result))
60     {
61         return gl::Error(GL_OUT_OF_MEMORY, "Failed to end internal query, result: 0x%X.", result);
62     }
63
64     mQueryFinished = false;
65     mResult = GL_FALSE;
66
67     return gl::Error(GL_NO_ERROR);
68 }
69
70 gl::Error Query9::getResult(GLuint *params)
71 {
72     while (!mQueryFinished)
73     {
74         gl::Error error = testQuery();
75         if (error.isError())
76         {
77             return error;
78         }
79
80         if (!mQueryFinished)
81         {
82             Sleep(0);
83         }
84     }
85
86     ASSERT(mQueryFinished);
87     *params = mResult;
88
89     return gl::Error(GL_NO_ERROR);
90 }
91
92 gl::Error Query9::isResultAvailable(GLuint *available)
93 {
94     gl::Error error = testQuery();
95     if (error.isError())
96     {
97         return error;
98     }
99
100     *available = (mQueryFinished ? GL_TRUE : GL_FALSE);
101
102     return gl::Error(GL_NO_ERROR);
103 }
104
105 gl::Error Query9::testQuery()
106 {
107     if (!mQueryFinished)
108     {
109         ASSERT(mQuery);
110
111         DWORD numPixels = 0;
112
113         HRESULT hres = mQuery->GetData(&numPixels, sizeof(DWORD), D3DGETDATA_FLUSH);
114         if (hres == S_OK)
115         {
116             mQueryFinished = true;
117
118             switch (getType())
119             {
120               case GL_ANY_SAMPLES_PASSED_EXT:
121               case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
122                 mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
123                 break;
124
125               default:
126                 UNREACHABLE();
127                 break;
128             }
129         }
130         else if (d3d9::isDeviceLostError(hres))
131         {
132             mRenderer->notifyDeviceLost();
133             return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
134         }
135         else if (mRenderer->testDeviceLost(true))
136         {
137             return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
138         }
139     }
140
141     return gl::Error(GL_NO_ERROR);
142 }
143
144 }