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.
7 // Query9.cpp: Defines the rx::Query9 class which implements rx::QueryImpl.
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"
14 #include <GLES2/gl2ext.h>
18 Query9::Query9(rx::Renderer9 *renderer, GLenum type)
21 mQueryFinished(false),
32 gl::Error Query9::begin()
36 HRESULT result = mRenderer->getDevice()->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery);
39 return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result);
43 HRESULT result = mQuery->Issue(D3DISSUE_BEGIN);
44 ASSERT(SUCCEEDED(result));
47 return gl::Error(GL_OUT_OF_MEMORY, "Failed to begin internal query, result: 0x%X.", result);
50 return gl::Error(GL_NO_ERROR);
53 gl::Error Query9::end()
57 HRESULT result = mQuery->Issue(D3DISSUE_END);
58 ASSERT(SUCCEEDED(result));
61 return gl::Error(GL_OUT_OF_MEMORY, "Failed to end internal query, result: 0x%X.", result);
64 mQueryFinished = false;
67 return gl::Error(GL_NO_ERROR);
70 gl::Error Query9::getResult(GLuint *params)
72 while (!mQueryFinished)
74 gl::Error error = testQuery();
86 ASSERT(mQueryFinished);
89 return gl::Error(GL_NO_ERROR);
92 gl::Error Query9::isResultAvailable(GLuint *available)
94 gl::Error error = testQuery();
100 *available = (mQueryFinished ? GL_TRUE : GL_FALSE);
102 return gl::Error(GL_NO_ERROR);
105 gl::Error Query9::testQuery()
113 HRESULT hres = mQuery->GetData(&numPixels, sizeof(DWORD), D3DGETDATA_FLUSH);
116 mQueryFinished = true;
120 case GL_ANY_SAMPLES_PASSED_EXT:
121 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
122 mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
130 else if (d3d9::isDeviceLostError(hres))
132 mRenderer->notifyDeviceLost();
133 return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
135 else if (mRenderer->testDeviceLost(true))
137 return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
141 return gl::Error(GL_NO_ERROR);