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