diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index b545b9c297b..92e7462c11e 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -363,6 +363,13 @@ set_yuv_layer(struct vl_compositor_state *s, struct vl_compositor *c, s->layers[layer].cs = (y) ? c->cs_yuv.bob.y : c->cs_yuv.bob.uv; break; + case VL_COMPOSITOR_NONE: + if (c->pipe_cs_composit_supported) { + s->layers[layer].cs = (y) ? c->cs_yuv.progressive.y : c->cs_yuv.progressive.uv; + break; + } + FALLTHROUGH; + default: if (c->pipe_gfx_supported) s->layers[layer].fs = (y) ? c->fs_yuv.weave.y : c->fs_yuv.weave.uv; diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 32ce82f7320..be82e156cbc 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -149,6 +149,10 @@ struct vl_compositor void *y; void *uv; } bob; + struct { + void *y; + void *uv; + } progressive; } cs_yuv; struct { diff --git a/src/gallium/auxiliary/vl/vl_compositor_cs.c b/src/gallium/auxiliary/vl/vl_compositor_cs.c index f74a4b3810b..8a4fc6398c4 100644 --- a/src/gallium/auxiliary/vl/vl_compositor_cs.c +++ b/src/gallium/auxiliary/vl/vl_compositor_cs.c @@ -584,6 +584,111 @@ static const char *compute_shader_yuv_bob_uv = "END\n"; +static const char *compute_shader_yuv_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..5]\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" + "MOV TEMP[2], TEMP[0]\n" + "U2F TEMP[2], TEMP[2]\n" + + /* Scale */ + "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n" + + /* Translate */ + "MOV TEMP[4].xy, CONST[5]\n" + "I2F TEMP[4], -TEMP[4]\n" + "ADD TEMP[2], TEMP[2], TEMP[4]\n" + "ADD TEMP[2].y, TEMP[2].yyyy, IMM[1].xxxx\n" + + /* Fetch texels */ + "TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n" + + "MOV TEMP[4].yzw, IMM[1].xxxx\n" + + "STORE IMAGE[0], TEMP[0], TEMP[4], 2D\n" + "ENDIF\n" + + "END\n"; + +static const char *compute_shader_yuv_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..5]\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" + "MOV TEMP[2], TEMP[0]\n" + "U2F TEMP[2], TEMP[2]\n" + + /* Scale */ + "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n" + + /* Translate */ + "MOV TEMP[4].xy, CONST[5]\n" + "I2F TEMP[4], -TEMP[4]\n" + "ADD TEMP[2], TEMP[2], TEMP[4]\n" + "ADD TEMP[2].y, TEMP[2].yyyy, IMM[1].xxxx\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" + + "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 void cs_launch(struct vl_compositor *c, void *cs, @@ -825,11 +930,17 @@ bool vl_compositor_cs_init_shaders(struct vl_compositor *c) 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) { debug_printf("Unable to create YCbCr i-to-YCbCr p deint compute shader.\n"); return false; } + if (!c->cs_yuv.progressive.y || !c->cs_yuv.progressive.uv) { + debug_printf("Unable to create YCbCr p-to-NV12 compute shader.\n"); + return false; + } return true; }