1// 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// Fence11.cpp: Defines the rx::Fence11 class which implements rx::FenceImpl. 8 9#include "libGLESv2/renderer/d3d/d3d11/Fence11.h" 10#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h" 11#include "libGLESv2/main.h" 12 13namespace rx 14{ 15 16Fence11::Fence11(rx::Renderer11 *renderer) 17{ 18 mRenderer = renderer; 19 mQuery = NULL; 20} 21 22Fence11::~Fence11() 23{ 24 SafeRelease(mQuery); 25} 26 27bool Fence11::isSet() const 28{ 29 return mQuery != NULL; 30} 31 32void Fence11::set() 33{ 34 if (!mQuery) 35 { 36 D3D11_QUERY_DESC queryDesc; 37 queryDesc.Query = D3D11_QUERY_EVENT; 38 queryDesc.MiscFlags = 0; 39 40 if (FAILED(mRenderer->getDevice()->CreateQuery(&queryDesc, &mQuery))) 41 { 42 return gl::error(GL_OUT_OF_MEMORY); 43 } 44 } 45 46 mRenderer->getDeviceContext()->End(mQuery); 47} 48 49bool Fence11::test(bool flushCommandBuffer) 50{ 51 ASSERT(mQuery); 52 53 UINT getDataFlags = (flushCommandBuffer ? 0 : D3D11_ASYNC_GETDATA_DONOTFLUSH); 54 HRESULT result = mRenderer->getDeviceContext()->GetData(mQuery, NULL, 0, getDataFlags); 55 56 if (mRenderer->isDeviceLost()) 57 { 58 return gl::error(GL_OUT_OF_MEMORY, true); 59 } 60 61 ASSERT(result == S_OK || result == S_FALSE); 62 return (result == S_OK); 63} 64 65bool Fence11::hasError() const 66{ 67 return mRenderer->isDeviceLost(); 68} 69 70} 71