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