Module: wine Branch: master Commit: 9dea6f7de5cf5161825f24b6b33f2e0e15b83ab0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9dea6f7de5cf5161825f24b6b3...
Author: Nick Burns adger44@hotmail.com Date: Mon Dec 22 06:08:10 2008 -0800
wined3d: Fix glReadPixels call from read_from_framebuffer.
---
dlls/wined3d/surface.c | 35 +++++++++++++++++++++++++++++++++-- 1 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 0eedf23..67097ac 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -691,6 +691,9 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v BOOL bpp; RECT local_rect; BOOL srcIsUpsideDown; + GLint rowLen = 0; + GLint skipPix = 0; + GLint skipRow = 0;
if(wined3d_settings.rendertargetlock_mode == RTL_DISABLE) { static BOOL warned = FALSE; @@ -786,14 +789,42 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v if(This->Flags & SFLAG_PBO) { GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); checkGLcall("glBindBufferARB"); + if(mem != NULL) { + ERR("mem not null for pbo -- unexpected\n"); + mem = NULL; + } }
- glReadPixels(local_rect.left, local_rect.top, + /* Save old pixel store pack state */ + glGetIntegerv(GL_PACK_ROW_LENGTH, &rowLen); + checkGLcall("glIntegerv"); + glGetIntegerv(GL_PACK_SKIP_PIXELS, &skipPix); + checkGLcall("glIntegerv"); + glGetIntegerv(GL_PACK_SKIP_ROWS, &skipRow); + checkGLcall("glIntegerv"); + + /* Setup pixel store pack state -- to glReadPixels into the correct place */ + glPixelStorei(GL_PACK_ROW_LENGTH, This->currentDesc.Width); + checkGLcall("glPixelStorei"); + glPixelStorei(GL_PACK_SKIP_PIXELS, local_rect.left); + checkGLcall("glPixelStorei"); + glPixelStorei(GL_PACK_SKIP_ROWS, local_rect.top); + checkGLcall("glPixelStorei"); + + glReadPixels(local_rect.left, (!srcIsUpsideDown) ? (This->currentDesc.Height - local_rect.bottom) : local_rect.top , local_rect.right - local_rect.left, local_rect.bottom - local_rect.top, fmt, type, mem); checkGLcall("glReadPixels");
+ /* Reset previous pixel store pack state */ + glPixelStorei(GL_PACK_ROW_LENGTH, rowLen); + checkGLcall("glPixelStorei"); + glPixelStorei(GL_PACK_SKIP_PIXELS, skipPix); + checkGLcall("glPixelStorei"); + glPixelStorei(GL_PACK_SKIP_ROWS, skipRow); + checkGLcall("glPixelStorei"); + if(This->Flags & SFLAG_PBO) { GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); checkGLcall("glBindBufferARB"); @@ -828,7 +859,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v }
top = mem + pitch * local_rect.top; - bottom = mem + pitch * ( local_rect.bottom - local_rect.top - 1); + bottom = mem + pitch * (local_rect.bottom - 1); for(i = 0; i < (local_rect.bottom - local_rect.top) / 2; i++) { memcpy(row, top + off, len); memcpy(top + off, bottom + off, len);