| // |
| // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // Fence11.cpp: Defines the rx::Fence11 class which implements rx::FenceImpl. |
| |
| #include "libGLESv2/renderer/d3d/d3d11/Fence11.h" |
| #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h" |
| #include "libGLESv2/main.h" |
| |
| namespace rx |
| { |
| |
| Fence11::Fence11(rx::Renderer11 *renderer) |
| { |
| mRenderer = renderer; |
| mQuery = NULL; |
| } |
| |
| Fence11::~Fence11() |
| { |
| SafeRelease(mQuery); |
| } |
| |
| bool Fence11::isSet() const |
| { |
| return mQuery != NULL; |
| } |
| |
| void Fence11::set() |
| { |
| if (!mQuery) |
| { |
| D3D11_QUERY_DESC queryDesc; |
| queryDesc.Query = D3D11_QUERY_EVENT; |
| queryDesc.MiscFlags = 0; |
| |
| if (FAILED(mRenderer->getDevice()->CreateQuery(&queryDesc, &mQuery))) |
| { |
| return gl::error(GL_OUT_OF_MEMORY); |
| } |
| } |
| |
| mRenderer->getDeviceContext()->End(mQuery); |
| } |
| |
| bool Fence11::test(bool flushCommandBuffer) |
| { |
| ASSERT(mQuery); |
| |
| UINT getDataFlags = (flushCommandBuffer ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH); |
| HRESULT result = mRenderer->getDeviceContext()->GetData(mQuery, NULL, 0, getDataFlags); |
| |
| if (mRenderer->isDeviceLost()) |
| { |
| return gl::error(GL_OUT_OF_MEMORY, true); |
| } |
| |
| ASSERT(result == S_OK || result == S_FALSE); |
| return (result == S_OK); |
| } |
| |
| bool Fence11::hasError() const |
| { |
| return mRenderer->isDeviceLost(); |
| } |
| |
| } |