Stefan Dösinger : wined3d: Use the scissor test when clearing the full surface too.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 5 13:10:21 CST 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Mar  2 09:25:02 2007 +0100

wined3d: Use the scissor test when clearing the full surface too.

It was incorrect to disable the scissor test for full surfaces in my
clear patch. With back buffer offscreen rendering the viewport does
not seem to restrict clearing, and with different sizes of depth
stencil and color buffer the final fantasy XI demo seems to expect the
clear to be restricted.

---

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

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0ad2c47..af28e96 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4138,14 +4138,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Coun
 
     ENTER_GL();
 
-    if(pRects) {
-        glEnable(GL_SCISSOR_TEST);
-        checkGLcall("glEnable GL_SCISSOR_TEST");
-        IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
-    } else {
-        glDisable(GL_SCISSOR_TEST);
-        checkGLcall("glEnable GL_SCISSOR_TEST");
-    }
+    glEnable(GL_SCISSOR_TEST);
+    checkGLcall("glEnable GL_SCISSOR_TEST");
+    IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
     IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
 
     if (Count > 0 && pRects) {
@@ -4184,6 +4179,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Coun
     }
 
     if (!curRect) {
+        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");
     } else {
@@ -5246,10 +5247,20 @@ static void     WINAPI  IWineD3DDeviceImpl_SetCursorPosition(IWineD3DDevice* ifa
 static BOOL     WINAPI  IWineD3DDeviceImpl_ShowCursor(IWineD3DDevice* iface, BOOL bShow) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     BOOL oldVisible = This->bCursorVisible;
+    POINT pt;
+
     TRACE("(%p) : visible(%d)\n", This, bShow);
 
     if(This->cursorTexture)
         This->bCursorVisible = bShow;
+    /*
+     * When ShowCursor is first called it should make the cursor appear at the OS's last
+     * known cursor position.  Because of this, some applications just repetitively call
+     * ShowCursor in order to update the cursor's position.  This behavior is undocumented.
+     */
+    GetCursorPos(&pt);
+    This->xScreenSpace = pt.x;
+    This->yScreenSpace = pt.y;
 
     return oldVisible;
 }




More information about the wine-cvs mailing list