From 7c8e1596d6ef12c27ffe713b173023b1e38e52cb Mon Sep 17 00:00:00 2001 From: David Rosca Date: Thu, 27 Jul 2023 13:22:18 +0200 Subject: [PATCH] gallium/auxiliary: Fix util_compute_blit half texel offset with scaling Video textures include padding, so make sure to not sample outside src rect. Also remove the parameter and always use the offset. When not scaling, this fixes blurry output. When scaling, this fixes incorrect color at right/bottom edge. Acked-by: Leo Liu Reviewed-by: Thong Thai Part-of: --- src/gallium/auxiliary/util/u_compute.c | 16 +++++++++++----- src/gallium/auxiliary/util/u_compute.h | 2 +- src/gallium/frontends/va/postproc.c | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/gallium/auxiliary/util/u_compute.c b/src/gallium/auxiliary/util/u_compute.c index 9670eabc712..df00df52585 100644 --- a/src/gallium/auxiliary/util/u_compute.c +++ b/src/gallium/auxiliary/util/u_compute.c @@ -48,13 +48,16 @@ static void *blit_compute_shader(struct pipe_context *ctx) "DCL IMAGE[0], 2D_ARRAY, PIPE_FORMAT_R32G32B32A32_FLOAT, WR\n" "DCL SAMP[0]\n" "DCL SVIEW[0], 2D_ARRAY, FLOAT\n" - "DCL CONST[0][0..2]\n" // 0:xyzw 1:xyzw + "DCL CONST[0][0..3]\n" // 0:xyzw 1:xyzw "DCL TEMP[0..4], LOCAL\n" "IMM[0] UINT32 {64, 1, 0, 0}\n" + "IMM[1] FLT32 {0.5, 0, 0, 0}\n" "UMAD TEMP[0].xyz, SV[1].xyzz, IMM[0].xyyy, SV[0].xyzz\n" "U2F TEMP[1].xyz, TEMP[0]\n" + "ADD TEMP[1].xy, TEMP[1].xyyy, IMM[1].xxxx\n" "MAD TEMP[2].xyz, TEMP[1], CONST[0][1], CONST[0][0]\n" + "MIN TEMP[2].xy, TEMP[2].xyyy, CONST[0][3].xyyy\n" "TEX_LZ TEMP[3], TEMP[2], SAMP[0], 2D_ARRAY\n" "UADD TEMP[4].xyz, TEMP[0], CONST[0][2]\n" "STORE IMAGE[0], TEMP[4], TEMP[3], 2D_ARRAY, PIPE_FORMAT_R32G32B32A32_FLOAT\n" @@ -75,7 +78,7 @@ static void *blit_compute_shader(struct pipe_context *ctx) } void util_compute_blit(struct pipe_context *ctx, struct pipe_blit_info *blit_info, - void **compute_state, bool half_texel_offset) + void **compute_state) { if (blit_info->src.box.width == 0 || blit_info->src.box.height == 0 || blit_info->dst.box.width == 0 || blit_info->dst.box.height == 0) @@ -90,10 +93,9 @@ void util_compute_blit(struct pipe_context *ctx, struct pipe_blit_info *blit_inf float x_scale = blit_info->src.box.width / (float)blit_info->dst.box.width; float y_scale = blit_info->src.box.height / (float)blit_info->dst.box.height; float z_scale = blit_info->src.box.depth / (float)blit_info->dst.box.depth; - float offset = half_texel_offset ? 0.5 : 0.0; - unsigned data[] = {u_bitcast_f2u((blit_info->src.box.x + offset) / (float)src->width0), - u_bitcast_f2u((blit_info->src.box.y + offset) / (float)src->height0), + unsigned data[] = {u_bitcast_f2u(blit_info->src.box.x / (float)src->width0), + u_bitcast_f2u(blit_info->src.box.y / (float)src->height0), u_bitcast_f2u(blit_info->src.box.z), u_bitcast_f2u(0), u_bitcast_f2u(x_scale / src->width0), @@ -103,6 +105,10 @@ void util_compute_blit(struct pipe_context *ctx, struct pipe_blit_info *blit_inf blit_info->dst.box.x, blit_info->dst.box.y, blit_info->dst.box.z, + 0, + u_bitcast_f2u((blit_info->src.box.width - 0.5) / (float)src->width0), + u_bitcast_f2u((blit_info->src.box.height - 0.5) / (float)src->height0), + 0, 0}; struct pipe_constant_buffer cb = {0}; diff --git a/src/gallium/auxiliary/util/u_compute.h b/src/gallium/auxiliary/util/u_compute.h index 4a6c66e0ef4..8c2866af8d4 100644 --- a/src/gallium/auxiliary/util/u_compute.h +++ b/src/gallium/auxiliary/util/u_compute.h @@ -36,7 +36,7 @@ extern "C" { #endif void util_compute_blit(struct pipe_context *ctx, struct pipe_blit_info *blit_info, - void **compute_state, bool half_texel_offset); + void **compute_state); #ifdef __cplusplus } diff --git a/src/gallium/frontends/va/postproc.c b/src/gallium/frontends/va/postproc.c index d5cdfb77c45..b8e7dedfcff 100644 --- a/src/gallium/frontends/va/postproc.c +++ b/src/gallium/frontends/va/postproc.c @@ -354,7 +354,7 @@ static VAStatus vlVaPostProcBlit(vlVaDriver *drv, vlVaContext *context, if (drv->pipe->screen->get_param(drv->pipe->screen, PIPE_CAP_PREFER_COMPUTE_FOR_MULTIMEDIA)) - util_compute_blit(drv->pipe, &blit, &context->blit_cs, !drv->compositor.deinterlace); + util_compute_blit(drv->pipe, &blit, &context->blit_cs); else drv->pipe->blit(drv->pipe, &blit); }