Stefan Dösinger : wined3d: DDraw surfaces are QWORD aligned.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 14 07:47:04 CDT 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Fri Jun  8 22:28:04 2007 +0200

wined3d: DDraw surfaces are QWORD aligned.

---

 dlls/wined3d/context.c         |    8 ++++----
 dlls/wined3d/device.c          |    2 +-
 dlls/wined3d/directx.c         |    6 ++++++
 dlls/wined3d/surface.c         |   15 +++++++++------
 dlls/wined3d/wined3d_private.h |    4 +---
 5 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index ee9e96e..5570225 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -347,10 +347,10 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
     glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
     checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);");
 
-    glPixelStorei(GL_PACK_ALIGNMENT, SURFACE_ALIGNMENT);
-    checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, SURFACE_ALIGNMENT);");
-    glPixelStorei(GL_UNPACK_ALIGNMENT, SURFACE_ALIGNMENT);
-    checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, SURFACE_ALIGNMENT);");
+    glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);
+    checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);");
+    glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);
+    checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);");
 
     if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
         /* Most textures will use client storage if supported. Exceptions are non-native power of 2 textures
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 2703d7b..9dc7f28 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -674,7 +674,7 @@ static HRESULT  WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
        Size = ((max(Width,4) * tableEntry->bpp) * max(Height,4));
     } else {
        /* The pitch is a multiple of 4 bytes */
-       Size = ((Width * tableEntry->bpp) + SURFACE_ALIGNMENT - 1) & ~(SURFACE_ALIGNMENT - 1);
+        Size = ((Width * tableEntry->bpp) + This->surface_alignment - 1) & ~(This->surface_alignment - 1);
        Size *= Height;
     }
 
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5d14fde..742e16b 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2462,6 +2462,12 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
     IWineD3D_AddRef(object->wineD3D);
     object->parent  = parent;
 
+    if(This->dxVersion == 7) {
+        object->surface_alignment = 8;
+    } else {
+        object->surface_alignment = 4;
+    }
+
     /* Set the state up as invalid until the device is fully created */
     object->state   = WINED3DERR_DRIVERINTERNALERROR;
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 6398e77..4640bef 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -79,9 +79,10 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
          }
 
         if (This->Flags & SFLAG_NONPOW2) {
+            unsigned char alignment = This->resource.wineD3DDevice->surface_alignment;
             src_pitch = This->bytesPerPixel * This->pow2Width;
             dst_pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *) This);
-            src_pitch = (src_pitch + SURFACE_ALIGNMENT - 1) & ~(SURFACE_ALIGNMENT - 1);
+            src_pitch = (src_pitch + alignment - 1) & ~(alignment - 1);
             mem = HeapAlloc(GetProcessHeap(), 0, src_pitch * This->pow2Height);
         } else {
             mem = This->resource.allocatedMemory;
@@ -1320,7 +1321,8 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) {
         }
 
         b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-        b_info->bmiHeader.biWidth = This->currentDesc.Width;
+        /* TODO: Is there a nicer way to force a specific alignment? (8 byte for ddraw) */
+        b_info->bmiHeader.biWidth = IWineD3DSurface_GetPitch(iface) / This->bytesPerPixel;
         b_info->bmiHeader.biHeight = -This->currentDesc.Height -extraline;
         b_info->bmiHeader.biSizeImage = ( This->currentDesc.Height + extraline) * IWineD3DSurface_GetPitch(iface);
         b_info->bmiHeader.biPlanes = 1;
@@ -1978,7 +1980,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO
 
         /* Stick to the alignment for the converted surface too, makes it easier to load the surface */
         outpitch = width * bpp;
-        outpitch = (outpitch + SURFACE_ALIGNMENT - 1) & ~(SURFACE_ALIGNMENT - 1);
+        outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
 
         mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
         if(!mem) {
@@ -2264,7 +2266,8 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORM
                format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) {
         This->resource.size = ((max(This->pow2Width, 4) * formatEntry->bpp) * max(This->pow2Height, 4));
     } else {
-        This->resource.size = ((This->pow2Width * formatEntry->bpp) + SURFACE_ALIGNMENT - 1) & ~(SURFACE_ALIGNMENT - 1);
+        unsigned char alignment = This->resource.wineD3DDevice->surface_alignment;
+        This->resource.size = ((This->pow2Width * formatEntry->bpp) + alignment - 1) & ~(alignment - 1);
         This->resource.size *= This->pow2Height;
     }
 
@@ -3483,9 +3486,9 @@ DWORD WINAPI IWineD3DSurfaceImpl_GetPitch(IWineD3DSurface *iface) {
              This->resource.format == WINED3DFMT_DXT4 || This->resource.format == WINED3DFMT_DXT5) /* DXT2/3/4/5 is 16 bytes per block */
         ret = ((This->currentDesc.Width + 3) >> 2) << 4;
     else {
+        unsigned char alignment = This->resource.wineD3DDevice->surface_alignment;
         ret = This->bytesPerPixel * This->currentDesc.Width;  /* Bytes / row */
-        /* Surfaces are 32 bit aligned */
-        ret = (ret + SURFACE_ALIGNMENT - 1) & ~(SURFACE_ALIGNMENT - 1);
+        ret = (ret + alignment - 1) & ~(alignment - 1);
     }
     TRACE("(%p) Returning %d\n", This, ret);
     return ret;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index de38042..8549232 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -647,6 +647,7 @@ struct IWineD3DDeviceImpl
     BOOL                    view_ident;        /* true iff view matrix is identity                */
     BOOL                    untransformed;
     BOOL                    vertexBlendUsed;   /* To avoid needless setting of the blend matrices */
+    unsigned char           surface_alignment; /* Line Alignment of surfaces                      */
 
     /* State block related */
     BOOL                    isRecordingState;
@@ -1184,9 +1185,6 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DCl
 
 BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]);
 
-/* Alignment of the pitch */
-#define SURFACE_ALIGNMENT 4
-
 /*****************************************************************************
  * IWineD3DVertexDeclaration implementation structure
  */




More information about the wine-cvs mailing list