Module: Mesa Branch: main Commit: 40487b8e146c865b077457fe7f0b4ac3cdcb3f67 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=40487b8e146c865b077457fe7f0b4ac3cdcb3f67
Author: David Rosca <[email protected]> Date: Sun Sep 3 09:40:05 2023 +0200 gallium/auxiliary/vl: Fix YUV to RGB bob compute shader deinterlacing This reverts commit ef0d92459c3f and instead removes the y coordinate divide by two in weave shaders. The scale ratio now works correctly with interlaced input. Also remove the YUV to YUV bob shader and reuse the progressive shader for bob deinterlacing, same as in YUV to RGB case (video_buffer shader). Acked-by: Leo Liu <[email protected]> Reviewed-by: Thong Thai <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25258> --- src/gallium/auxiliary/vl/vl_compositor.c | 7 +- src/gallium/auxiliary/vl/vl_compositor.h | 4 - src/gallium/auxiliary/vl/vl_compositor_cs.c | 179 ++++------------------------ 3 files changed, 22 insertions(+), 168 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 42285d1b61c..ebb88fd4d34 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -330,7 +330,6 @@ set_yuv_layer(struct vl_compositor_state *s, struct vl_compositor *c, assert(layer < VL_COMPOSITOR_MAX_LAYERS); - s->interlaced = buffer->interlaced; s->used_layers |= 1 << layer; sampler_views = buffer->get_sampler_view_components(buffer); for (i = 0; i < 3; ++i) { @@ -352,7 +351,7 @@ set_yuv_layer(struct vl_compositor_state *s, struct vl_compositor *c, if (c->pipe_gfx_supported) s->layers[layer].fs = (y) ? c->fs_yuv.bob.y : c->fs_yuv.bob.uv; if (c->pipe_cs_composit_supported) - s->layers[layer].cs = (y) ? c->cs_yuv.bob.y : c->cs_yuv.bob.uv; + s->layers[layer].cs = (y) ? c->cs_yuv.progressive.y : c->cs_yuv.progressive.uv; break; case VL_COMPOSITOR_BOB_BOTTOM: @@ -362,7 +361,7 @@ set_yuv_layer(struct vl_compositor_state *s, struct vl_compositor *c, if (c->pipe_gfx_supported) s->layers[layer].fs = (y) ? c->fs_yuv.bob.y : c->fs_yuv.bob.uv; if (c->pipe_cs_composit_supported) - s->layers[layer].cs = (y) ? c->cs_yuv.bob.y : c->cs_yuv.bob.uv; + s->layers[layer].cs = (y) ? c->cs_yuv.progressive.y : c->cs_yuv.progressive.uv; break; case VL_COMPOSITOR_NONE: @@ -443,7 +442,6 @@ vl_compositor_clear_layers(struct vl_compositor_state *s) unsigned i, j; assert(s); - s->interlaced = false; s->used_layers = 0; for ( i = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) { struct vertex4f v_one = { 1.0f, 1.0f, 1.0f, 1.0f }; @@ -563,7 +561,6 @@ vl_compositor_set_buffer_layer(struct vl_compositor_state *s, assert(layer < VL_COMPOSITOR_MAX_LAYERS); - s->interlaced = buffer->interlaced; s->used_layers |= 1 << layer; sampler_views = buffer->get_sampler_view_components(buffer); for (i = 0; i < 3; ++i) { diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 8966e032cde..c8f2515d5ea 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -159,10 +159,6 @@ struct vl_compositor void *y; void *uv; } weave; - struct { - void *y; - void *uv; - } bob; struct { void *y; void *uv; diff --git a/src/gallium/auxiliary/vl/vl_compositor_cs.c b/src/gallium/auxiliary/vl/vl_compositor_cs.c index 5889f93a72b..dec2b9c8f2b 100644 --- a/src/gallium/auxiliary/vl/vl_compositor_cs.c +++ b/src/gallium/auxiliary/vl/vl_compositor_cs.c @@ -156,32 +156,25 @@ const char *compute_shader_weave = /* Translate */ "UADD TEMP[2].xy, TEMP[2].xyyy, -CONST[5].xyxy\n" - "U2F TEMP[2].xy, TEMP[2].xyyy\n" + /* Top Y */ + "U2F TEMP[2], TEMP[2]\n" + /* Down Y */ + "MOV TEMP[12], TEMP[2]\n" /* Top UV */ - "MOV TEMP[3].xy, TEMP[2].xyyy\n" + "MOV TEMP[3], TEMP[2]\n" /* Chroma offset */ "ADD TEMP[3].xy, TEMP[3].xyyy, CONST[8].xyxy\n" - "DIV TEMP[3].xy, TEMP[3], IMM[1].yyyy\n" - "DIV TEMP[3].y, TEMP[3].yyyy, IMM[1].yyyy\n" + "DIV TEMP[3].xy, TEMP[3].xyyy, IMM[1].yyyy\n" /* Down UV */ - "MOV TEMP[13].xy, TEMP[3].xyyy\n" - - /* Top Y */ - "DIV TEMP[2].y, TEMP[2].yyyy, IMM[1].yyyy\n" - /* Down Y */ - "MOV TEMP[12].xy, TEMP[2].xyyy\n" + "MOV TEMP[13], TEMP[3]\n" /* Texture offset */ - "ADD TEMP[2].x, TEMP[2].xxxx, IMM[3].yyyy\n" - "ADD TEMP[2].y, TEMP[2].yyyy, IMM[3].xxxx\n" - "ADD TEMP[12].x, TEMP[12].xxxx, IMM[3].yyyy\n" - "ADD TEMP[12].y, TEMP[12].yyyy, IMM[3].xxxx\n" + "ADD TEMP[2].xy, TEMP[2].xyyy, IMM[3].yyyy\n" + "ADD TEMP[12].xy, TEMP[12].xyyy, IMM[3].yyyy\n" - "ADD TEMP[3].x, TEMP[3].xxxx, IMM[3].yyyy\n" - "ADD TEMP[3].y, TEMP[3].yyyy, IMM[3].xxxx\n" - "ADD TEMP[13].x, TEMP[13].xxxx, IMM[3].yyyy\n" - "ADD TEMP[13].y, TEMP[13].yyyy, IMM[3].xxxx\n" + "ADD TEMP[3].xy, TEMP[3].xyyy, IMM[3].xxxx\n" + "ADD TEMP[13].xy, TEMP[13].xyyy, IMM[3].xxxx\n" /* Scale */ "DIV TEMP[2].xy, TEMP[2].xyyy, CONST[3].zwzw\n" @@ -329,7 +322,6 @@ static const char *compute_shader_yuv_weave_y = /* Top Y */ "U2F TEMP[2], TEMP[2]\n" - "DIV TEMP[2].y, TEMP[2].yyyy, IMM[1].yyyy\n" /* Down Y */ "MOV TEMP[12], TEMP[2]\n" @@ -340,15 +332,11 @@ static const char *compute_shader_yuv_weave_y = "MOV TEMP[13], TEMP[3]\n" /* Texture offset */ - "ADD TEMP[2].x, TEMP[2].xxxx, IMM[3].yyyy\n" - "ADD TEMP[2].y, TEMP[2].yyyy, IMM[3].xxxx\n" - "ADD TEMP[12].x, TEMP[12].xxxx, IMM[3].yyyy\n" - "ADD TEMP[12].y, TEMP[12].yyyy, IMM[3].xxxx\n" + "ADD TEMP[2].xy, TEMP[2].xyyy, IMM[3].yyyy\n" + "ADD TEMP[12].xy, TEMP[12].xyyy, IMM[3].yyyy\n" - "ADD TEMP[3].x, TEMP[3].xxxx, IMM[3].xxxx\n" - "ADD TEMP[3].y, TEMP[3].yyyy, IMM[3].wwww\n" - "ADD TEMP[13].x, TEMP[13].xxxx, IMM[3].xxxx\n" - "ADD TEMP[13].y, TEMP[13].yyyy, IMM[3].wwww\n" + "ADD TEMP[3].xy, TEMP[3].xyyy, IMM[3].xxxx\n" + "ADD TEMP[13].xy, TEMP[13].xyyy, IMM[3].xxxx\n" /* Scale */ "DIV TEMP[2].xy, TEMP[2], CONST[3].zwzw\n" @@ -441,7 +429,6 @@ static const char *compute_shader_yuv_weave_uv = /* Top Y */ "U2F TEMP[2], TEMP[2]\n" - "DIV TEMP[2].y, TEMP[2].yyyy, IMM[1].yyyy\n" /* Down Y */ "MOV TEMP[12], TEMP[2]\n" @@ -452,15 +439,11 @@ static const char *compute_shader_yuv_weave_uv = "MOV TEMP[13], TEMP[3]\n" /* Texture offset */ - "ADD TEMP[2].x, TEMP[2].xxxx, IMM[3].yyyy\n" - "ADD TEMP[2].y, TEMP[2].yyyy, IMM[3].xxxx\n" - "ADD TEMP[12].x, TEMP[12].xxxx, IMM[3].yyyy\n" - "ADD TEMP[12].y, TEMP[12].yyyy, IMM[3].xxxx\n" + "ADD TEMP[2].xy, TEMP[2].xyyy, IMM[3].yyyy\n" + "ADD TEMP[12].xy, TEMP[12].xyyy, IMM[3].yyyy\n" - "ADD TEMP[3].x, TEMP[3].xxxx, IMM[3].xxxx\n" - "ADD TEMP[3].y, TEMP[3].yyyy, IMM[3].wwww\n" - "ADD TEMP[13].x, TEMP[13].xxxx, IMM[3].xxxx\n" - "ADD TEMP[13].y, TEMP[13].yyyy, IMM[3].wwww\n" + "ADD TEMP[3].xy, TEMP[3].xyyy, IMM[3].xxxx\n" + "ADD TEMP[13].xy, TEMP[13].xyyy, IMM[3].xxxx\n" /* Scale */ "DIV TEMP[2].xy, TEMP[2], CONST[3].zwzw\n" @@ -518,120 +501,6 @@ static const char *compute_shader_yuv_weave_uv = "END\n"; -static const char *compute_shader_yuv_bob_y = - "COMP\n" - "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n" - "PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n" - "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n" - - "DCL SV[0], THREAD_ID\n" - "DCL SV[1], BLOCK_ID\n" - - "DCL CONST[0..7]\n" - "DCL SVIEW[0..2], RECT, FLOAT\n" - "DCL SAMP[0..2]\n" - - "DCL IMAGE[0], 2D, WR\n" - "DCL TEMP[0..4]\n" - - "IMM[0] UINT32 { 8, 8, 1, 0}\n" - "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n" - - "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n" - - /* Drawn area check */ - "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n" - "USLT TEMP[1].zw, TEMP[0].xyxy, CONST[4].zwzw\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].yyyy\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n" - - "UIF TEMP[1]\n" - /* Translate */ - "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n" - "U2F TEMP[2], TEMP[2]\n" - "DIV TEMP[3], TEMP[2], IMM[1].yyyy\n" - - /* Scale */ - "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n" - "DIV TEMP[2], TEMP[2], IMM[1].xyxy\n" - "DIV TEMP[3], TEMP[3], CONST[3].zwzw\n" - "DIV TEMP[3], TEMP[3], IMM[1].xyxy\n" - - /* Clamp coords */ - "MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n" - "MIN TEMP[3].xy, TEMP[3].xyyy, CONST[7].zwzw\n" - - /* Fetch texels */ - "TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n" - "TEX_LZ TEMP[4].y, TEMP[3], SAMP[1], RECT\n" - "TEX_LZ TEMP[4].z, TEMP[3], SAMP[2], RECT\n" - - "MOV TEMP[4].w, IMM[1].xxxx\n" - - "STORE IMAGE[0], TEMP[0], TEMP[4], 2D\n" - "ENDIF\n" - - "END\n"; - -static const char *compute_shader_yuv_bob_uv = - "COMP\n" - "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n" - "PROPERTY CS_FIXED_BLOCK_HEIGHT 8\n" - "PROPERTY CS_FIXED_BLOCK_DEPTH 1\n" - - "DCL SV[0], THREAD_ID\n" - "DCL SV[1], BLOCK_ID\n" - - "DCL CONST[0..7]\n" - "DCL SVIEW[0..2], RECT, FLOAT\n" - "DCL SAMP[0..2]\n" - - "DCL IMAGE[0], 2D, WR\n" - "DCL TEMP[0..5]\n" - - "IMM[0] UINT32 { 8, 8, 1, 0}\n" - "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n" - - "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n" - - /* Drawn area check */ - "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n" - "USLT TEMP[1].zw, TEMP[0].xyxy, CONST[4].zwzw\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].yyyy\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n" - "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n" - - "UIF TEMP[1]\n" - /* Translate */ - "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n" - "U2F TEMP[2], TEMP[2]\n" - "DIV TEMP[3], TEMP[2], IMM[1].yyyy\n" - - /* Scale */ - "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n" - "DIV TEMP[2], TEMP[2], IMM[1].xyxy\n" - "DIV TEMP[3], TEMP[3], CONST[3].zwzw\n" - "DIV TEMP[3], TEMP[3], IMM[1].xyxy\n" - - /* Clamp coords */ - "MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n" - "MIN TEMP[3].xy, TEMP[3].xyyy, CONST[7].zwzw\n" - - /* Fetch texels */ - "TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n" - "TEX_LZ TEMP[4].y, TEMP[3], SAMP[1], RECT\n" - "TEX_LZ TEMP[4].z, TEMP[3], SAMP[2], RECT\n" - - "MOV TEMP[4].w, IMM[1].xxxx\n" - - "MOV TEMP[5].xy, TEMP[4].yzww\n" - - "STORE IMAGE[0], TEMP[0], TEMP[5], 2D\n" - "ENDIF\n" - - "END\n"; - static const char *compute_shader_yuv_y = "COMP\n" "PROPERTY CS_FIXED_BLOCK_WIDTH 8\n" @@ -1077,7 +946,6 @@ draw_layers(struct vl_compositor *c, (layer->src.br.x - layer->src.tl.x)); drawn.scale_y = layer->viewport.scale[1] / ((float)layer->sampler_views[0]->texture->height0 * - (s->interlaced ? 2.0 : 1.0) * (layer->src.br.y - layer->src.tl.y)); drawn.crop_x = (int)(layer->src.tl.x * layer->sampler_views[0]->texture->width0); drawn.translate_x = layer->viewport.translate[0]; @@ -1197,12 +1065,9 @@ bool vl_compositor_cs_init_shaders(struct vl_compositor *c) c->cs_yuv.weave.y = vl_compositor_cs_create_shader(c, compute_shader_yuv_weave_y); c->cs_yuv.weave.uv = vl_compositor_cs_create_shader(c, compute_shader_yuv_weave_uv); - c->cs_yuv.bob.y = vl_compositor_cs_create_shader(c, compute_shader_yuv_bob_y); - c->cs_yuv.bob.uv = vl_compositor_cs_create_shader(c, compute_shader_yuv_bob_uv); c->cs_yuv.progressive.y = vl_compositor_cs_create_shader(c, compute_shader_yuv_y); c->cs_yuv.progressive.uv = vl_compositor_cs_create_shader(c, compute_shader_yuv_uv); - if (!c->cs_yuv.weave.y || !c->cs_yuv.weave.uv || - !c->cs_yuv.bob.y || !c->cs_yuv.bob.uv) { + if (!c->cs_yuv.weave.y || !c->cs_yuv.weave.uv) { debug_printf("Unable to create YCbCr i-to-YCbCr p deint compute shader.\n"); return false; } @@ -1233,10 +1098,6 @@ void vl_compositor_cs_cleanup_shaders(struct vl_compositor *c) c->pipe->delete_compute_state(c->pipe, c->cs_yuv.weave.y); if (c->cs_yuv.weave.uv) c->pipe->delete_compute_state(c->pipe, c->cs_yuv.weave.uv); - if (c->cs_yuv.bob.y) - c->pipe->delete_compute_state(c->pipe, c->cs_yuv.bob.y); - if (c->cs_yuv.bob.uv) - c->pipe->delete_compute_state(c->pipe, c->cs_yuv.bob.uv); if (c->cs_yuv.progressive.y) c->pipe->delete_compute_state(c->pipe, c->cs_yuv.progressive.y); if (c->cs_yuv.progressive.uv)
