From e255f971e490cec51eeccde21b5d93d00cbab782 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 11 Jun 2009 10:24:30 +0200 Subject: [PATCH] wined3d: Use the format info to calculate compressed surface size in IWineD3DDeviceImpl_CreateSurface(). --- dlls/wined3d/device.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e6b4681550d..896f0487d4e 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -898,7 +898,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */ unsigned int Size = 1; const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(Format, &GLINFO_LOCATION); - UINT mul_4w, mul_4h; HRESULT hr; TRACE("(%p) Create surface\n",This); @@ -912,24 +911,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, * by the device. *******************************/ - /** DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since - * 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 = (mul_4w * glDesc->byte_count * mul_4h) >> 1; - - } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || - Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 || - Format == WINED3DFMT_ATI2N) { - Size = (mul_4w * glDesc->byte_count * mul_4h); - } else { - /* The pitch is a multiple of 4 bytes */ + } + else if (glDesc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + UINT row_block_count = (Width + glDesc->block_width - 1) / glDesc->block_width; + UINT row_count = (Height + glDesc->block_height - 1) / glDesc->block_height; + Size = row_count * row_block_count * glDesc->block_byte_count; + } + else + { + /* The pitch is a multiple of 4 bytes */ Size = ((Width * glDesc->byte_count) + This->surface_alignment - 1) & ~(This->surface_alignment - 1); Size *= Height; }