| // |
| // 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. |
| // |
| |
| // Fence9.cpp: Defines the rx::FenceNV9 class. |
| |
| #include "libANGLE/renderer/d3d/d3d9/Fence9.h" |
| #include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h" |
| #include "libANGLE/renderer/d3d/d3d9/Renderer9.h" |
| |
| namespace rx |
| { |
| |
| FenceNV9::FenceNV9(Renderer9 *renderer) : FenceNVImpl(), mRenderer(renderer), mQuery(nullptr) |
| { |
| } |
| |
| FenceNV9::~FenceNV9() |
| { |
| SafeRelease(mQuery); |
| } |
| |
| gl::Error FenceNV9::set(GLenum condition) |
| { |
| if (!mQuery) |
| { |
| gl::Error error = mRenderer->allocateEventQuery(&mQuery); |
| if (error.isError()) |
| { |
| return error; |
| } |
| } |
| |
| HRESULT result = mQuery->Issue(D3DISSUE_END); |
| if (FAILED(result)) |
| { |
| ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); |
| SafeRelease(mQuery); |
| return gl::Error(GL_OUT_OF_MEMORY, "Failed to end event query, result: 0x%X.", result); |
| } |
| |
| return gl::NoError(); |
| } |
| |
| gl::Error FenceNV9::test(GLboolean *outFinished) |
| { |
| return testHelper(true, outFinished); |
| } |
| |
| gl::Error FenceNV9::finish() |
| { |
| GLboolean finished = GL_FALSE; |
| while (finished != GL_TRUE) |
| { |
| gl::Error error = testHelper(true, &finished); |
| if (error.isError()) |
| { |
| return error; |
| } |
| |
| Sleep(0); |
| } |
| |
| return gl::NoError(); |
| } |
| |
| gl::Error FenceNV9::testHelper(bool flushCommandBuffer, GLboolean *outFinished) |
| { |
| ASSERT(mQuery); |
| |
| DWORD getDataFlags = (flushCommandBuffer ? D3DGETDATA_FLUSH : 0); |
| HRESULT result = mQuery->GetData(nullptr, 0, getDataFlags); |
| |
| if (d3d9::isDeviceLostError(result)) |
| { |
| mRenderer->notifyDeviceLost(); |
| return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while querying result of an event query."); |
| } |
| else if (FAILED(result)) |
| { |
| return gl::Error(GL_OUT_OF_MEMORY, "Failed to get query data, result: 0x%X.", result); |
| } |
| |
| ASSERT(result == S_OK || result == S_FALSE); |
| *outFinished = ((result == S_OK) ? GL_TRUE : GL_FALSE); |
| return gl::NoError(); |
| } |
| |
| } |