Stefan Dösinger : wined3d: Small rhw vertex fix.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 25 14:18:21 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 5b8b776431d34ffc18ac02123bb58bd31fc54f9a
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=5b8b776431d34ffc18ac02123bb58bd31fc54f9a

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu May 25 11:40:36 2006 +0200

wined3d: Small rhw vertex fix.

Fix the one pixel displacement and move the glOrtho code in a common
function.

---

 dlls/wined3d/drawprim.c        |   86 ++++++++++++++++++++--------------------
 dlls/wined3d/surface.c         |   71 +--------------------------------
 dlls/wined3d/wined3d_private.h |    3 -
 3 files changed, 47 insertions(+), 113 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index b78e3d6..6e703eb 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -180,6 +180,49 @@ static GLfloat invymat[16] = {
 	0.0f, 0.0f, 1.0f, 0.0f,
 	0.0f, 0.0f, 0.0f, 1.0f};
 
+void d3ddevice_set_ortho(IWineD3DDeviceImpl *This) {
+    /* If the last draw was transformed as well, no need to reapply all the matrixes */
+    if ( (!This->last_was_rhw) || (This->viewport_changed) ) {
+
+        double X, Y, height, width, minZ, maxZ;
+        This->last_was_rhw = TRUE;
+        This->viewport_changed = FALSE;
+
+        /* Transformed already into viewport coordinates, so we do not need transform
+            matrices. Reset all matrices to identity and leave the default matrix in world
+            mode.                                                                         */
+        glMatrixMode(GL_MODELVIEW);
+        checkGLcall("glMatrixMode(GL_MODELVIEW)");
+        glLoadIdentity();
+        checkGLcall("glLoadIdentity");
+
+        glMatrixMode(GL_PROJECTION);
+        checkGLcall("glMatrixMode(GL_PROJECTION)");
+        glLoadIdentity();
+        checkGLcall("glLoadIdentity");
+
+        /* Set up the viewport to be full viewport */
+        X      = This->stateBlock->viewport.X;
+        Y      = This->stateBlock->viewport.Y;
+        height = This->stateBlock->viewport.Height;
+        width  = This->stateBlock->viewport.Width;
+        minZ   = This->stateBlock->viewport.MinZ;
+        maxZ   = This->stateBlock->viewport.MaxZ;
+        TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
+        glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
+        checkGLcall("glOrtho");
+
+        /* Window Coord 0 is the middle of the first pixel, so translate by half
+            a pixel (See comment above glTranslate below)                         */
+        glTranslatef(0.375, 0.375, 0);
+        checkGLcall("glTranslatef(0.375, 0.375, 0)");
+        if (This->renderUpsideDown) {
+            glMultMatrixf(invymat);
+            checkGLcall("glMultMatrixf(invymat)");
+        }
+    }
+
+}
 /* Setup views - Transformed & lit if RHW, else untransformed.
        Only unlit if Normals are supplied
     Returns: Whether to restore lighting afterwards           */
