Stefan Dösinger : wined3d: Compressed surface sizes are multiples of 4.

Alexandre Julliard julliard at winehq.org
Thu Sep 4 08:27:10 CDT 2008


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Sun Aug 31 23:16:10 2008 -0500

wined3d: Compressed surface sizes are multiples of 4.

Since those surfaces are stored in blocks, the 4 pixel step doesn't only apply to surfaces < 4, but
also to surfaces bigger than that, with a non-multiple-of-4 size.

---

 dlls/wined3d/device.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index b0181fa..735dbc1 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -588,6 +588,7 @@ static HRESULT  WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
     unsigned int Size       = 1;
     const GlPixelFormatDesc *glDesc;
     const StaticPixelFormatDesc *tableEntry = getFormatDescEntry(Format, &GLINFO_LOCATION, &glDesc);
+    UINT mul_4w, mul_4h;
     TRACE("(%p) Create surface\n",This);
     
     /** FIXME: Check ranges on the inputs are valid 
@@ -625,16 +626,18 @@ static HRESULT  WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
      *  it is based around 4x4 pixel blocks it requires padding, so allocate enough
      *  space!
       *********************************/
+    mul_4w = (Width + 3) & ~3;
+    mul_4h = (Height + 3) & ~3;
     if (WINED3DFMT_UNKNOWN == Format) {
         Size = 0;
     } else if (Format == WINED3DFMT_DXT1) {
         /* DXT1 is half byte per pixel */
-       Size = ((max(Width,4) * tableEntry->bpp) * max(Height,4)) >> 1;
+        Size = (mul_4w * tableEntry->bpp * mul_4h) >> 1;
 
     } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 ||
                Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 ||
                Format == WINED3DFMT_ATI2N) {
-       Size = ((max(Width,4) * tableEntry->bpp) * max(Height,4));
+        Size = (mul_4w * tableEntry->bpp * mul_4h);
     } else {
        /* The pitch is a multiple of 4 bytes */
         Size = ((Width * tableEntry->bpp) + This->surface_alignment - 1) & ~(This->surface_alignment - 1);




More information about the wine-cvs mailing list