st/nine: Fix D3DWindowBuffer_release for old wine nine support
authorAxel Davy <davyaxel0@gmail.com>
Sat, 27 Apr 2019 13:45:12 +0000 (15:45 +0200)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 30 Apr 2019 17:18:49 +0000 (19:18 +0200)
No-one reported bugs for that, but is seems
c442dd789066104e5e84cc90d98a7ff5cd6296cf
and previous commits used APIs not defined until
nine minor version 3.
This patch should prevent crash in this case.

Also turn off the resize feature in this case,
as we won't prevent a buffer leak anymore.

Cc: "19.0" mesa-stable@lists.freedesktop.org
Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/swapchain9.c

index 36e073104003f85859830d11d942dfb1d5162bbf..8026ee16b7a9586eec57983593c517d315f28a62 100644 (file)
@@ -133,6 +133,13 @@ D3DWindowBuffer_release(struct NineSwapChain9 *This,
                         D3DWindowBuffer *present_handle)
 {
     int i;
+
+    /* IsBufferReleased API not available */
+    if (This->base.device->minor_version_num <= 2) {
+        ID3DPresent_DestroyD3DWindowBuffer(This->present, present_handle);
+        return;
+    }
+
     /* Add it to the 'pending release' list */
     for (i = 0; i < D3DPRESENT_BACK_BUFFERS_MAX_EX + 1; i++) {
         if (!This->present_handles_pending_release[i]) {
@@ -754,8 +761,11 @@ present( struct NineSwapChain9 *This,
     (void)target_depth;
 
     /* Can happen with old Wine (presentation can still succeed),
-     * or at window destruction. */
-    if (FAILED(hr) || target_width == 0 || target_height == 0) {
+     * or at window destruction.
+     * Also disable for very old wine as D3DWindowBuffer_release
+     * cannot do the DestroyD3DWindowBuffer workaround. */
+    if (FAILED(hr) || target_width == 0 || target_height == 0 ||
+        This->base.device->minor_version_num <= 2) {
         target_width = resource->width0;
         target_height = resource->height0;
     }