Henri Verbeet : wined3d: Try to force a top-left filling convention.

Alexandre Julliard julliard at winehq.org
Wed Aug 19 11:32:35 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Aug 19 10:55:36 2009 +0200

wined3d: Try to force a top-left filling convention.

---

 dlls/d3d9/tests/visual.c |    6 +++---
 dlls/wined3d/state.c     |   33 +++++++++++++++++++++++----------
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index ce53ca9..48fea06 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -8526,7 +8526,7 @@ static void pointsize_test(IDirect3DDevice9 *device)
     color = getPixelColor(device, 64-9, 64-9);
     ok(color == 0x000000ff, "pSize: Pixel (64-9),(64-9) has color 0x%08x, expected 0x000000ff\n", color);
     color = getPixelColor(device, 64-8, 64-8);
-    todo_wine ok(color == 0x00ffffff, "pSize: Pixel (64-8),(64-8) has color 0x%08x, expected 0x00ffffff\n", color);
+    ok(color == 0x00ffffff, "pSize: Pixel (64-8),(64-8) has color 0x%08x, expected 0x00ffffff\n", color);
     color = getPixelColor(device, 64-7, 64-7);
     ok(color == 0x00ffffff, "pSize: Pixel (64-7),(64-7) has color 0x%08x, expected 0x00ffffff\n", color);
     color = getPixelColor(device, 64+7, 64+7);
@@ -8539,7 +8539,7 @@ static void pointsize_test(IDirect3DDevice9 *device)
     color = getPixelColor(device, 128-17, 64-17);
     ok(color == 0x000000ff, "pSize: Pixel (128-17),(64-17) has color 0x%08x, expected 0x000000ff\n", color);
     color = getPixelColor(device, 128-16, 64-16);
-    todo_wine ok(color == 0x00ffffff, "pSize: Pixel (128-16),(64-16) has color 0x%08x, expected 0x00ffffff\n", color);
+    ok(color == 0x00ffffff, "pSize: Pixel (128-16),(64-16) has color 0x%08x, expected 0x00ffffff\n", color);
     color = getPixelColor(device, 128-15, 64-15);
     ok(color == 0x00ffffff, "pSize: Pixel (128-15),(64-15) has color 0x%08x, expected 0x00ffffff\n", color);
     color = getPixelColor(device, 128+15, 64+15);
@@ -8552,7 +8552,7 @@ static void pointsize_test(IDirect3DDevice9 *device)
     color = getPixelColor(device, 192-17, 64-17);
     ok(color == 0x000000ff, "pSize: Pixel (192-17),(64-17) has color 0x%08x, expected 0x000000ff\n", color);
     color = getPixelColor(device, 192-16, 64-16);
-    ok(color == 0x000000ff, "pSize: Pixel (192-16),(64-16) has color 0x%08x, expected 0x000000ff\n", color);
+    todo_wine ok(color == 0x000000ff, "pSize: Pixel (192-16),(64-16) has color 0x%08x, expected 0x000000ff\n", color);
     color = getPixelColor(device, 192-15, 64-15);
     ok(color == 0x00ffffff, "pSize: Pixel (192-15),(64-15) has color 0x%08x, expected 0x00ffffff\n", color);
     color = getPixelColor(device, 192+15, 64+15);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 1448b24..b2f58c8 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3833,8 +3833,9 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
         checkGLcall("glOrtho");
 
         /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */
-        glTranslatef(0.5f, 0.5f, 0.0f);
-        checkGLcall("glTranslatef(0.5f, 0.5f, 0.0f)");
+        glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f);
+        checkGLcall("glTranslatef(63.0f / 128.0f, 63.0f / 128.0f, 0.0f)");
+
         /* D3D texture coordinates are flipped compared to OpenGL ones, so
          * render everything upside down when rendering offscreen. */
         if (context->render_offscreen)
@@ -3880,16 +3881,23 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
          * glScalef(1.0, flip, 2.0);
          */
 
+        /* Translate by slightly less than a half pixel to force a top-left
+         * filling convention. We want the difference to be large enough that
+         * it doesn't get lost due to rounding inside the driver, but small
+         * enough to prevent it from interfering with any anti-aliasing. */
+        GLfloat xoffset = (63.0f / 64.0f) / stateblock->viewport.Width;
+        GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
+
         if (context->render_offscreen)
         {
             /* D3D texture coordinates are flipped compared to OpenGL ones, so
              * render everything upside down when rendering offscreen. */
-            glTranslatef(1.0f / stateblock->viewport.Width, 1.0f / stateblock->viewport.Height, -1.0f);
-            checkGLcall("glTranslatef(1.0f / width, 1.0f / height, -1.0f)");
+            glTranslatef(xoffset, -yoffset, -1.0f);
+            checkGLcall("glTranslatef(xoffset, -yoffset, -1.0f)");
             glScalef(1.0f, -1.0f, 2.0f);
         } else {
-            glTranslatef(1.0f / stateblock->viewport.Width, -1.0f / stateblock->viewport.Height, -1.0f);
-            checkGLcall("glTranslatef(1.0f / width, -1.0f / height, -1.0f)");
+            glTranslatef(xoffset, yoffset, -1.0f);
+            checkGLcall("glTranslatef(xoffset, yoffset, -1.0f)");
             glScalef(1.0f, 1.0f, 2.0f);
         }
         checkGLcall("glScalef");
@@ -4492,9 +4500,11 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s
         /* This sets the shader output position correction constants.
          * TODO: Move to the viewport state
          */
-        if (useVertexShaderFunction) {
+        if (useVertexShaderFunction)
+        {
+            GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
             device->posFixup[1] = context->render_offscreen ? -1.0f : 1.0f;
-            device->posFixup[3] = -device->posFixup[1] / stateblock->viewport.Height;
+            device->posFixup[3] = device->posFixup[1] * yoffset;
         }
     }
 
@@ -4639,8 +4649,11 @@ static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, s
 
 static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
 {
-    stateblock->wineD3DDevice->posFixup[2] = 1.0f / stateblock->viewport.Width;
-    stateblock->wineD3DDevice->posFixup[3] = -stateblock->wineD3DDevice->posFixup[1] / stateblock->viewport.Height;
+    GLfloat yoffset = -(63.0f / 64.0f) / stateblock->viewport.Height;
+
+    stateblock->wineD3DDevice->posFixup[2] = (63.0f / 64.0f) / stateblock->viewport.Width;
+    stateblock->wineD3DDevice->posFixup[3] = stateblock->wineD3DDevice->posFixup[1] * yoffset;
+
     if(!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION))) {
         transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock, context);
     }




More information about the wine-cvs mailing list