// // Copyright 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. // // Fence9.cpp: Defines the rx::FenceNV9 class. #include "libANGLE/renderer/d3d/d3d9/Fence9.h" #include "libANGLE/Context.h" #include "libANGLE/renderer/d3d/d3d9/Context9.h" #include "libANGLE/renderer/d3d/d3d9/Renderer9.h" #include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" namespace rx { FenceNV9::FenceNV9(Renderer9 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr) {} FenceNV9::~FenceNV9() { SafeRelease(mQuery); } angle::Result FenceNV9::set(const gl::Context *context, GLenum condition) { if (!mQuery) { ANGLE_TRY(mRenderer->allocateEventQuery(context, &mQuery)); } HRESULT result = mQuery->Issue(D3DISSUE_END); if (FAILED(result)) { SafeRelease(mQuery); } ANGLE_TRY_HR(GetImplAs(context), result, "Failed to end event query"); return angle::Result::Continue; } angle::Result FenceNV9::test(const gl::Context *context, GLboolean *outFinished) { return testHelper(GetImplAs(context), true, outFinished); } angle::Result FenceNV9::finish(const gl::Context *context) { GLboolean finished = GL_FALSE; while (finished != GL_TRUE) { ANGLE_TRY(testHelper(GetImplAs(context), true, &finished)); Sleep(0); } return angle::Result::Continue; } angle::Result FenceNV9::testHelper(Context9 *context9, bool flushCommandBuffer, GLboolean *outFinished) { ASSERT(mQuery); DWORD getDataFlags = (flushCommandBuffer ? D3DGETDATA_FLUSH : 0); HRESULT result = mQuery->GetData(nullptr, 0, getDataFlags); ANGLE_TRY_HR(context9, result, "Failed to get query data"); ASSERT(result == S_OK || result == S_FALSE); *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE); return angle::Result::Continue; } } // namespace rx