Module: wine Branch: master Commit: eb064db0839052165eee0202b3df7ae1f65c344f URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb064db0839052165eee0202b3...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Mar 25 22:51:26 2010 +0100
wined3d: Add support for partial updates of compressed surfaces to IWineD3DDeviceImpl_UpdateSurface().
---
dlls/wined3d/device.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 922b20a..897681d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5262,21 +5262,45 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, ENTER_GL();
/* TODO: Cube and volume support */ - if(rowoffset != 0){ - /* not a whole row so we have to do it a line at a time */ - int j; + if (rowoffset) /* Not a whole row so we have to do it a line at a time. */ + { + if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)); + UINT row_length = (srcWidth / src_format_desc->block_width) * src_format_desc->block_byte_count; + UINT row_count = srcHeight / src_format_desc->block_height; + UINT src_pitch = IWineD3DSurface_GetPitch(pSourceSurface); + UINT y = destTop; + UINT row;
- /* hopefully using pointer addition will be quicker than using a point + j * rowoffset */ - const unsigned char* data =((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset; + data += (pSourceRect->top / src_format_desc->block_height) * src_pitch; + data += (pSourceRect->left / src_format_desc->block_width) * src_format_desc->block_byte_count;
- for (j = destTop; j < (srcHeight + destTop); ++j) - { - glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j, - srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data); - data += rowoffset; + for (row = 0; row < row_count; ++row) + { + GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level, + destLeft, y, srcWidth, src_format_desc->block_height, + dst_format_desc->glInternal, row_length, data)); + y += src_format_desc->block_height; + data += src_pitch; + } + checkGLcall("glCompressedTexSubImage2DARB"); } + else + { + const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset; + unsigned int j;
- } else { /* Full width, so just write out the whole texture */ + for (j = destTop; j < (srcHeight + destTop); ++j) + { + glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j, + srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data); + data += rowoffset; + } + } + } + else /* Full width, so just write out the whole texture. */ + { const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)