Changelog
Correct writing to back buffer in non-ortho mode, and ensure the line stipple is passed correctly to enable proper wireframe support
Jason
Index: dlls/d3d8/device.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/device.c,v retrieving revision 1.84 diff -u -r1.84 device.c --- dlls/d3d8/device.c 3 Oct 2003 03:35:53 -0000 1.84 +++ dlls/d3d8/device.c 28 Oct 2003 21:36:07 -0000 @@ -3121,7 +3121,7 @@ checkGLcall("Disable oldTextureDimensions"); if (This->StateBlock->texture_state[Stage][D3DTSS_COLOROP] != D3DTOP_DISABLE) { glEnable(This->UpdateStateBlock->textureDimensions[Stage]); - checkGLcall("Disable new texture dimensions"); + checkGLcall("glEnable new texture dimensions"); } /* If Alpha arg1 is texture then handle the special case when there changes between a Index: dlls/d3d8/stateblock.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v retrieving revision 1.11 diff -u -r1.11 stateblock.c --- dlls/d3d8/stateblock.c 30 Sep 2003 00:21:07 -0000 1.11 +++ dlls/d3d8/stateblock.c 28 Oct 2003 21:36:08 -0000 @@ -80,7 +80,7 @@ } IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_FILLMODE, D3DFILL_SOLID); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_SHADEMODE, D3DSHADE_GOURAUD); - lp.wRepeatFactor = 0; lp.wLinePattern = 0; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LINEPATTERN, (DWORD) &lp); + lp.wRepeatFactor = 0; lp.wLinePattern = 0; IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LINEPATTERN, *(DWORD *)&lp); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ZWRITEENABLE, TRUE); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_ALPHATESTENABLE, FALSE); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_LASTPIXEL, TRUE); Index: dlls/d3d8/surface.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/surface.c,v retrieving revision 1.25 diff -u -r1.25 surface.c --- dlls/d3d8/surface.c 7 Oct 2003 03:31:46 -0000 1.25 +++ dlls/d3d8/surface.c 28 Oct 2003 21:36:09 -0000 @@ -330,6 +330,44 @@ glPixelZoom(1.0, -1.0); vcheckGLcall("glPixelZoom"); + /* 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 (!This->Device->last_was_rhw) { + + double X, Y, height, width, minZ, maxZ; + This->Device->last_was_rhw = TRUE; + + /* 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 = This->Device->StateBlock->viewport.X; + Y = This->Device->StateBlock->viewport.Y; + height = This->Device->StateBlock->viewport.Height; + width = This->Device->StateBlock->viewport.Width; + minZ = This->Device->StateBlock->viewport.MinZ; + maxZ = This->Device->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 == This->Device->backBuffer) { glDrawBuffer(GL_BACK); } else if (This == This->Device->frontBuffer) {