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/239845
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index a2a8261..77bef2d 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -1232,10 +1232,14 @@
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)
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index a203aaa..356c7d1 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -177,7 +177,8 @@
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);
diff --git a/src/libANGLE/renderer/Renderer.h b/src/libANGLE/renderer/Renderer.h
index 0d53574..6aa6b80 100644
--- a/src/libANGLE/renderer/Renderer.h
+++ b/src/libANGLE/renderer/Renderer.h
@@ -76,7 +76,8 @@
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;
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index ae27ff4..124af57 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -506,52 +506,51 @@
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;
+ return gl::Error(GL_OUT_OF_MEMORY, "Failed to create event query, result: 0x%X.", result);
+ }
+ }
- 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->Flush();
+
+ 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);
}
- mDeviceContext->End(mSyncQuery);
- mDeviceContext->Flush();
+ // Keep polling, but allow other threads to do something useful first
+ ScheduleYield();
- do
+ if (testDeviceLost())
{
- 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
- ScheduleYield();
-
- if (testDeviceLost())
- {
- mDisplay->notifyDeviceLost();
- return gl::Error(GL_OUT_OF_MEMORY, "Device was lost while waiting for sync.");
- }
+ 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);
}
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index c7f77da..9afd1ee 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -60,7 +60,8 @@
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);
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index f8fcf91..f2429ed 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -499,7 +499,7 @@
}
}
-gl::Error Renderer9::sync(bool block)
+gl::Error Renderer9::flush()
{
IDirect3DQuery9* query = NULL;
gl::Error error = allocateEventQuery(&query);
@@ -515,7 +515,39 @@
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 @@
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);
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
index c2fabd2..b3bc799 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h
@@ -53,7 +53,8 @@
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);
diff --git a/src/libGLESv2/entry_points_gles_2_0.cpp b/src/libGLESv2/entry_points_gles_2_0.cpp
index d6d6f8a..7b6010c 100644
--- a/src/libGLESv2/entry_points_gles_2_0.cpp
+++ b/src/libGLESv2/entry_points_gles_2_0.cpp
@@ -1292,7 +1292,7 @@
Context *context = GetValidGlobalContext();
if (context)
{
- Error error = context->sync(true);
+ Error error = context->finish();
if (error.isError())
{
context->recordError(error);
@@ -1308,7 +1308,7 @@
Context *context = GetValidGlobalContext();
if (context)
{
- Error error = context->sync(false);
+ Error error = context->flush();
if (error.isError())
{
context->recordError(error);