gallium/auxiliary/vl: Fix YUV to RGB bob compute shader deinterlacing
This reverts commit ef0d92459c 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 <leo.liu@amd.com>
Reviewed-by: Thong Thai <thong.thai@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25258>
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -159,10 +159,6 @@ struct vl_compositor
|
||||
void *y;
|
||||
void *uv;
|
||||
} weave;
|
||||
struct {
|
||||
void *y;
|
||||
void *uv;
|
||||
} bob;
|
||||
struct {
|
||||
void *y;
|
||||
void *uv;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user