Henri Verbeet : wined3d: Calculate "offset" in the appropriate path in IWineD3DDeviceImpl_UpdateSurface().
Alexandre Julliard
julliard at winehq.org
Tue Mar 30 10:39:46 CDT 2010
Module: wine
Branch: master
Commit: eced5fe8ec16c9bc502f293754774d1763eef004
URL: http://source.winehq.org/git/wine.git/?a=commit;h=eced5fe8ec16c9bc502f293754774d1763eef004
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Tue Mar 30 11:24:47 2010 +0200
wined3d: Calculate "offset" in the appropriate path in IWineD3DDeviceImpl_UpdateSurface().
---
dlls/wined3d/device.c | 40 +++++++++++++++++-----------------------
1 files changed, 17 insertions(+), 23 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 09946c6..4f6e54e 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5161,14 +5161,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
int srcWidth, srcHeight;
unsigned int srcSurfaceWidth, srcSurfaceHeight;
WINED3DFORMAT destFormat, srcFormat;
- int srcLeft, destLeft, destTop;
+ int destLeft, destTop;
WINED3DPOOL srcPool, destPool;
- int offset = 0;
GLenum dummy;
DWORD sampler;
int bpp;
CONVERT_TYPES convert = NO_CONVERSION;
struct wined3d_context *context;
+ const unsigned char *data;
WINED3DSURFACE_DESC winedesc;
@@ -5224,34 +5224,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
/* this needs to be done in lines if the sourceRect != the sourceWidth */
srcWidth = pSourceRect ? pSourceRect->right - pSourceRect->left : srcSurfaceWidth;
srcHeight = pSourceRect ? pSourceRect->bottom - pSourceRect->top : srcSurfaceHeight;
- srcLeft = pSourceRect ? pSourceRect->left : 0;
destLeft = pDestPoint ? pDestPoint->x : 0;
destTop = pDestPoint ? pDestPoint->y : 0;
- if(srcWidth != srcSurfaceWidth || srcLeft ){
- offset += srcLeft * src_format_desc->byte_count;
- /* TODO: do we ever get 3bpp?, would a shift and an add be quicker than a mul (well maybe a cycle or two) */
- }
-
- if(pSourceRect != NULL && pSourceRect->top != 0){
- offset += pSourceRect->top * srcSurfaceWidth * src_format_desc->byte_count;
- }
- TRACE("(%p) glTexSubImage2D, level %d, left %d, top %d, width %d, height %d, fmt %#x, type %#x, memory %p+%#x\n",
- This, dst_impl->texture_level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat,
- dst_format_desc->glType, IWineD3DSurface_GetData(pSourceSurface), offset);
-
- /* Sanity check */
- if (IWineD3DSurface_GetData(pSourceSurface) == NULL) {
-
- /* need to lock the surface to get the data */
- FIXME("Surfaces has no allocated memory, but should be an in memory only surface\n");
- }
+ data = IWineD3DSurface_GetData(pSourceSurface);
+ if (!data) ERR("Source surface has no allocated memory, but should be a sysmem surface.\n");
ENTER_GL();
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);
@@ -5262,6 +5244,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
data += (pSourceRect->left / src_format_desc->block_width) * src_format_desc->block_byte_count;
}
+ TRACE("glCompressedTexSubImage2DARB, target %#x, level %d, x %d, y %d, w %d, h %d, "
+ "format %#x, image_size %#x, data %p.\n", dst_impl->texture_target, dst_impl->texture_level,
+ destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat, row_count * row_length, data);
+
if (row_length == src_pitch)
{
GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
@@ -5286,7 +5272,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
}
else
{
- const unsigned char *data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
+ if (pSourceRect)
+ {
+ data += pSourceRect->top * srcSurfaceWidth * src_format_desc->byte_count;
+ data += pSourceRect->left * src_format_desc->byte_count;
+ }
+
+ TRACE("glTexSubImage2D, target %#x, level %d, x %d, y %d, w %d, h %d, format %#x, type %#x, data %p.\n",
+ dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
+ srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
glPixelStorei(GL_UNPACK_ROW_LENGTH, srcSurfaceWidth);
glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
More information about the wine-cvs
mailing list