1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/renderer/Query11.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,122 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// Query11.cpp: Defines the rx::Query11 class which implements rx::QueryImpl. 1.12 + 1.13 +#include "libGLESv2/renderer/Query11.h" 1.14 +#include "libGLESv2/renderer/Renderer11.h" 1.15 +#include "libGLESv2/main.h" 1.16 + 1.17 +namespace rx 1.18 +{ 1.19 + 1.20 +Query11::Query11(rx::Renderer11 *renderer, GLenum type) : QueryImpl(type) 1.21 +{ 1.22 + mRenderer = renderer; 1.23 + mQuery = NULL; 1.24 +} 1.25 + 1.26 +Query11::~Query11() 1.27 +{ 1.28 + if (mQuery) 1.29 + { 1.30 + mQuery->Release(); 1.31 + mQuery = NULL; 1.32 + } 1.33 +} 1.34 + 1.35 +void Query11::begin() 1.36 +{ 1.37 + if (mQuery == NULL) 1.38 + { 1.39 + D3D11_QUERY_DESC queryDesc; 1.40 + queryDesc.Query = D3D11_QUERY_OCCLUSION; 1.41 + queryDesc.MiscFlags = 0; 1.42 + 1.43 + if (FAILED(mRenderer->getDevice()->CreateQuery(&queryDesc, &mQuery))) 1.44 + { 1.45 + return gl::error(GL_OUT_OF_MEMORY); 1.46 + } 1.47 + } 1.48 + 1.49 + mRenderer->getDeviceContext()->Begin(mQuery); 1.50 +} 1.51 + 1.52 +void Query11::end() 1.53 +{ 1.54 + if (mQuery == NULL) 1.55 + { 1.56 + return gl::error(GL_INVALID_OPERATION); 1.57 + } 1.58 + 1.59 + mRenderer->getDeviceContext()->End(mQuery); 1.60 + 1.61 + mStatus = GL_FALSE; 1.62 + mResult = GL_FALSE; 1.63 +} 1.64 + 1.65 +GLuint Query11::getResult() 1.66 +{ 1.67 + if (mQuery != NULL) 1.68 + { 1.69 + while (!testQuery()) 1.70 + { 1.71 + Sleep(0); 1.72 + // explicitly check for device loss, some drivers seem to return S_FALSE 1.73 + // if the device is lost 1.74 + if (mRenderer->testDeviceLost(true)) 1.75 + { 1.76 + return gl::error(GL_OUT_OF_MEMORY, 0); 1.77 + } 1.78 + } 1.79 + } 1.80 + 1.81 + return mResult; 1.82 +} 1.83 + 1.84 +GLboolean Query11::isResultAvailable() 1.85 +{ 1.86 + if (mQuery != NULL) 1.87 + { 1.88 + testQuery(); 1.89 + } 1.90 + 1.91 + return mStatus; 1.92 +} 1.93 + 1.94 +GLboolean Query11::testQuery() 1.95 +{ 1.96 + if (mQuery != NULL && mStatus != GL_TRUE) 1.97 + { 1.98 + UINT64 numPixels = 0; 1.99 + HRESULT result = mRenderer->getDeviceContext()->GetData(mQuery, &numPixels, sizeof(UINT64), 0); 1.100 + if (result == S_OK) 1.101 + { 1.102 + mStatus = GL_TRUE; 1.103 + 1.104 + switch (getType()) 1.105 + { 1.106 + case GL_ANY_SAMPLES_PASSED_EXT: 1.107 + case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 1.108 + mResult = (numPixels > 0) ? GL_TRUE : GL_FALSE; 1.109 + break; 1.110 + default: 1.111 + UNREACHABLE(); 1.112 + } 1.113 + } 1.114 + else if (mRenderer->testDeviceLost(true)) 1.115 + { 1.116 + return gl::error(GL_OUT_OF_MEMORY, GL_TRUE); 1.117 + } 1.118 + 1.119 + return mStatus; 1.120 + } 1.121 + 1.122 + return GL_TRUE; // prevent blocking when query is null 1.123 +} 1.124 + 1.125 +}