[7/7] WineD3D: Do not specify the viewport origin upside down when doing offscreen rendering

Stefan Dösinger stefan at codeweavers.com
Tue Mar 6 08:00:31 CST 2007


-------------- next part --------------
From 8b8937bbc430896acd7a0e9e030ba83cc43c1938 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Tue, 6 Mar 2007 14:56:58 +0100
Subject: [PATCH] WineD3D: Do not specify the viewport origin upside down when doing offscreen rendering

The gl viewport origin is the lower left corner of the window, in d3d it is the upper right corner. This is
corrected when setting the viewport. However, when we are doing offscreen rendering, this is reversed. So do
not flip the viewport origin when rendering offscreen.
---
 dlls/wined3d/device.c |    4 ++++
 dlls/wined3d/state.c  |   16 +++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 654bf13..3ec9f40 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5134,6 +5134,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
         viewport.MaxZ   = 1.0f;
         viewport.MinZ   = 0.0f;
         IWineD3DDeviceImpl_SetViewport(iface, &viewport);
+        /* Make sure the viewport state is dirty, because the render_offscreen thing affects it.
+         * SetViewport may catch NOP viewport changes, which would occur when switching between equally sized targets
+         */
+        IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VIEWPORT);
 
         /* Activate the new render target for now. This shouldn't stay here, but is needed until all methods using gl activate the
          * ctx properly.
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 00f4876..cf1b7f4 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3015,11 +3015,17 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, W
 static void viewport(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
     glDepthRange(stateblock->viewport.MinZ, stateblock->viewport.MaxZ);
     checkGLcall("glDepthRange");
-    /* Note: GL requires lower left, DirectX supplies upper left */
-    /* TODO: replace usage of renderTarget with context management */
-    glViewport(stateblock->viewport.X,
-               (((IWineD3DSurfaceImpl *)stateblock->wineD3DDevice->render_targets[0])->currentDesc.Height - (stateblock->viewport.Y + stateblock->viewport.Height)),
-               stateblock->viewport.Width, stateblock->viewport.Height);
+    /* Note: GL requires lower left, DirectX supplies upper left. This is reversed when using offscreen rendering
+     */
+    if(stateblock->wineD3DDevice->render_offscreen) {
+        glViewport(stateblock->viewport.X,
+                   stateblock->viewport.Y,
+                   stateblock->viewport.Width, stateblock->viewport.Height);
+    } else {
+        glViewport(stateblock->viewport.X,
+                   (((IWineD3DSurfaceImpl *)stateblock->wineD3DDevice->render_targets[0])->currentDesc.Height - (stateblock->viewport.Y + stateblock->viewport.Height)),
+                   stateblock->viewport.Width, stateblock->viewport.Height);
+    }
 
     checkGLcall("glViewport");
 
-- 
1.4.4.3



More information about the wine-patches mailing list