gallium/auxiliary/vl: Clamp coordinates in compute shaders

Video textures include padding, so this is needed to avoid sampling
outside of src rect due to scaling or additional offset.
Fixes wrong colors on right/bottom edge.

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/24869>
This commit is contained in:
David Rosca 2023-08-21 10:00:59 +02:00 committed by Marge Bot
parent a90b9f1d1e
commit a6a43963ed
2 changed files with 65 additions and 10 deletions

View file

@ -827,7 +827,7 @@ vl_compositor_init_state(struct vl_compositor_state *s, struct pipe_context *pip
pipe->screen,
PIPE_BIND_CONSTANT_BUFFER,
PIPE_USAGE_DEFAULT,
sizeof(csc_matrix) + 6*sizeof(float) + 10*sizeof(int)
sizeof(csc_matrix) + 10*sizeof(float) + 10*sizeof(int)
);
if (!s->shader_params)

View file

@ -42,6 +42,10 @@ struct cs_viewport {
int translate_y;
float sampler0_w;
float sampler0_h;
float clamp_x;
float clamp_y;
float chroma_clamp_x;
float chroma_clamp_y;
};
const char *compute_shader_video_buffer =
@ -53,7 +57,7 @@ const char *compute_shader_video_buffer =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..6]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], RECT, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -87,6 +91,10 @@ const char *compute_shader_video_buffer =
"DIV TEMP[2].xy, TEMP[2].xyyy, CONST[3].zwww\n"
"DIV TEMP[3].xy, TEMP[3].xyyy, CONST[3].zwww\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].xyyy, SAMP[0], RECT\n"
"TEX_LZ TEMP[4].y, TEMP[3].xyyy, SAMP[1], RECT\n"
@ -119,7 +127,7 @@ const char *compute_shader_weave =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..5]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], 2D_ARRAY, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -191,6 +199,12 @@ const char *compute_shader_weave =
"MOV TEMP[14].xyz, |TEMP[14].xyzz|\n"
"MUL TEMP[14].xyz, TEMP[14].xyzz, IMM[1].yyyy\n"
/* Clamp coords */
"MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n"
"MIN TEMP[12].xy, TEMP[12].xyyy, CONST[7].xyxy\n"
"MIN TEMP[3].xy, TEMP[3].xyyy, CONST[7].zwzw\n"
"MIN TEMP[13].xy, TEMP[13].xyyy, CONST[7].zwzw\n"
/* Normalize */
"DIV TEMP[2].xy, TEMP[2].xyyy, CONST[5].zwzw\n"
"DIV TEMP[12].xy, TEMP[12].xyyy, CONST[5].zwzw\n"
@ -283,7 +297,7 @@ static const char *compute_shader_yuv_weave_y =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..5]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], 2D_ARRAY, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -352,6 +366,12 @@ static const char *compute_shader_yuv_weave_y =
"MOV TEMP[14], |TEMP[14]|\n"
"MUL TEMP[14], TEMP[14], IMM[1].yyyy\n"
/* Clamp coords */
"MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n"
"MIN TEMP[12].xy, TEMP[12].xyyy, CONST[7].xyxy\n"
"MIN TEMP[3].xy, TEMP[3].xyyy, CONST[7].zwzw\n"
"MIN TEMP[13].xy, TEMP[13].xyyy, CONST[7].zwzw\n"
/* Normalize */
"DIV TEMP[2].xy, TEMP[2], CONST[5].zwzw\n"
"DIV TEMP[12].xy, TEMP[12], CONST[5].zwzw\n"
@ -389,7 +409,7 @@ static const char *compute_shader_yuv_weave_uv =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..5]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], 2D_ARRAY, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -458,6 +478,12 @@ static const char *compute_shader_yuv_weave_uv =
"MOV TEMP[14], |TEMP[14]|\n"
"MUL TEMP[14], TEMP[14], IMM[1].yyyy\n"
/* Clamp coords */
"MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n"
"MIN TEMP[12].xy, TEMP[12].xyyy, CONST[7].xyxy\n"
"MIN TEMP[3].xy, TEMP[3].xyyy, CONST[7].zwzw\n"
"MIN TEMP[13].xy, TEMP[13].xyyy, CONST[7].zwzw\n"
/* Normalize */
"DIV TEMP[2].xy, TEMP[2], CONST[5].zwzw\n"
"DIV TEMP[12].xy, TEMP[12], CONST[5].zwzw\n"
@ -497,7 +523,7 @@ static const char *compute_shader_yuv_bob_y =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..5]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], RECT, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -528,6 +554,10 @@ static const char *compute_shader_yuv_bob_y =
"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"
@ -549,7 +579,7 @@ static const char *compute_shader_yuv_bob_uv =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..5]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], RECT, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -580,6 +610,10 @@ static const char *compute_shader_yuv_bob_uv =
"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"
@ -603,7 +637,7 @@ static const char *compute_shader_yuv_y =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..6]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], RECT, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -641,6 +675,9 @@ static const char *compute_shader_yuv_y =
"I2F TEMP[4], TEMP[4]\n"
"ADD TEMP[2], TEMP[2], TEMP[4]\n"
/* Clamp coords */
"MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].xyxy\n"
/* Fetch texels */
"TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n"
@ -660,7 +697,7 @@ static const char *compute_shader_yuv_uv =
"DCL SV[0], THREAD_ID\n"
"DCL SV[1], BLOCK_ID\n"
"DCL CONST[0..6]\n"
"DCL CONST[0..7]\n"
"DCL SVIEW[0..2], RECT, FLOAT\n"
"DCL SAMP[0..2]\n"
@ -700,6 +737,9 @@ static const char *compute_shader_yuv_uv =
"I2F TEMP[4], TEMP[4]\n"
"ADD TEMP[2], TEMP[2], TEMP[4]\n"
/* Clamp coords */
"MIN TEMP[2].xy, TEMP[2].xyyy, CONST[7].zwzw\n"
/* Fetch texels */
"TEX_LZ TEMP[4].y, TEMP[2], SAMP[1], RECT\n"
"TEX_LZ TEMP[4].z, TEMP[2], SAMP[2], RECT\n"
@ -784,7 +824,7 @@ set_viewport(struct vl_compositor_state *s,
void *ptr = pipe_buffer_map_range(s->pipe, s->shader_params,
sizeof(vl_csc_matrix) + sizeof(float) * 2,
sizeof(float) * 6 + sizeof(int) * 8,
sizeof(float) * 10 + sizeof(int) * 8,
PIPE_MAP_WRITE | PIPE_MAP_DISCARD_RANGE,
&buf_transfer);
@ -826,6 +866,12 @@ set_viewport(struct vl_compositor_state *s,
*ptr_int++ = drawn->crop_x;
*ptr_int++ = drawn->crop_y;
ptr_float = (float *)ptr_int;
*ptr_float++ = drawn->clamp_x;
*ptr_float++ = drawn->clamp_y;
*ptr_float++ = drawn->chroma_clamp_x;
*ptr_float++ = drawn->chroma_clamp_y;
pipe_buffer_unmap(s->pipe, buf_transfer);
return true;
@ -845,6 +891,7 @@ draw_layers(struct vl_compositor *c,
struct vl_compositor_layer *layer = &s->layers[i];
struct pipe_sampler_view **samplers = &layer->sampler_views[0];
unsigned num_sampler_views = !samplers[1] ? 1 : !samplers[2] ? 2 : 3;
struct pipe_sampler_view *sampler1 = samplers[1] ? samplers[1] : samplers[0];
struct cs_viewport drawn;
drawn.area = calc_drawn_area(s, layer);
@ -861,6 +908,14 @@ draw_layers(struct vl_compositor *c,
drawn.translate_y = layer->viewport.translate[1];
drawn.sampler0_w = (float)layer->sampler_views[0]->texture->width0;
drawn.sampler0_h = (float)layer->sampler_views[0]->texture->height0;
drawn.clamp_x = (float)samplers[0]->texture->width0 *
(layer->src.br.x - layer->src.tl.x) - 0.5;
drawn.clamp_y = (float)samplers[0]->texture->height0 *
(layer->src.br.y - layer->src.tl.y) - 0.5;
drawn.chroma_clamp_x = (float)sampler1->texture->width0 *
(layer->src.br.x - layer->src.tl.x) - 0.5;
drawn.chroma_clamp_y = (float)sampler1->texture->height0 *
(layer->src.br.y - layer->src.tl.y) - 0.5;
set_viewport(s, &drawn, samplers);
c->pipe->bind_sampler_states(c->pipe, PIPE_SHADER_COMPUTE, 0,