From 94ab9d5ef39c14cf3cb38f650c0f72a03c277222 Mon Sep 17 00:00:00 2001 From: Henri Verbeet <hverbeet@codeweavers.com> Date: Mon, 19 Nov 2012 00:15:49 +0100 Subject: [PATCH] wined3d: Update the scissor rect and viewport even on redundant wined3d_device_set_render_target() calls. --- dlls/wined3d/device.c | 55 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e6b4acfe6f8..16287ade292 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; -- GitLab