DXTn format has odd mipmap levels in that the space allocated for

small levels needs a lot of padding.
This commit is contained in:
Jason Edmeades 2003-09-19 04:02:35 +00:00 committed by Alexandre Julliard
parent 7ac9d258c3
commit ce85a90538
1 changed files with 7 additions and 1 deletions

View File

@ -853,8 +853,14 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface
object->myDesc.Usage = 0; object->myDesc.Usage = 0;
object->myDesc.Pool = D3DPOOL_SYSTEMMEM; object->myDesc.Pool = D3DPOOL_SYSTEMMEM;
object->bytesPerPixel = D3DFmtGetBpp(This, Format); object->bytesPerPixel = D3DFmtGetBpp(This, Format);
/* 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! */
if (Format == D3DFMT_DXT1) { if (Format == D3DFMT_DXT1) {
object->myDesc.Size = ((Width * object->bytesPerPixel) * Height) / 2; /* DXT1 is half byte per pixel */ object->myDesc.Size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4)) / 2; /* DXT1 is half byte per pixel */
} else if (Format == D3DFMT_DXT2 || Format == D3DFMT_DXT3 ||
Format == D3DFMT_DXT4 || Format == D3DFMT_DXT5) {
object->myDesc.Size = ((max(Width,4) * object->bytesPerPixel) * max(Height,4));
} else { } else {
object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->myDesc.Size = (Width * object->bytesPerPixel) * Height;
} }