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,
return mRenderer->drawElements(getData(), mode, count, type, indices, instances, indexRange);
}
// Implements glFlush when block is false, glFinish when block is true
Error Context::sync(bool block)
Error Context::flush()
{
return mRenderer->sync(block);
return mRenderer->flush();
}
Error Context::finish()
{
return mRenderer->finish();
}
void Context::recordError(const Error &error)
......
......@@ -177,7 +177,8 @@ class Context
Error drawElements(GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei instances,
const rx::RangeUI &indexRange);
Error sync(bool block); // flush/finish
Error flush();
Error finish();
void recordError(const Error &error);
......
......@@ -76,7 +76,8 @@ class Renderer
virtual int generateConfigs(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,
GLint first, GLsizei count, GLsizei instances) = 0;
......
......@@ -506,52 +506,51 @@ void Renderer11::deleteConfigs(ConfigDesc *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;
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);
}
return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.", result);
}
}
mDeviceContext->End(mSyncQuery);
mDeviceContext->Flush();
mDeviceContext->End(mSyncQuery);
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);
if (FAILED(result))
{
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);
}
// Keep polling, but allow other threads to do something useful first
ScheduleYield();
// Keep polling, but allow other threads to do something useful first
ScheduleYield();
if (testDeviceLost())
{
mDisplay->notifyDeviceLost();
return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync.");
}
if (testDeviceLost())
{
mDisplay->notifyDeviceLost();
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);
}
......
......@@ -60,7 +60,8 @@ class Renderer11 : public RendererD3D
virtual int generateConfigs(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);
......
......@@ -499,7 +499,7 @@ void Renderer9::endScene()
}
}
gl::Error Renderer9::sync(bool block)
gl::Error Renderer9::flush()
{
IDirect3DQuery9* query = NULL;
gl::Error error = allocateEventQuery(&query);
......@@ -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);
}
// 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);
if (FAILED(result))
{
......@@ -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);
}
// If blocking, loop until the query completes
while (block && result == S_FALSE)
// Loop until the query completes
while (result == S_FALSE)
{
// Keep polling, but allow other threads to do something useful first
Sleep(0);
......
......@@ -53,7 +53,8 @@ class Renderer9 : public RendererD3D
void startScene();
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);
......
......@@ -1292,7 +1292,7 @@ void GL_APIENTRY Finish(void)
Context *context = GetValidGlobalContext();
if (context)
{
Error error = context->sync(true);
Error error = context->finish();
if (error.isError())
{
context->recordError(error);
......@@ -1308,7 +1308,7 @@ void GL_APIENTRY Flush(void)
Context *context = GetValidGlobalContext();
if (context)
{
Error error = context->sync(false);
Error error = context->flush();
if (error.isError())
{
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