1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 28b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// 38b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. 48b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// Use of this source code is governed by a BSD-style license that can be 58b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// found in the LICENSE file. 68b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// 78b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 88b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com// Query11.cpp: Defines the rx::Query11 class which implements rx::QueryImpl. 98b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 108b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com#include "libGLESv2/renderer/Query11.h" 11486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/renderer/Renderer11.h" 128b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com#include "libGLESv2/main.h" 138b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 148b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comnamespace rx 158b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 168b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 178b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comQuery11::Query11(rx::Renderer11 *renderer, GLenum type) : QueryImpl(type) 188b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 198b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mRenderer = renderer; 208b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mQuery = NULL; 218b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 228b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 238b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comQuery11::~Query11() 248b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 258b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mQuery) 268b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 278b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mQuery->Release(); 288b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mQuery = NULL; 298b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 308b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 318b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 328b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comvoid Query11::begin() 338b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 348b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mQuery == NULL) 358b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 368b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com D3D11_QUERY_DESC queryDesc; 378b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com queryDesc.Query = D3D11_QUERY_OCCLUSION; 388b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com queryDesc.MiscFlags = 0; 398b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 408b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (FAILED(mRenderer->getDevice()->CreateQuery(&queryDesc, &mQuery))) 418b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 42779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_OUT_OF_MEMORY); 438b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 448b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 458b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 468b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mRenderer->getDeviceContext()->Begin(mQuery); 478b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 488b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 498b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comvoid Query11::end() 508b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 518b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mQuery == NULL) 528b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 53779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_INVALID_OPERATION); 548b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 558b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 568b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com mRenderer->getDeviceContext()->End(mQuery); 578b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 585c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com mStatus = GL_FALSE; 595c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com mResult = GL_FALSE; 608b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 618b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 628b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comGLuint Query11::getResult() 638b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 648b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mQuery != NULL) 658b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 668b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com while (!testQuery()) 678b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 688b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com Sleep(0); 698b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com // explicitly check for device loss, some drivers seem to return S_FALSE 708b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com // if the device is lost 718b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mRenderer->testDeviceLost(true)) 728b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 73779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_OUT_OF_MEMORY, 0); 748b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 758b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 768b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 778b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 785c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com return mResult; 798b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 808b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 818b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comGLboolean Query11::isResultAvailable() 828b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 838b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (mQuery != NULL) 848b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 858b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com testQuery(); 868b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 878b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 885c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com return mStatus; 898b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 908b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 918b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.comGLboolean Query11::testQuery() 928b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com{ 935c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com if (mQuery != NULL && mStatus != GL_TRUE) 948b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 958b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com UINT64 numPixels = 0; 968b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com HRESULT result = mRenderer->getDeviceContext()->GetData(mQuery, &numPixels, sizeof(UINT64), 0); 978b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com if (result == S_OK) 988b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 995c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com mStatus = GL_TRUE; 1008b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 1018b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com switch (getType()) 1028b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 1038b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com case GL_ANY_SAMPLES_PASSED_EXT: 1048b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 1055c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE; 1068b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com break; 1078b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com default: 1088b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com UNREACHABLE(); 1098b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 1108b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 1118b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com else if (mRenderer->testDeviceLost(true)) 1128b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com { 113779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com return gl::error(GL_OUT_OF_MEMORY, GL_TRUE); 1148b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 1158b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 1165c43469c7e77bef1b52cc493b75de9dd7096f395shannon.woods@transgaming.com return mStatus; 1178b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com } 1188b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 1198b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com return GL_TRUE; // prevent blocking when query is null 1208b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 1218b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com 1228b7606aad42b7eb5a183b502902106f9ba6f7ac4shannon.woods@transgaming.com} 123