Zebediah Figura : ddraw: Track the primary stateblock state locally.

Alexandre Julliard julliard at winehq.org
Wed Oct 23 15:31:31 CDT 2019


Module: wine
Branch: master
Commit: db9db753c33c10cafe559b1c75d3fa0599db7c83
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=db9db753c33c10cafe559b1c75d3fa0599db7c83

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Oct 21 21:35:55 2019 -0500

ddraw: Track the primary stateblock state locally.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ddraw/ddraw.c         | 9 +++++++++
 dlls/ddraw/ddraw_private.h | 4 +++-
 dlls/ddraw/device.c        | 6 +++++-
 dlls/ddraw/surface.c       | 1 +
 4 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 2c7619016e..69ef612cd4 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -422,6 +422,7 @@ static void ddraw_destroy(struct ddraw *This)
 
     if (This->wined3d_swapchain)
         ddraw_destroy_swapchain(This);
+    wined3d_stateblock_decref(This->state);
     wined3d_device_decref(This->wined3d_device);
     wined3d_decref(This->wined3d);
 
@@ -5025,5 +5026,13 @@ HRESULT ddraw_init(struct ddraw *ddraw, DWORD flags, enum wined3d_device_type de
 
     list_init(&ddraw->surface_list);
 
+    if (FAILED(hr = wined3d_stateblock_create(ddraw->wined3d_device, WINED3D_SBT_PRIMARY, &ddraw->state)))
+    {
+        ERR("Failed to create the primary stateblock, hr %#x.\n", hr);
+        wined3d_device_decref(ddraw->wined3d_device);
+        wined3d_decref(ddraw->wined3d);
+        return hr;
+    }
+
     return DD_OK;
 }
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 771b2a44d1..4ecd83d006 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -127,6 +127,8 @@ struct ddraw
     /* FVF management */
     struct FvfToDecl       *decls;
     UINT                    numConvertedDecls, declArraySize;
+
+    struct wined3d_stateblock *state;
 };
 
 #define DDRAW_WINDOW_CLASS_NAME "DirectDrawDeviceWnd"
@@ -351,7 +353,7 @@ struct d3d_device
 
     struct wined3d_vec4 user_clip_planes[D3DMAXUSERCLIPPLANES];
 
-    struct wined3d_stateblock *recording;
+    struct wined3d_stateblock *recording, *state, *update_state;
 };
 
 HRESULT d3d_device_create(struct ddraw *ddraw, struct ddraw_surface *target, IUnknown *rt_iface,
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 43e5d0aa92..9ea7cd7caf 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -5620,7 +5620,7 @@ static HRESULT d3d_device7_BeginStateBlock(IDirect3DDevice7 *iface)
         return D3DERR_INBEGINSTATEBLOCK;
     }
     if (SUCCEEDED(hr = wined3d_device_begin_stateblock(device->wined3d_device, &stateblock)))
-        device->recording = stateblock;
+        device->update_state = device->recording = stateblock;
     wined3d_mutex_unlock();
 
     return hr_ddraw_from_wined3d(hr);
@@ -5688,6 +5688,7 @@ static HRESULT d3d_device7_EndStateBlock(IDirect3DDevice7 *iface, DWORD *statebl
     }
     wined3d_sb = device->recording;
     device->recording = NULL;
+    device->update_state = device->state;
 
     h = ddraw_allocate_handle(&device->handle_table, wined3d_sb, DDRAW_HANDLE_STATEBLOCK);
     if (h == DDRAW_INVALID_HANDLE)
@@ -6978,12 +6979,15 @@ static HRESULT d3d_device_init(struct d3d_device *device, struct ddraw *ddraw,
     /* This is for convenience. */
     device->wined3d_device = ddraw->wined3d_device;
     wined3d_device_incref(ddraw->wined3d_device);
+    device->update_state = device->state = ddraw->state;
+    wined3d_stateblock_incref(ddraw->state);
 
     /* Render to the back buffer */
     if (FAILED(hr = wined3d_device_set_rendertarget_view(ddraw->wined3d_device,
             0, ddraw_surface_get_rendertarget_view(target), TRUE)))
     {
         ERR("Failed to set render target, hr %#x.\n", hr);
+        wined3d_stateblock_decref(device->state);
         ddraw_handle_table_destroy(&device->handle_table);
         return hr;
     }
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 6c27d8c26c..769b5a7576 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -6081,6 +6081,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
                 if (ddraw->d3ddevice->recording)
                     wined3d_stateblock_decref(ddraw->d3ddevice->recording);
                 ddraw->d3ddevice->recording = NULL;
+                ddraw->d3ddevice->update_state = ddraw->d3ddevice->state;
             }
 
             wined3d_device_set_render_state(ddraw->wined3d_device, WINED3D_RS_ZENABLE,




More information about the wine-cvs mailing list