Apply the luma key filter to the YCbCr values during the CSC conversion in video buffer shader. The initial values of max and min luma are set to opposite values to disable the filter initially and will be set when enabling it.
Add extra parmeters min and max luma for the luma key filter in vl_compositor_set_csc_matrix in va, xvmc. Setting them to opposite value 1.f and 0.f respectively won't effect the CSC conversion v2: -Squash 1,2 and 3 into one patch to avoid breaking build of other components.(Christian) -use ureg_swizzle.(Christian) -change name of the variables.(Christian) Signed-off-by: Nayan Deshmukh <nayan26deshm...@gmail.com> --- src/gallium/auxiliary/vl/vl_compositor.c | 50 ++++++++++++++++++++-------- src/gallium/auxiliary/vl/vl_compositor.h | 2 +- src/gallium/state_trackers/va/context.c | 2 +- src/gallium/state_trackers/xvmc/attributes.c | 2 +- src/gallium/state_trackers/xvmc/context.c | 2 +- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index acb2f4f..4c4e38b 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -131,7 +131,9 @@ create_frag_shader_video_buffer(struct vl_compositor *c) struct ureg_program *shader; struct ureg_src tc; struct ureg_src csc[3]; + struct ureg_src lumakey; struct ureg_src sampler[3]; + struct ureg_dst temp[3]; struct ureg_dst texel; struct ureg_dst fragment; unsigned i; @@ -142,9 +144,12 @@ create_frag_shader_video_buffer(struct vl_compositor *c) tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR); for (i = 0; i < 3; ++i) { - csc[i] = ureg_DECL_constant(shader, i); sampler[i] = ureg_DECL_sampler(shader, i); + csc[i] = ureg_DECL_constant(shader, i); + temp[i] = ureg_DECL_temporary(shader); } + + lumakey = ureg_DECL_constant(shader, 3); texel = ureg_DECL_temporary(shader); fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); @@ -153,14 +158,30 @@ create_frag_shader_video_buffer(struct vl_compositor *c) * fragment = csc * texel */ for (i = 0; i < 3; ++i) - ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D_ARRAY, tc, sampler[i]); + ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), + TGSI_TEXTURE_2D_ARRAY, tc, sampler[i]); ureg_MOV(shader, ureg_writemask(texel, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); for (i = 0; i < 3; ++i) ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(texel)); - ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); + ureg_MOV(shader, ureg_writemask(temp[0], TGSI_WRITEMASK_W), + ureg_swizzle(ureg_src(texel),TGSI_SWIZZLE_X, + TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_Z)); + ureg_MOV(shader, temp[1], + ureg_swizzle(lumakey,TGSI_SWIZZLE_X, + TGSI_SWIZZLE_X, TGSI_SWIZZLE_X, TGSI_SWIZZLE_X)); + ureg_MOV(shader, temp[2], + ureg_swizzle(lumakey, TGSI_SWIZZLE_Y, + TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y, TGSI_SWIZZLE_Y)); + ureg_SLE(shader, temp[1], ureg_src(temp[0]), ureg_src(temp[1])); + ureg_SGT(shader, temp[2], ureg_src(temp[0]), ureg_src(temp[2])); + ureg_MAX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), + ureg_src(temp[1]), ureg_src(temp[2])); + + for (i = 0; i < 3; ++i) + ureg_release_temporary(shader, temp[i]); ureg_release_temporary(shader, texel); ureg_END(shader); @@ -852,20 +873,21 @@ vl_compositor_cleanup(struct vl_compositor *c) } void -vl_compositor_set_csc_matrix(struct vl_compositor_state *s, vl_csc_matrix const *matrix) +vl_compositor_set_csc_matrix(struct vl_compositor_state *s, vl_csc_matrix const *matrix, float luma_min, float luma_max) { struct pipe_transfer *buf_transfer; assert(s); - memcpy - ( - pipe_buffer_map(s->pipe, s->csc_matrix, - PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, - &buf_transfer), - matrix, - sizeof(vl_csc_matrix) - ); + float *ptr = pipe_buffer_map(s->pipe, s->csc_matrix, + PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, + &buf_transfer); + + memcpy(ptr, matrix, sizeof(vl_csc_matrix)); + + ptr += sizeof(vl_csc_matrix)/sizeof(float); + ptr[0] = luma_min; + ptr[1] = luma_max; pipe_buffer_unmap(s->pipe, buf_transfer); } @@ -1142,13 +1164,13 @@ 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) + sizeof(csc_matrix) + 2*sizeof(float) ); vl_compositor_clear_layers(s); vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_IDENTITY, NULL, true, &csc_matrix); - vl_compositor_set_csc_matrix(s, (const vl_csc_matrix *)&csc_matrix); + vl_compositor_set_csc_matrix(s, (const vl_csc_matrix *)&csc_matrix, 1.f, 0.f); return true; } diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 934b634..23cab6c 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -138,7 +138,7 @@ vl_compositor_init_state(struct vl_compositor_state *state, struct pipe_context * set yuv -> rgba conversion matrix */ void -vl_compositor_set_csc_matrix(struct vl_compositor_state *settings, const vl_csc_matrix *matrix); +vl_compositor_set_csc_matrix(struct vl_compositor_state *settings, const vl_csc_matrix *matrix, float luma_min, float luma_max); /** * reset dirty area, so it's cleared with the clear colour diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c index 51abd87..898f81a 100644 --- a/src/gallium/state_trackers/va/context.c +++ b/src/gallium/state_trackers/va/context.c @@ -159,7 +159,7 @@ VA_DRIVER_INIT_FUNC(VADriverContextP ctx) vl_compositor_init_state(&drv->cstate, drv->pipe); vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, true, &drv->csc); - vl_compositor_set_csc_matrix(&drv->cstate, (const vl_csc_matrix *)&drv->csc); + vl_compositor_set_csc_matrix(&drv->cstate, (const vl_csc_matrix *)&drv->csc, 1.f, 0.f); pipe_mutex_init(drv->mutex); ctx->pDriverData = (void *)drv; diff --git a/src/gallium/state_trackers/xvmc/attributes.c b/src/gallium/state_trackers/xvmc/attributes.c index 2d8f00b..eb2b827 100644 --- a/src/gallium/state_trackers/xvmc/attributes.c +++ b/src/gallium/state_trackers/xvmc/attributes.c @@ -110,7 +110,7 @@ Status XvMCSetAttribute(Display *dpy, XvMCContext *context, Atom attribute, int context_priv->color_standard, &context_priv->procamp, true, &csc ); - vl_compositor_set_csc_matrix(&context_priv->cstate, (const vl_csc_matrix *)&csc); + vl_compositor_set_csc_matrix(&context_priv->cstate, (const vl_csc_matrix *)&csc, 1.f, 0.f); XVMC_MSG(XVMC_TRACE, "[XvMC] Set attribute %s to value %d.\n", attr, value); diff --git a/src/gallium/state_trackers/xvmc/context.c b/src/gallium/state_trackers/xvmc/context.c index a6991ab..7b7944c 100644 --- a/src/gallium/state_trackers/xvmc/context.c +++ b/src/gallium/state_trackers/xvmc/context.c @@ -293,7 +293,7 @@ Status XvMCCreateContext(Display *dpy, XvPortID port, int surface_type_id, context_priv->color_standard, &context_priv->procamp, true, &csc ); - vl_compositor_set_csc_matrix(&context_priv->cstate, (const vl_csc_matrix *)&csc); + vl_compositor_set_csc_matrix(&context_priv->cstate, (const vl_csc_matrix *)&csc, 1.f, 0.f); context_priv->vscreen = vscreen; context_priv->pipe = pipe; -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev