st/nine: Don't present if window is occluded
authorPatrick Rudolph <siro@das-labor.org>
Wed, 10 Feb 2016 18:41:12 +0000 (19:41 +0100)
committerAxel Davy <axel.davy@ens.fr>
Wed, 18 May 2016 21:37:14 +0000 (23:37 +0200)
The problem is that if one d3d present call fails,
because of our occlusion check in present method,
the next presentation call will send the same pixmap to the Xserver again,
without waiting it is released, which is wrong.

Move the present call after occlusion check to return and prevent
Xpixmaps errors.

Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/swapchain9.c

index 803bd519a59f7a566b64c70fd44c7a880bea55c6..db3766063a5edc6747684f5123aa4c56db5ea064 100644 (file)
@@ -778,17 +778,13 @@ NineSwapChain9_Present( struct NineSwapChain9 *This,
     D3DWindowBuffer *handle_temp;
     struct threadpool_task *task_temp;
     int i;
-    HRESULT hr = present(This, pSourceRect, pDestRect,
-                         hDestWindowOverride, pDirtyRegion, dwFlags);
+    HRESULT hr;
 
     DBG("This=%p pSourceRect=%p pDestRect=%p hDestWindowOverride=%p "
         "pDirtyRegion=%p dwFlags=%d\n",
         This, pSourceRect, pDestRect, hDestWindowOverride,
         pDirtyRegion,dwFlags);
 
-    if (hr == D3DERR_WASSTILLDRAWING)
-        return hr;
-
     if (This->base.device->ex) {
         if (NineSwapChain9_GetOccluded(This)) {
             return S_PRESENT_OCCLUDED;
@@ -803,6 +799,11 @@ NineSwapChain9_Present( struct NineSwapChain9 *This,
         }
     }
 
+    hr = present(This, pSourceRect, pDestRect,
+                 hDestWindowOverride, pDirtyRegion, dwFlags);
+    if (hr == D3DERR_WASSTILLDRAWING)
+        return hr;
+
     switch (This->params.SwapEffect) {
         case D3DSWAPEFFECT_FLIP:
             UNTESTED(4);