Commit 2629856f by Geoff Lang

Updated Renderer::sync to return Error objects.

BUG=angle:520 Change-Id: I8f1f095977bab3848b9215cda1127a71982858b8 Reviewed-on: https://chromium-review.googlesource.com/220800Reviewed-by: 's avatarNicolas Capens <capn@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent fa41aa08
......@@ -1893,9 +1893,9 @@ Error Context::drawElements(GLenum mode, GLsizei count, GLenum type,
}
// Implements glFlush when block is false, glFinish when block is true
void Context::sync(bool block)
Error Context::sync(bool block)
{
mRenderer->sync(block);
return mRenderer->sync(block);
}
void Context::recordError(const Error &error)
......
......@@ -193,7 +193,7 @@ class Context
Error drawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei instances,
const rx::RangeUI &indexRange);
void sync(bool block); // flush/finish
Error sync(bool block); // flush/finish
void recordError(const Error &error);
......
......@@ -1526,7 +1526,12 @@ void __stdcall glFinish(void)
gl::Context *context = gl::getNonLostContext();
if (context)
{
context->sync(true);
gl::Error error = context->sync(true);
if (error.isError())
{
context->recordError(error);
return;
}
}
}
......@@ -1537,7 +1542,12 @@ void __stdcall glFlush(void)
gl::Context *context = gl::getNonLostContext();
if (context)
{
context->sync(false);
gl::Error error = context->sync(false);
if (error.isError())
{
context->recordError(error);
return;
}
}
}
......
......@@ -107,7 +107,7 @@ class Renderer
virtual int generateConfigs(ConfigDesc **configDescList) = 0;
virtual void deleteConfigs(ConfigDesc *configDescList) = 0;
virtual void sync(bool block) = 0;
virtual gl::Error sync(bool block) = 0;
virtual SwapChain *createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat) = 0;
......
......@@ -370,7 +370,7 @@ void Renderer11::deleteConfigs(ConfigDesc *configDescList)
delete [] (configDescList);
}
void Renderer11::sync(bool block)
gl::Error Renderer11::sync(bool block)
{
if (block)
{
......@@ -384,6 +384,10 @@ void Renderer11::sync(bool block)
result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.", result);
}
}
mDeviceContext->End(mSyncQuery);
......@@ -392,13 +396,17 @@ void Renderer11::sync(bool block)
do
{
result = mDeviceContext->GetData(mSyncQuery, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
}
// Keep polling, but allow other threads to do something useful first
Sleep(0);
if (testDeviceLost(true))
{
return;
return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync.");
}
}
while (result == S_FALSE);
......@@ -407,6 +415,8 @@ void Renderer11::sync(bool block)
{
mDeviceContext->Flush();
}
return gl::Error(GL_NO_ERROR);
}
SwapChain *Renderer11::createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
......
......@@ -56,7 +56,7 @@ class Renderer11 : public Renderer
virtual int generateConfigs(ConfigDesc **configDescList);
virtual void deleteConfigs(ConfigDesc *configDescList);
virtual void sync(bool block);
virtual gl::Error sync(bool block);
virtual SwapChain *createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
......
......@@ -490,43 +490,67 @@ void Renderer9::endScene()
}
}
void Renderer9::sync(bool block)
gl::Error Renderer9::sync(bool block)
{
IDirect3DQuery9* query = NULL;
gl::Error error = allocateEventQuery(&query);
if (error.isError())
{
return;
return error;
}
HRESULT result = query->Issue(D3DISSUE_END);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result);
}
// Grab the query data once in blocking and non-blocking case
result = query->GetData(NULL, 0, D3DGETDATA_FLUSH);
if (FAILED(result))
{
if (d3d9::isDeviceLostError(result))
{
notifyDeviceLost();
}
do
freeEventQuery(query);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
}
// If blocking, loop until the query completes
while (block && result == S_FALSE)
{
// Keep polling, but allow other threads to do something useful first
Sleep(0);
result = query->GetData(NULL, 0, D3DGETDATA_FLUSH);
if(block && result == S_FALSE)
// explicitly check for device loss
// some drivers seem to return S_FALSE even if the device is lost
// instead of D3DERR_DEVICELOST like they should
if (result == S_FALSE && testDeviceLost(false))
{
result = D3DERR_DEVICELOST;
}
if (FAILED(result))
{
// Keep polling, but allow other threads to do something useful first
Sleep(0);
// explicitly check for device loss
// some drivers seem to return S_FALSE even if the device is lost
// instead of D3DERR_DEVICELOST like they should
if (testDeviceLost(false))
if (d3d9::isDeviceLostError(result))
{
result = D3DERR_DEVICELOST;
notifyDeviceLost();
}
freeEventQuery(query);
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
}
}
while(block && result == S_FALSE);
freeEventQuery(query);
if (d3d9::isDeviceLostError(result))
{
notifyDeviceLost();
}
return gl::Error(GL_NO_ERROR);
}
SwapChain *Renderer9::createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
......
......@@ -48,7 +48,7 @@ class Renderer9 : public Renderer
void startScene();
void endScene();
virtual void sync(bool block);
virtual gl::Error sync(bool block);
virtual SwapChain *createSwapChain(rx::NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
......
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