[2/2] wined3d: Flip the scissor rect when rendering offscreen

H. Verbeet hverbeet at gmail.com
Wed Jul 25 17:38:50 CDT 2007


Since we render everything upside down, the scissor rect should be
flipped as well.

Changelog:
  - Flip the scissor rect when rendering offscreen
-------------- next part --------------
---

 dlls/wined3d/context.c |    2 ++
 dlls/wined3d/device.c  |   17 ++++++++++++-----
 dlls/wined3d/state.c   |    7 ++++++-
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 32791b7..1c5abd0 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -700,6 +700,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
             Context_MarkStateDirty(context, WINED3DTS_PROJECTION);
             Context_MarkStateDirty(context, STATE_VDECL);
             Context_MarkStateDirty(context, STATE_VIEWPORT);
+            Context_MarkStateDirty(context, STATE_SCISSORRECT);
         }
 
     } else {
@@ -787,6 +788,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
             Context_MarkStateDirty(context, WINED3DTS_PROJECTION);
             Context_MarkStateDirty(context, STATE_VDECL);
             Context_MarkStateDirty(context, STATE_VIEWPORT);
+            Context_MarkStateDirty(context, STATE_SCISSORRECT);
         }
     }
     if (readTexture) {
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0bdb753..3ccd7ad 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4522,11 +4522,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Coun
     if (!curRect) {
         /* In drawable flag is set below */
 
-        glScissor(This->stateBlock->viewport.X,
-                  (((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Height -
-                  (This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)),
-                   This->stateBlock->viewport.Width,
-                   This->stateBlock->viewport.Height);
+        if (This->render_offscreen) {
+            glScissor(This->stateBlock->viewport.X,
+                       This->stateBlock->viewport.Y,
+                       This->stateBlock->viewport.Width,
+                       This->stateBlock->viewport.Height);
+        } else {
+            glScissor(This->stateBlock->viewport.X,
+                      (((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Height -
+                      (This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)),
+                       This->stateBlock->viewport.Width,
+                       This->stateBlock->viewport.Height);
+        }
         checkGLcall("glScissor");
         glClear(glMask);
         checkGLcall("glClear");
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 3d6101d..71a6916 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3442,7 +3442,12 @@ static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
     winHeight = windowRect.bottom - windowRect.top;
     TRACE("(%p) Setting new Scissor Rect to %d:%d-%d:%d\n", stateblock->wineD3DDevice, pRect->left, pRect->bottom - winHeight,
           pRect->right - pRect->left, pRect->bottom - pRect->top);
-    glScissor(pRect->left, winHeight - pRect->bottom, pRect->right - pRect->left, pRect->bottom - pRect->top);
+
+    if (stateblock->wineD3DDevice->render_offscreen) {
+        glScissor(pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top);
+    } else {
+        glScissor(pRect->left, winHeight - pRect->bottom, pRect->right - pRect->left, pRect->bottom - pRect->top);
+    }
     checkGLcall("glScissor");
 }
 


More information about the wine-patches mailing list