[PATCH 4/5] wined3d: Set GL_UNPACK_ALIGNMENT to 1 when uploading surfaces from user memory.

Matteo Bruni mbruni at codeweavers.com
Tue Feb 10 13:14:51 CST 2015


The device surface alignment does not apply to user-memory surfaces.

Together with the previous patch this fixes bug 36090... except that I
can't reproduce the issue anymore, probably worked around by a game update.
---
 dlls/wined3d/surface.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3428535..b0963ea 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1543,6 +1543,7 @@ void wined3d_surface_upload_data(struct wined3d_surface *surface, const struct w
     else
     {
         const BYTE *addr = data->addr;
+        unsigned int surface_alignment = surface->resource.device->surface_alignment;
 
         addr += src_rect->top * src_pitch;
         addr += src_rect->left * format->byte_count;
@@ -1552,8 +1553,12 @@ void wined3d_surface_upload_data(struct wined3d_surface *surface, const struct w
                 update_w, update_h, format->glFormat, format->glType, addr);
 
         gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_pitch / format->byte_count);
+        if (src_pitch & (surface_alignment - 1))
+            gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
         gl_info->gl_ops.gl.p_glTexSubImage2D(surface->texture_target, surface->texture_level,
                 dst_point->x, dst_point->y, update_w, update_h, format->glFormat, format->glType, addr);
+        if (src_pitch & (surface_alignment - 1))
+            gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ALIGNMENT, surface_alignment);
         gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
         checkGLcall("glTexSubImage2D");
     }
-- 
2.0.5




More information about the wine-patches mailing list