Implemented Renderer11::sync.

TRAC #22351 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1816 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent d5903cac
...@@ -81,6 +81,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc( ...@@ -81,6 +81,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(
mClearScissorRS = NULL; mClearScissorRS = NULL;
mClearNoScissorRS = NULL; mClearNoScissorRS = NULL;
mSyncQuery = NULL;
mD3d11Module = NULL; mD3d11Module = NULL;
mDxgiModule = NULL; mDxgiModule = NULL;
...@@ -309,8 +311,41 @@ void Renderer11::deleteConfigs(ConfigDesc *configDescList) ...@@ -309,8 +311,41 @@ void Renderer11::deleteConfigs(ConfigDesc *configDescList)
void Renderer11::sync(bool block) void Renderer11::sync(bool block)
{ {
// TODO if (block)
// UNIMPLEMENTED(); {
HRESULT result;
if (!mSyncQuery)
{
D3D11_QUERY_DESC queryDesc;
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
ASSERT(SUCCEEDED(result));
}
mDeviceContext->End(mSyncQuery);
mDeviceContext->Flush();
do
{
result = mDeviceContext->GetData(mSyncQuery, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH);
// Keep polling, but allow other threads to do something useful first
Sleep(0);
if (testDeviceLost(true))
{
return;
}
}
while (result == S_FALSE);
}
else
{
mDeviceContext->Flush();
}
} }
SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
...@@ -1698,6 +1733,12 @@ void Renderer11::releaseDeviceResources() ...@@ -1698,6 +1733,12 @@ void Renderer11::releaseDeviceResources()
mDriverConstantBufferPS->Release(); mDriverConstantBufferPS->Release();
mDriverConstantBufferPS = NULL; mDriverConstantBufferPS = NULL;
} }
if (mSyncQuery)
{
mSyncQuery->Release();
mSyncQuery = NULL;
}
} }
void Renderer11::markDeviceLost() void Renderer11::markDeviceLost()
......
...@@ -284,6 +284,9 @@ class Renderer11 : public Renderer ...@@ -284,6 +284,9 @@ class Renderer11 : public Renderer
ID3D11RasterizerState *mClearScissorRS; ID3D11RasterizerState *mClearScissorRS;
ID3D11RasterizerState *mClearNoScissorRS; ID3D11RasterizerState *mClearNoScissorRS;
// Sync query
ID3D11Query *mSyncQuery;
ID3D11Device *mDevice; ID3D11Device *mDevice;
D3D_FEATURE_LEVEL mFeatureLevel; D3D_FEATURE_LEVEL mFeatureLevel;
ID3D11DeviceContext *mDeviceContext; ID3D11DeviceContext *mDeviceContext;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment