Module: wine Branch: master Commit: 424e9c3e08367da1bb8b1472771e82e5bbd898b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=424e9c3e08367da1bb8b147277...
Author: Roderick Colenbrander thunderbird2k@gmx.net Date: Tue Feb 5 10:15:46 2008 +0100
wined3d: Allow read back of P8 surfaces. This fixes some of the redrawing issues in Red Alert.
---
dlls/wined3d/surface.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 6cc3b5a..d6ce92f 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -55,7 +55,8 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { return; }
- if(This->Flags & SFLAG_CONVERTED) { + /* Only support read back of converted P8 surfaces */ + if(This->Flags & SFLAG_CONVERTED && (This->resource.format != WINED3DFMT_P8)) { FIXME("Read back converted textures unsupported, format=%s\n", debug_d3dformat(This->resource.format)); return; } @@ -86,9 +87,17 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { LEAVE_GL(); } else { void *mem; + GLenum format = This->glDescription.glFormat; + GLenum type = This->glDescription.glType; int src_pitch = 0; int dst_pitch = 0;
+ /* In case of P8 the index is stored in the alpha component if the primary render target uses P8 */ + if(This->resource.format == WINED3DFMT_P8) { + format = GL_ALPHA; + type = GL_UNSIGNED_BYTE; + } + if (This->Flags & SFLAG_NONPOW2) { unsigned char alignment = This->resource.wineD3DDevice->surface_alignment; src_pitch = This->bytesPerPixel * This->pow2Width; @@ -100,21 +109,21 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { }
TRACE("(%p) : Calling glGetTexImage level %d, format %#x, type %#x, data %p\n", This, This->glDescription.level, - This->glDescription.glFormat, This->glDescription.glType, mem); + format, type, mem);
if(This->Flags & SFLAG_PBO) { GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); checkGLcall("glBindBufferARB");
- glGetTexImage(This->glDescription.target, This->glDescription.level, This->glDescription.glFormat, - This->glDescription.glType, NULL); + glGetTexImage(This->glDescription.target, This->glDescription.level, format, + type, NULL); checkGLcall("glGetTexImage()");
GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); checkGLcall("glBindBufferARB"); } else { - glGetTexImage(This->glDescription.target, This->glDescription.level, This->glDescription.glFormat, - This->glDescription.glType, mem); + glGetTexImage(This->glDescription.target, This->glDescription.level, format, + type, mem); checkGLcall("glGetTexImage()"); } LEAVE_GL();