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