Commit 129753af by Geoff Lang

Split the flush and finish commands into separate methods.

Improves the readability of the implementations and more closely mirrors the GL commands. Change-Id: Ifa7bc55751d50271eb01fd87e4efdc69f00c2c48 Reviewed-on: https://chromium-review.googlesource.com/239845Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 7c973eaa
...@@ -1232,10 +1232,14 @@ Error Context::drawElements(GLenum mode, GLsizei count, GLenum type, ...@@ -1232,10 +1232,14 @@ Error Context::drawElements(GLenum mode, GLsizei count, GLenum type,
return mRenderer->drawElements(getData(), mode, count, type, indices, instances, indexRange); return mRenderer->drawElements(getData(), mode, count, type, indices, instances, indexRange);
} }
// Implements glFlush when block is false, glFinish when block is true Error Context::flush()
Error Context::sync(bool block)
{ {
return mRenderer->sync(block); return mRenderer->flush();
}
Error Context::finish()
{
return mRenderer->finish();
} }
void Context::recordError(const Error &error) void Context::recordError(const Error &error)
......
...@@ -177,7 +177,8 @@ class Context ...@@ -177,7 +177,8 @@ class Context
Error drawElements(GLenum mode, GLsizei count, GLenum type, Error drawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei instances, const GLvoid *indices, GLsizei instances,
const rx::RangeUI &indexRange); const rx::RangeUI &indexRange);
Error sync(bool block); // flush/finish Error flush();
Error finish();
void recordError(const Error &error); void recordError(const Error &error);
......
...@@ -76,7 +76,8 @@ class Renderer ...@@ -76,7 +76,8 @@ class Renderer
virtual int generateConfigs(ConfigDesc **configDescList) = 0; virtual int generateConfigs(ConfigDesc **configDescList) = 0;
virtual void deleteConfigs(ConfigDesc *configDescList) = 0; virtual void deleteConfigs(ConfigDesc *configDescList) = 0;
virtual gl::Error sync(bool block) = 0; virtual gl::Error flush() = 0;
virtual gl::Error finish() = 0;
virtual gl::Error drawArrays(const gl::Data &data, GLenum mode, virtual gl::Error drawArrays(const gl::Data &data, GLenum mode,
GLint first, GLsizei count, GLsizei instances) = 0; GLint first, GLsizei count, GLsizei instances) = 0;
......
...@@ -506,52 +506,51 @@ void Renderer11::deleteConfigs(ConfigDesc *configDescList) ...@@ -506,52 +506,51 @@ void Renderer11::deleteConfigs(ConfigDesc *configDescList)
delete [] (configDescList); delete [] (configDescList);
} }
gl::Error Renderer11::sync(bool block) gl::Error Renderer11::flush()
{ {
if (block) mDeviceContext->Flush();
return gl::Error(GL_NO_ERROR);
}
gl::Error Renderer11::finish()
{
HRESULT result;
if (!mSyncQuery)
{ {
HRESULT result; D3D11_QUERY_DESC queryDesc;
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
if (!mSyncQuery) result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
ASSERT(SUCCEEDED(result));
if (FAILED(result))
{ {
D3D11_QUERY_DESC queryDesc; return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.", result);
queryDesc.Query = D3D11_QUERY_EVENT;
queryDesc.MiscFlags = 0;
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); mDeviceContext->End(mSyncQuery);
mDeviceContext->Flush(); mDeviceContext->Flush();
do do
{
result = mDeviceContext->GetData(mSyncQuery, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH);
if (FAILED(result))
{ {
result = mDeviceContext->GetData(mSyncQuery, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH); return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
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 // Keep polling, but allow other threads to do something useful first
ScheduleYield(); ScheduleYield();
if (testDeviceLost()) if (testDeviceLost())
{ {
mDisplay->notifyDeviceLost(); mDisplay->notifyDeviceLost();
return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync."); return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync.");
}
} }
while (result == S_FALSE);
}
else
{
mDeviceContext->Flush();
} }
while (result == S_FALSE);
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
......
...@@ -60,7 +60,8 @@ class Renderer11 : public RendererD3D ...@@ -60,7 +60,8 @@ class Renderer11 : public RendererD3D
virtual int generateConfigs(ConfigDesc **configDescList); virtual int generateConfigs(ConfigDesc **configDescList);
virtual void deleteConfigs(ConfigDesc *configDescList); virtual void deleteConfigs(ConfigDesc *configDescList);
virtual gl::Error sync(bool block); gl::Error flush() override;
gl::Error finish() override;
virtual SwapChain *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat); virtual SwapChain *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
......
...@@ -499,7 +499,7 @@ void Renderer9::endScene() ...@@ -499,7 +499,7 @@ void Renderer9::endScene()
} }
} }
gl::Error Renderer9::sync(bool block) gl::Error Renderer9::flush()
{ {
IDirect3DQuery9* query = NULL; IDirect3DQuery9* query = NULL;
gl::Error error = allocateEventQuery(&query); gl::Error error = allocateEventQuery(&query);
...@@ -515,7 +515,39 @@ gl::Error Renderer9::sync(bool block) ...@@ -515,7 +515,39 @@ gl::Error Renderer9::sync(bool block)
return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result); 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 // Grab the query data once
result = query->GetData(NULL, 0, D3DGETDATA_FLUSH);
freeEventQuery(query);
if (FAILED(result))
{
if (d3d9::isDeviceLostError(result))
{
notifyDeviceLost();
}
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
}
return gl::Error(GL_NO_ERROR);
}
gl::Error Renderer9::finish()
{
IDirect3DQuery9* query = NULL;
gl::Error error = allocateEventQuery(&query);
if (error.isError())
{
return error;
}
HRESULT result = query->Issue(D3DISSUE_END);
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
result = query->GetData(NULL, 0, D3DGETDATA_FLUSH); result = query->GetData(NULL, 0, D3DGETDATA_FLUSH);
if (FAILED(result)) if (FAILED(result))
{ {
...@@ -528,8 +560,8 @@ gl::Error Renderer9::sync(bool block) ...@@ -528,8 +560,8 @@ gl::Error Renderer9::sync(bool block)
return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
} }
// If blocking, loop until the query completes // Loop until the query completes
while (block && result == S_FALSE) while (result == S_FALSE)
{ {
// Keep polling, but allow other threads to do something useful first // Keep polling, but allow other threads to do something useful first
Sleep(0); Sleep(0);
......
...@@ -53,7 +53,8 @@ class Renderer9 : public RendererD3D ...@@ -53,7 +53,8 @@ class Renderer9 : public RendererD3D
void startScene(); void startScene();
void endScene(); void endScene();
virtual gl::Error sync(bool block); gl::Error flush() override;
gl::Error finish() override;
virtual SwapChain *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat); virtual SwapChain *createSwapChain(NativeWindow nativeWindow, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat);
......
...@@ -1292,7 +1292,7 @@ void GL_APIENTRY Finish(void) ...@@ -1292,7 +1292,7 @@ void GL_APIENTRY Finish(void)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
Error error = context->sync(true); Error error = context->finish();
if (error.isError()) if (error.isError())
{ {
context->recordError(error); context->recordError(error);
...@@ -1308,7 +1308,7 @@ void GL_APIENTRY Flush(void) ...@@ -1308,7 +1308,7 @@ void GL_APIENTRY Flush(void)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
Error error = context->sync(false); Error error = context->flush();
if (error.isError()) if (error.isError())
{ {
context->recordError(error); context->recordError(error);
......
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