Henri Verbeet : wined3d: Update the scissor rect and viewport even on redundant wined3d_device_set_render_target () calls.

Alexandre Julliard julliard at winehq.org
Mon Nov 19 13:38:38 CST 2012


Module: wine
Branch: master
Commit: 94ab9d5ef39c14cf3cb38f650c0f72a03c277222
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=94ab9d5ef39c14cf3cb38f650c0f72a03c277222

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Nov 19 00:15:49 2012 +0100

wined3d: Update the scissor rect and viewport even on redundant wined3d_device_set_render_target() calls.

---

 dlls/wined3d/device.c |   55 ++++++++++++++++++++++++-------------------------
 1 files changed, 27 insertions(+), 28 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index e6b4acf..16287ad 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4531,13 +4531,6 @@ HRESULT CDECL wined3d_device_set_render_target(struct wined3d_device *device,
         return WINED3DERR_INVALIDCALL;
     }
 
-    prev = device->fb.render_targets[render_target_idx];
-    if (render_target == prev)
-    {
-        TRACE("Trying to do a NOP SetRenderTarget operation.\n");
-        return WINED3D_OK;
-    }
-
     /* Render target 0 can't be set to NULL. */
     if (!render_target && !render_target_idx)
     {
@@ -4551,6 +4544,33 @@ HRESULT CDECL wined3d_device_set_render_target(struct wined3d_device *device,
         return WINED3DERR_INVALIDCALL;
     }
 
+    /* Set the viewport and scissor rectangles, if requested. Tests show that
+     * stateblock recording is ignored, the change goes directly into the
+     * primary stateblock. */
+    if (!render_target_idx && set_viewport)
+    {
+        struct wined3d_state *state = &device->stateBlock->state;
+
+        state->viewport.x = 0;
+        state->viewport.y = 0;
+        state->viewport.width = render_target->resource.width;
+        state->viewport.height = render_target->resource.height;
+        state->viewport.min_z = 0.0f;
+        state->viewport.max_z = 1.0f;
+        device_invalidate_state(device, STATE_VIEWPORT);
+
+        state->scissor_rect.top = 0;
+        state->scissor_rect.left = 0;
+        state->scissor_rect.right = render_target->resource.width;
+        state->scissor_rect.bottom = render_target->resource.height;
+        device_invalidate_state(device, STATE_SCISSORRECT);
+    }
+
+
+    prev = device->fb.render_targets[render_target_idx];
+    if (render_target == prev)
+        return WINED3D_OK;
+
     if (render_target)
         wined3d_surface_incref(render_target);
     device->fb.render_targets[render_target_idx] = render_target;
@@ -4559,27 +4579,6 @@ HRESULT CDECL wined3d_device_set_render_target(struct wined3d_device *device,
     if (prev)
         wined3d_surface_decref(prev);
 
-    /* Render target 0 is special. */
-    if (!render_target_idx && set_viewport)
-    {
-        /* Set the viewport and scissor rectangles, if requested. Tests show
-         * that stateblock recording is ignored, the change goes directly
-         * into the primary stateblock. */
-        device->stateBlock->state.viewport.height = device->fb.render_targets[0]->resource.height;
-        device->stateBlock->state.viewport.width  = device->fb.render_targets[0]->resource.width;
-        device->stateBlock->state.viewport.x      = 0;
-        device->stateBlock->state.viewport.y      = 0;
-        device->stateBlock->state.viewport.max_z  = 1.0f;
-        device->stateBlock->state.viewport.min_z  = 0.0f;
-        device_invalidate_state(device, STATE_VIEWPORT);
-
-        device->stateBlock->state.scissor_rect.top = 0;
-        device->stateBlock->state.scissor_rect.left = 0;
-        device->stateBlock->state.scissor_rect.right = device->stateBlock->state.viewport.width;
-        device->stateBlock->state.scissor_rect.bottom = device->stateBlock->state.viewport.height;
-        device_invalidate_state(device, STATE_SCISSORRECT);
-    }
-
     device_invalidate_state(device, STATE_FRAMEBUFFER);
 
     return WINED3D_OK;




More information about the wine-cvs mailing list