Implemented Renderer11::sync.

TRAC #22351

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Geoff Lang

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1816 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index 5c5c00e..ea97e4a 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -81,6 +81,8 @@
     mClearScissorRS = NULL;
     mClearNoScissorRS = NULL;
 
+    mSyncQuery = NULL;
+
     mD3d11Module = NULL;
     mDxgiModule = NULL;
 
@@ -309,8 +311,41 @@
 
 void Renderer11::sync(bool block)
 {
-    // TODO
-    // UNIMPLEMENTED();
+    if (block)
+    {
+        HRESULT result;
+
+        if (!mSyncQuery)
+        {
+            D3D11_QUERY_DESC queryDesc;
+            queryDesc.Query = D3D11_QUERY_EVENT;
+            queryDesc.MiscFlags = 0;
+
+            result = mDevice->CreateQuery(&queryDesc, &mSyncQuery);
+            ASSERT(SUCCEEDED(result));
+        }
+
+        mDeviceContext->End(mSyncQuery);
+        mDeviceContext->Flush();
+
+        do
+        {
+            result = mDeviceContext->GetData(mSyncQuery, NULL, 0, D3D11_ASYNC_GETDATA_DONOTFLUSH);
+
+            // Keep polling, but allow other threads to do something useful first
+            Sleep(0);
+
+            if (testDeviceLost(true))
+            {
+                return;
+            }
+        }
+        while (result == S_FALSE);
+    }
+    else
+    {
+        mDeviceContext->Flush();
+    }
 }
 
 SwapChain *Renderer11::createSwapChain(HWND window, HANDLE shareHandle, GLenum backBufferFormat, GLenum depthBufferFormat)
@@ -1698,6 +1733,12 @@
         mDriverConstantBufferPS->Release();
         mDriverConstantBufferPS = NULL;
     }
+
+    if (mSyncQuery)
+    {
+        mSyncQuery->Release();
+        mSyncQuery = NULL;
+    }
 }
 
 void Renderer11::markDeviceLost()
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index d07c448..3fe420f 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -284,6 +284,9 @@
     ID3D11RasterizerState *mClearScissorRS;
     ID3D11RasterizerState *mClearNoScissorRS;
 
+    // Sync query
+    ID3D11Query *mSyncQuery;
+
     ID3D11Device *mDevice;
     D3D_FEATURE_LEVEL mFeatureLevel;
     ID3D11DeviceContext *mDeviceContext;