blob: 815fc01a9b7d7bff92e8e963aa51cee2d87c6827 [file] [log] [blame]
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +00001//
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
Brandon Jonesc7a41042014-06-23 12:03:25 -07009#include "libGLESv2/renderer/d3d/d3d9/Query9.h"
Brandon Jonesc7a41042014-06-23 12:03:25 -070010#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h"
11#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040012#include "libGLESv2/main.h"
13
14#include <GLES2/gl2ext.h>
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000015
16namespace rx
17{
Geoff Lang5aad9672014-09-08 11:10:42 -040018Query9::Query9(rx::Renderer9 *renderer, GLenum type)
19 : QueryImpl(type),
20 mResult(GL_FALSE),
21 mQueryFinished(false),
22 mRenderer(renderer),
23 mQuery(NULL)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000024{
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000025}
26
27Query9::~Query9()
28{
Geoff Langea228632013-07-30 15:17:12 -040029 SafeRelease(mQuery);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000030}
31
Geoff Lang5aad9672014-09-08 11:10:42 -040032gl::Error Query9::begin()
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000033{
34 if (mQuery == NULL)
35 {
Geoff Lang5aad9672014-09-08 11:10:42 -040036 HRESULT result = mRenderer->getDevice()->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mQuery);
37 if (FAILED(result))
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000038 {
Geoff Lang5aad9672014-09-08 11:10:42 -040039 return gl::Error(GL_OUT_OF_MEMORY, "Internal query creation failed, result: 0x%X.", result);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000040 }
41 }
42
43 HRESULT result = mQuery->Issue(D3DISSUE_BEGIN);
44 ASSERT(SUCCEEDED(result));
Geoff Lang5aad9672014-09-08 11:10:42 -040045 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);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000051}
52
Geoff Lang5aad9672014-09-08 11:10:42 -040053gl::Error Query9::end()
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000054{
Jamie Madill45c785d2014-05-13 14:09:34 -040055 ASSERT(mQuery);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000056
57 HRESULT result = mQuery->Issue(D3DISSUE_END);
58 ASSERT(SUCCEEDED(result));
Geoff Lang5aad9672014-09-08 11:10:42 -040059 if (FAILED(result))
60 {
61 return gl::Error(GL_OUT_OF_MEMORY, "Failed to end internal query, result: 0x%X.", result);
62 }
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000063
Geoff Lang5aad9672014-09-08 11:10:42 -040064 mQueryFinished = false;
shannon.woods%transgaming.com@gtempaccount.comb5b3c7d2013-04-13 03:27:33 +000065 mResult = GL_FALSE;
Geoff Lang5aad9672014-09-08 11:10:42 -040066
67 return gl::Error(GL_NO_ERROR);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000068}
69
Geoff Lang5aad9672014-09-08 11:10:42 -040070gl::Error Query9::getResult(GLuint *params)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000071{
Geoff Lang5aad9672014-09-08 11:10:42 -040072 while (!mQueryFinished)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000073 {
Geoff Lang5aad9672014-09-08 11:10:42 -040074 gl::Error error = testQuery();
75 if (error.isError())
76 {
77 return error;
78 }
79
80 if (!mQueryFinished)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000081 {
82 Sleep(0);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000083 }
84 }
85
Geoff Lang5aad9672014-09-08 11:10:42 -040086 ASSERT(mQueryFinished);
87 *params = mResult;
88
89 return gl::Error(GL_NO_ERROR);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000090}
91
Geoff Lang5aad9672014-09-08 11:10:42 -040092gl::Error Query9::isResultAvailable(GLuint *available)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000093{
Geoff Lang5aad9672014-09-08 11:10:42 -040094 gl::Error error = testQuery();
95 if (error.isError())
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000096 {
Geoff Lang5aad9672014-09-08 11:10:42 -040097 return error;
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +000098 }
99
Geoff Lang5aad9672014-09-08 11:10:42 -0400100 *available = (mQueryFinished ? GL_TRUE : GL_FALSE);
101
102 return gl::Error(GL_NO_ERROR);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000103}
104
Geoff Lang5aad9672014-09-08 11:10:42 -0400105gl::Error Query9::testQuery()
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000106{
Geoff Lang5aad9672014-09-08 11:10:42 -0400107 if (!mQueryFinished)
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000108 {
Geoff Lang5aad9672014-09-08 11:10:42 -0400109 ASSERT(mQuery);
110
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000111 DWORD numPixels = 0;
112
113 HRESULT hres = mQuery->GetData(&numPixels, sizeof(DWORD), D3DGETDATA_FLUSH);
114 if (hres == S_OK)
115 {
Geoff Lang5aad9672014-09-08 11:10:42 -0400116 mQueryFinished = true;
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000117
118 switch (getType())
119 {
120 case GL_ANY_SAMPLES_PASSED_EXT:
121 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
shannon.woods%transgaming.com@gtempaccount.comb5b3c7d2013-04-13 03:27:33 +0000122 mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE;
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000123 break;
Geoff Lang5aad9672014-09-08 11:10:42 -0400124
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000125 default:
Geoff Lang5aad9672014-09-08 11:10:42 -0400126 UNREACHABLE();
127 break;
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000128 }
129 }
shannon.woods@transgaming.comeb049e22013-02-28 23:04:49 +0000130 else if (d3d9::isDeviceLostError(hres))
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000131 {
shannon.woods@transgaming.comeb049e22013-02-28 23:04:49 +0000132 mRenderer->notifyDeviceLost();
Geoff Lang5aad9672014-09-08 11:10:42 -0400133 return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000134 }
Geoff Lang5aad9672014-09-08 11:10:42 -0400135 else if (mRenderer->testDeviceLost(true))
136 {
137 return gl::Error(GL_OUT_OF_MEMORY, "Failed to test get query result, device is lost.");
138 }
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000139 }
140
Geoff Lang5aad9672014-09-08 11:10:42 -0400141 return gl::Error(GL_NO_ERROR);
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000142}
143
shannon.woods@transgaming.com23f33322013-02-28 23:02:42 +0000144}