@@ -198,48 +241,7 @@ static BOOL primitiveInitState(IWineD3DD
     }
 
     if (!useVS && vtx_transformed) {
-
-        /* If the last draw was transformed as well, no need to reapply all the matrixes */
-        if ( (!This->last_was_rhw) || (This->viewport_changed) ) {
-
-            double X, Y, height, width, minZ, maxZ;
-            This->last_was_rhw = TRUE;
-            This->viewport_changed = FALSE;
-
-            /* Transformed already into viewport coordinates, so we do not need transform
-               matrices. Reset all matrices to identity and leave the default matrix in world
-               mode.                                                                         */
-            glMatrixMode(GL_MODELVIEW);
-            checkGLcall("glMatrixMode(GL_MODELVIEW)");
-            glLoadIdentity();
-            checkGLcall("glLoadIdentity");
-
-            glMatrixMode(GL_PROJECTION);
-            checkGLcall("glMatrixMode(GL_PROJECTION)");
-            glLoadIdentity();
-            checkGLcall("glLoadIdentity");
-
-            /* Set up the viewport to be full viewport */
-            X      = This->stateBlock->viewport.X;
-            Y      = This->stateBlock->viewport.Y;
-            height = This->stateBlock->viewport.Height;
-            width  = This->stateBlock->viewport.Width;
-            minZ   = This->stateBlock->viewport.MinZ;
-            maxZ   = This->stateBlock->viewport.MaxZ;
-            TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-            glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
-            checkGLcall("glOrtho");
-
-            /* Window Coord 0 is the middle of the first pixel, so translate by half
-               a pixel (See comment above glTranslate below)                         */
-            glTranslatef(0.5, 0.5, 0);
-            checkGLcall("glTranslatef(0.5, 0.5, 0)");
-            if (This->renderUpsideDown) {
-                glMultMatrixf(invymat);
-                checkGLcall("glMultMatrixf(invymat)");
-            }
-        }
-
+        d3ddevice_set_ortho(This);
     } else {
 
         /* Untransformed, so relies on the view and projection matrices */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 301f7df..7932667 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -780,41 +780,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_Unloc
             /* glDrawPixels transforms the raster position as though it was a vertex -
                we want to draw at screen position 0,0 - Set up ortho (rhw) mode as
                per drawprim (and leave set - it will sort itself out due to last_was_rhw */
-            if ( (!myDevice->last_was_rhw) || (myDevice->viewport_changed) ) {
-
-                double X, Y, height, width, minZ, maxZ;
-                myDevice->last_was_rhw = TRUE;
-                myDevice->viewport_changed = FALSE;
-
-                /* Transformed already into viewport coordinates, so we do not need transform
-                   matrices. Reset all matrices to identity and leave the default matrix in world
-                   mode.                                                                         */
-                glMatrixMode(GL_MODELVIEW);
-                checkGLcall("glMatrixMode");
-                glLoadIdentity();
-                checkGLcall("glLoadIdentity");
-
-                glMatrixMode(GL_PROJECTION);
-                checkGLcall("glMatrixMode");
-                glLoadIdentity();
-                checkGLcall("glLoadIdentity");
-
-                /* Set up the viewport to be full viewport */
-                X      = myDevice->stateBlock->viewport.X;
-                Y      = myDevice->stateBlock->viewport.Y;
-                height = myDevice->stateBlock->viewport.Height;
-                width  = myDevice->stateBlock->viewport.Width;
-                minZ   = myDevice->stateBlock->viewport.MinZ;
-                maxZ   = myDevice->stateBlock->viewport.MaxZ;
-                TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-                glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
-                checkGLcall("glOrtho");
-
-                /* Window Coord 0 is the middle of the first pixel, so translate by half
-                   a pixel (See comment above glTranslate below)                         */
-                glTranslatef(0.5, 0.5, 0);
-                checkGLcall("glTranslatef(0.5, 0.5, 0)");
-            }
+            d3ddevice_set_ortho(This->resource.wineD3DDevice);
 
             if (iface ==  implSwapChain->backBuffer || iface == myDevice->renderTarget) {
                 glDrawBuffer(GL_BACK);
@@ -2192,40 +2158,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_BltOv
 
             /* Draw a textured quad
              */
-            if ( TRUE ) {
-                double X, Y, height, width, minZ, maxZ;
-                myDevice->last_was_rhw = FALSE;
-                myDevice->viewport_changed = FALSE;
-
-                /* Transformed already into viewport coordinates, so we do not need transform
-                   matrices. Reset all matrices to identity and leave the default matrix in world
-                   mode.                                                                         */
-                glMatrixMode(GL_MODELVIEW);
-                checkGLcall("glMatrixMode");
-                glLoadIdentity();
-                checkGLcall("glLoadIdentity");
-
-                glMatrixMode(GL_PROJECTION);
-                checkGLcall("glMatrixMode");
-                glLoadIdentity();
-                checkGLcall("glLoadIdentity");
-
-                /* Set up the viewport to be full viewport */
-                X      = myDevice->stateBlock->viewport.X;
-                Y      = myDevice->stateBlock->viewport.Y;
-                height = myDevice->stateBlock->viewport.Height;
-                width  = myDevice->stateBlock->viewport.Width;
-                minZ   = myDevice->stateBlock->viewport.MinZ;
-                maxZ   = myDevice->stateBlock->viewport.MaxZ;
-                TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
-                glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
-                checkGLcall("glOrtho");
-
-                /* Window Coord 0 is the middle of the first pixel, so translate by half
-                   a pixel (See comment above glTranslate below)                         */
-                glTranslatef(0.375, 0.375, 0);
-                checkGLcall("glTranslatef(0.375, 0.375, 0)");
-            }
+            d3ddevice_set_ortho(This->resource.wineD3DDevice);
 
             glBegin(GL_QUADS);
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a0a4414..7e53955 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -597,8 +597,7 @@ typedef struct PrivateData
     DWORD size;
 } PrivateData;
 
-/* OpenGL ortho matrix setup */
-void d3ddevice_set_ortho(IWineD3DDeviceImpl *This, BOOL dontclip);
+void d3ddevice_set_ortho(IWineD3DDeviceImpl *This);
 
 /*****************************************************************************
  * IWineD3DResource implementation structure




More information about the wine-cvs mailing list