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);