From 9b5f5de9e9efd6a0c0f53806c0f4b5890c84f98b Mon Sep 17 00:00:00 2001 From: Masanori Kakura Date: Wed, 28 Dec 2016 22:21:02 +0900 Subject: [PATCH] st/nine: Don't call u_box_union_* when dirty region is empty When dirty region is empty, u_box_union_* incorrectly expands the new region. This fixes broken font rendering issue in WOLF RPG Editor v2.10 games. Signed-off-by: Masanori Kakura Reviewed-by: Axel Davy --- src/gallium/state_trackers/nine/cubetexture9.c | 12 ++++++++---- src/gallium/state_trackers/nine/texture9.c | 10 +++++++--- src/gallium/state_trackers/nine/volumetexture9.c | 10 +++++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/gallium/state_trackers/nine/cubetexture9.c b/src/gallium/state_trackers/nine/cubetexture9.c index 977a345552b..65251ad2b7e 100644 --- a/src/gallium/state_trackers/nine/cubetexture9.c +++ b/src/gallium/state_trackers/nine/cubetexture9.c @@ -285,10 +285,14 @@ NineCubeTexture9_AddDirtyRect( struct NineCubeTexture9 *This, This->base.base.info.height0, &This->dirty_rect[FaceType]); } else { - struct pipe_box box; - rect_to_pipe_box_clamp(&box, pDirtyRect); - u_box_union_2d(&This->dirty_rect[FaceType], &This->dirty_rect[FaceType], - &box); + if (This->dirty_rect[FaceType].width == 0) { + rect_to_pipe_box_clamp(&This->dirty_rect[FaceType], pDirtyRect); + } else { + struct pipe_box box; + rect_to_pipe_box_clamp(&box, pDirtyRect); + u_box_union_2d(&This->dirty_rect[FaceType], &This->dirty_rect[FaceType], + &box); + } (void) u_box_clip_2d(&This->dirty_rect[FaceType], &This->dirty_rect[FaceType], This->base.base.info.width0, diff --git a/src/gallium/state_trackers/nine/texture9.c b/src/gallium/state_trackers/nine/texture9.c index bf054cc3059..78ca4add4ae 100644 --- a/src/gallium/state_trackers/nine/texture9.c +++ b/src/gallium/state_trackers/nine/texture9.c @@ -330,9 +330,13 @@ NineTexture9_AddDirtyRect( struct NineTexture9 *This, u_box_origin_2d(This->base.base.info.width0, This->base.base.info.height0, &This->dirty_rect); } else { - struct pipe_box box; - rect_to_pipe_box_clamp(&box, pDirtyRect); - u_box_union_2d(&This->dirty_rect, &This->dirty_rect, &box); + if (This->dirty_rect.width == 0) { + rect_to_pipe_box_clamp(&This->dirty_rect, pDirtyRect); + } else { + struct pipe_box box; + rect_to_pipe_box_clamp(&box, pDirtyRect); + u_box_union_2d(&This->dirty_rect, &This->dirty_rect, &box); + } (void) u_box_clip_2d(&This->dirty_rect, &This->dirty_rect, This->base.base.info.width0, This->base.base.info.height0); diff --git a/src/gallium/state_trackers/nine/volumetexture9.c b/src/gallium/state_trackers/nine/volumetexture9.c index 5c83fdb60ce..c836dd21023 100644 --- a/src/gallium/state_trackers/nine/volumetexture9.c +++ b/src/gallium/state_trackers/nine/volumetexture9.c @@ -222,9 +222,13 @@ NineVolumeTexture9_AddDirtyBox( struct NineVolumeTexture9 *This, This->dirty_box.height = This->base.base.info.height0; This->dirty_box.depth = This->base.base.info.depth0; } else { - struct pipe_box box; - d3dbox_to_pipe_box(&box, pDirtyBox); - u_box_union_3d(&This->dirty_box, &This->dirty_box, &box); + if (This->dirty_box.width == 0) { + d3dbox_to_pipe_box(&This->dirty_box, pDirtyBox); + } else { + struct pipe_box box; + d3dbox_to_pipe_box(&box, pDirtyBox); + u_box_union_3d(&This->dirty_box, &This->dirty_box, &box); + } This->dirty_box.x = MAX2(This->dirty_box.x, 0); This->dirty_box.y = MAX2(This->dirty_box.y, 0); This->dirty_box.z = MAX2(This->dirty_box.z, 0);