Module: wine Branch: master Commit: b8a5f8098ba07731d0e1b98d869cc54a00fbb5df URL: https://source.winehq.org/git/wine.git/?a=commit;h=b8a5f8098ba07731d0e1b98d8...
Author: Jan Sikorski jsikorski@codeweavers.com Date: Wed Mar 10 15:10:43 2021 +0100
wined3d: Check slice pitch against its size in wined3d_format_copy_data().
If they don't match and there's more than one slice to copy, we can't use a single memcpy. Fixes blinking objects in Hellblade: Senua's Sacrifice.
Signed-off-by: Jan Sikorski jsikorski@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/utils.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 9df51872d42..1e1c899523d 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5981,17 +5981,19 @@ void wined3d_format_copy_data(const struct wined3d_format *format, const uint8_t unsigned int dst_slice_pitch, unsigned int w, unsigned int h, unsigned int d) { unsigned int row_block_count, row_count, row_size, slice, row; - unsigned int slice_count = d; + unsigned int slice_count = d, slice_size; const uint8_t *src_row; uint8_t *dst_row;
row_block_count = (w + format->block_width - 1) / format->block_width; row_count = (h + format->block_height - 1) / format->block_height; row_size = row_block_count * format->block_byte_count; + slice_size = row_size * row_count;
- if (src_row_pitch == row_size && dst_row_pitch == row_size && src_slice_pitch == dst_slice_pitch) + if (src_row_pitch == row_size && dst_row_pitch == row_size + && ((src_slice_pitch == slice_size && dst_slice_pitch == slice_size) || slice_count == 1)) { - memcpy(dst, src, slice_count * row_count * row_size); + memcpy(dst, src, slice_count * slice_size); return; }