[PATCH 3/5] wined3d: Introduce a function to initialize swapchain specific device state.

Henri Verbeet hverbeet at codeweavers.com
Wed Sep 25 02:58:13 CDT 2013


---
 dlls/wined3d/device.c     |   51 +++++++++++++++++----------------------------
 dlls/wined3d/stateblock.c |    5 +----
 2 files changed, 20 insertions(+), 36 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1ab4a49..2014338 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -827,21 +827,23 @@ void CDECL wined3d_device_release_focus_window(struct wined3d_device *device)
     InterlockedExchangePointer((void **)&device->focus_window, NULL);
 }
 
-static void device_reset_viewport_scissor(struct wined3d_device *device, UINT width, UINT height)
+static void device_init_swapchain_state(struct wined3d_device *device, struct wined3d_swapchain *swapchain)
 {
-    struct wined3d_state *state = &device->state;
+    BOOL ds_enable = !!swapchain->desc.enable_auto_depth_stencil;
+    unsigned int i;
 
-    state->viewport.x = 0;
-    state->viewport.y = 0;
-    state->viewport.width = width;
-    state->viewport.height = height;
-    state->viewport.min_z = 0.0f;
-    state->viewport.max_z = 1.0f;
+    if (device->fb.render_targets)
+    {
+        for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i)
+        {
+            wined3d_device_set_render_target(device, i, NULL, FALSE);
+        }
+        if (swapchain->back_buffers && swapchain->back_buffers[0])
+            wined3d_device_set_render_target(device, 0, swapchain->back_buffers[0], TRUE);
+    }
 
-    state->scissor_rect.left = 0;
-    state->scissor_rect.top = 0;
-    state->scissor_rect.right = width;
-    state->scissor_rect.bottom = height;
+    wined3d_device_set_depth_stencil(device, ds_enable ? device->auto_depth_stencil : NULL);
+    wined3d_device_set_render_state(device, WINED3D_RS_ZENABLE, ds_enable);
 }
 
 HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
@@ -895,25 +897,8 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
     }
     device->swapchains[0] = swapchain;
 
-    if (swapchain->back_buffers && swapchain->back_buffers[0])
-    {
-        TRACE("Setting rendertarget to %p.\n", swapchain->back_buffers);
-        device->fb.render_targets[0] = swapchain->back_buffers[0];
-        wined3d_surface_incref(device->fb.render_targets[0]);
-        clear_flags |= WINED3DCLEAR_TARGET;
-    }
-
-    /* Depth Stencil support */
-    device->fb.depth_stencil = device->auto_depth_stencil;
-    if (device->fb.depth_stencil)
-        wined3d_surface_incref(device->fb.depth_stencil);
-
-    /* Set up some starting GL setup */
-
-    /* Setup all the devices defaults */
     state_init_default(&device->state, device);
-    device_reset_viewport_scissor(device, swapchain->desc.backbuffer_width,
-            swapchain->desc.backbuffer_height);
+    device_init_swapchain_state(device, swapchain);
 
     context = context_acquire(device, swapchain->front_buffer);
 
@@ -947,6 +932,8 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
     context_release(context);
 
     /* Clear the screen */
+    if (swapchain->back_buffers && swapchain->back_buffers[0])
+        clear_flags |= WINED3DCLEAR_TARGET;
     if (swapchain_desc->enable_auto_depth_stencil)
         clear_flags |= WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL;
     if (clear_flags)
@@ -4726,9 +4713,9 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
         if (FAILED(hr = state_init(&device->state, &device->adapter->d3d_info)))
             ERR("Failed to initialize device state, hr %#x.\n", hr);
         state_init_default(&device->state, device);
-        device_reset_viewport_scissor(device, swapchain->desc.backbuffer_width,
-                swapchain->desc.backbuffer_height);
         device->update_state = &device->state;
+
+        device_init_swapchain_state(device, swapchain);
     }
     else
     {
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 04bedf1..6bdbb1b 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -1203,10 +1203,7 @@ void state_init_default(struct wined3d_state *state, struct wined3d_device *devi
 
     TRACE("Render states\n");
     /* Render states: */
-    if (device->auto_depth_stencil)
-       state->render_states[WINED3D_RS_ZENABLE] = WINED3D_ZB_TRUE;
-    else
-       state->render_states[WINED3D_RS_ZENABLE] = WINED3D_ZB_FALSE;
+    state->render_states[WINED3D_RS_ZENABLE] = WINED3D_ZB_TRUE;
     state->render_states[WINED3D_RS_FILLMODE] = WINED3D_FILL_SOLID;
     state->render_states[WINED3D_RS_SHADEMODE] = WINED3D_SHADE_GOURAUD;
     lp.lp.repeat_factor = 0;
-- 
1.7.10.4




More information about the wine-patches mailing list