No point in having it when just having sampler_view_planes is good enough. :-)
Signed-off-by: Maarten Lankhorst <m.b.lankho...@gmail.com> --- src/gallium/auxiliary/vl/vl_compositor.c | 36 ++++++++++++++----- src/gallium/auxiliary/vl/vl_compositor.h | 2 +- src/gallium/auxiliary/vl/vl_video_buffer.c | 46 +++----------------------- src/gallium/auxiliary/vl/vl_video_buffer.h | 1 - src/gallium/drivers/nouveau/nouveau_video.c | 48 +++------------------------ src/gallium/drivers/nouveau/nouveau_video.h | 1 - src/gallium/include/pipe/p_video_decoder.h | 5 --- 7 files changed, 37 insertions(+), 102 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 322ef8e..fff4340 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -71,7 +71,7 @@ create_vert_shader(struct vl_compositor *c) } static void * -create_frag_shader_video_buffer(struct vl_compositor *c) +create_frag_shader_video_buffer(struct vl_compositor *c, unsigned planes) { struct ureg_program *shader; struct ureg_src tc; @@ -88,7 +88,8 @@ create_frag_shader_video_buffer(struct vl_compositor *c) tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, 1, TGSI_INTERPOLATE_LINEAR); for (i = 0; i < 3; ++i) { csc[i] = ureg_DECL_constant(shader, i); - sampler[i] = ureg_DECL_sampler(shader, i); + if (i < planes) + sampler[i] = ureg_DECL_sampler(shader, i); } texel = ureg_DECL_temporary(shader); fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0); @@ -97,8 +98,13 @@ create_frag_shader_video_buffer(struct vl_compositor *c) * texel.xyz = tex(tc, sampler[i]) * fragment = csc * texel */ - for (i = 0; i < 3; ++i) - ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D, tc, sampler[i]); + if (planes == 2) { + ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X), TGSI_TEXTURE_2D, tc, sampler[0]); + ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_Y|TGSI_WRITEMASK_Z), TGSI_TEXTURE_2D, tc, sampler[1]); + } else { + for (i = 0; i < 3; ++i) + ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D, tc, sampler[i]); + } ureg_MOV(shader, ureg_writemask(texel, TGSI_WRITEMASK_W), ureg_imm1f(shader, 1.0f)); @@ -198,9 +204,14 @@ init_shaders(struct vl_compositor *c) return false; } - c->fs_video_buffer = create_frag_shader_video_buffer(c); - if (!c->fs_video_buffer) { - debug_printf("Unable to create YCbCr-to-RGB fragment shader.\n"); + c->fs_video_buffer2 = create_frag_shader_video_buffer(c, 2); + if (!c->fs_video_buffer2) { + debug_printf("Unable to create YCbCr-to-RGB fragment shader for 2 planes.\n"); + return false; + } + c->fs_video_buffer3 = create_frag_shader_video_buffer(c, 3); + if (!c->fs_video_buffer3) { + debug_printf("Unable to create YCbCr-to-RGB fragment shader for 3 planes.\n"); return false; } @@ -230,7 +241,8 @@ static void cleanup_shaders(struct vl_compositor *c) assert(c); c->pipe->delete_vs_state(c->pipe, c->vs); - c->pipe->delete_fs_state(c->pipe, c->fs_video_buffer); + c->pipe->delete_fs_state(c->pipe, c->fs_video_buffer2); + c->pipe->delete_fs_state(c->pipe, c->fs_video_buffer3); c->pipe->delete_fs_state(c->pipe, c->fs_palette.yuv); c->pipe->delete_fs_state(c->pipe, c->fs_palette.rgb); c->pipe->delete_fs_state(c->pipe, c->fs_rgba); @@ -644,13 +656,17 @@ vl_compositor_set_buffer_layer(struct vl_compositor *c, assert(layer < VL_COMPOSITOR_MAX_LAYERS); c->used_layers |= 1 << layer; - c->layers[layer].fs = c->fs_video_buffer; - sampler_views = buffer->get_sampler_view_components(buffer); + sampler_views = buffer->get_sampler_view_planes(buffer); for (i = 0; i < 3; ++i) { c->layers[layer].samplers[i] = c->sampler_linear; pipe_sampler_view_reference(&c->layers[layer].sampler_views[i], sampler_views[i]); } + if (sampler_views[2]) + c->layers[layer].fs = c->fs_video_buffer3; + else + c->layers[layer].fs = c->fs_video_buffer2; + assert(sampler_views[1]); calc_src_and_dst(&c->layers[layer], buffer->width, buffer->height, src_rect ? *src_rect : default_rect(&c->layers[layer]), diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index f60f7da..cc91c2b 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -73,7 +73,7 @@ struct vl_compositor void *vertex_elems_state; void *vs; - void *fs_video_buffer; + void *fs_video_buffer2, *fs_video_buffer3; void *fs_rgba; struct { diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 6d714d4..a95a1dd 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -109,7 +109,6 @@ vl_video_buffer_destroy(struct pipe_video_buffer *buffer) for (i = 0; i < VL_MAX_PLANES; ++i) { pipe_surface_reference(&buf->surfaces[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL); - pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); pipe_resource_reference(&buf->resources[i], NULL); } @@ -135,6 +134,11 @@ vl_video_buffer_sampler_view_planes(struct pipe_video_buffer *buffer) if (util_format_get_nr_components(buf->resources[i]->format) == 1) sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = sv_templ.swizzle_a = PIPE_SWIZZLE_RED; + else if (buf->resources[i]->format == PIPE_FORMAT_R8G8_UNORM) { + sv_templ.swizzle_b = sv_templ.swizzle_g; + sv_templ.swizzle_g = sv_templ.swizzle_r; + assert(i == 1); + } buf->sampler_view_planes[i] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ); if (!buf->sampler_view_planes[i]) @@ -151,45 +155,6 @@ error: return NULL; } -static struct pipe_sampler_view ** -vl_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer) -{ - struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer; - struct pipe_sampler_view sv_templ; - struct pipe_context *pipe; - unsigned i, j, component; - - assert(buf); - - pipe = buf->base.context; - - for (component = 0, i = 0; i < buf->num_planes; ++i ) { - unsigned nr_components = util_format_get_nr_components(buf->resources[i]->format); - - for (j = 0; j < nr_components; ++j, ++component) { - assert(component < VL_MAX_PLANES); - - if (!buf->sampler_view_components[component]) { - memset(&sv_templ, 0, sizeof(sv_templ)); - u_sampler_view_default_template(&sv_templ, buf->resources[i], buf->resources[i]->format); - sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = PIPE_SWIZZLE_RED + j; - sv_templ.swizzle_a = PIPE_SWIZZLE_ONE; - buf->sampler_view_components[component] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ); - if (!buf->sampler_view_components[component]) - goto error; - } - } - } - - return buf->sampler_view_components; - -error: - for (i = 0; i < VL_MAX_PLANES; ++i ) - pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); - - return NULL; -} - static struct pipe_surface ** vl_video_buffer_surfaces(struct pipe_video_buffer *buffer) { @@ -279,7 +244,6 @@ vl_video_buffer_create_ex(struct pipe_context *pipe, buffer->base.context = pipe; buffer->base.destroy = vl_video_buffer_destroy; buffer->base.get_sampler_view_planes = vl_video_buffer_sampler_view_planes; - buffer->base.get_sampler_view_components = vl_video_buffer_sampler_view_components; buffer->base.get_surfaces = vl_video_buffer_surfaces; buffer->base.chroma_format = chroma_format; buffer->base.width = width; diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h index 8c80b36..c07cfce 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.h +++ b/src/gallium/auxiliary/vl/vl_video_buffer.h @@ -44,7 +44,6 @@ struct vl_video_buffer unsigned num_planes; struct pipe_resource *resources[VL_MAX_PLANES]; struct pipe_sampler_view *sampler_view_planes[VL_MAX_PLANES]; - struct pipe_sampler_view *sampler_view_components[VL_MAX_PLANES]; struct pipe_surface *surfaces[VL_MAX_PLANES]; }; diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c index 162e1aa..1144be2 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.c +++ b/src/gallium/drivers/nouveau/nouveau_video.c @@ -668,6 +668,11 @@ nouveau_video_buffer_sampler_view_planes(struct pipe_video_buffer *buffer) if (util_format_get_nr_components(buf->resources[i]->format) == 1) sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = sv_templ.swizzle_a = PIPE_SWIZZLE_RED; + else { + sv_templ.swizzle_b = sv_templ.swizzle_g; + sv_templ.swizzle_g = sv_templ.swizzle_r; + assert(i == 1); + } buf->sampler_view_planes[i] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ); if (!buf->sampler_view_planes[i]) @@ -684,45 +689,6 @@ error: return NULL; } -static struct pipe_sampler_view ** -nouveau_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer) -{ - struct nouveau_video_buffer *buf = (struct nouveau_video_buffer *)buffer; - struct pipe_sampler_view sv_templ; - struct pipe_context *pipe; - unsigned i, j, component; - - assert(buf); - - pipe = buf->base.context; - - for (component = 0, i = 0; i < buf->num_planes; ++i ) { - unsigned nr_components = util_format_get_nr_components(buf->resources[i]->format); - - for (j = 0; j < nr_components; ++j, ++component) { - assert(component < VL_MAX_PLANES); - - if (!buf->sampler_view_components[component]) { - memset(&sv_templ, 0, sizeof(sv_templ)); - u_sampler_view_default_template(&sv_templ, buf->resources[i], buf->resources[i]->format); - sv_templ.swizzle_r = sv_templ.swizzle_g = sv_templ.swizzle_b = PIPE_SWIZZLE_RED + j; - sv_templ.swizzle_a = PIPE_SWIZZLE_ONE; - buf->sampler_view_components[component] = pipe->create_sampler_view(pipe, buf->resources[i], &sv_templ); - if (!buf->sampler_view_components[component]) - goto error; - } - } - } - - return buf->sampler_view_components; - -error: - for (i = 0; i < 3; ++i ) - pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); - - return NULL; -} - static struct pipe_surface ** nouveau_video_buffer_surfaces(struct pipe_video_buffer *buffer) { @@ -766,11 +732,8 @@ nouveau_video_buffer_destroy(struct pipe_video_buffer *buffer) for (i = 0; i < buf->num_planes; ++i) { pipe_surface_reference(&buf->surfaces[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL); - pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); pipe_resource_reference(&buf->resources[i], NULL); } - for (;i < 3;++i) - pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); FREE(buffer); } @@ -804,7 +767,6 @@ nouveau_video_buffer_create(struct pipe_context *pipe, buffer->base.context = pipe; buffer->base.destroy = nouveau_video_buffer_destroy; buffer->base.get_sampler_view_planes = nouveau_video_buffer_sampler_view_planes; - buffer->base.get_sampler_view_components = nouveau_video_buffer_sampler_view_components; buffer->base.get_surfaces = nouveau_video_buffer_surfaces; buffer->base.chroma_format = chroma_format; buffer->base.width = width; diff --git a/src/gallium/drivers/nouveau/nouveau_video.h b/src/gallium/drivers/nouveau/nouveau_video.h index c6875c3..fb22253 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.h +++ b/src/gallium/drivers/nouveau/nouveau_video.h @@ -9,7 +9,6 @@ struct nouveau_video_buffer { unsigned num_planes; struct pipe_resource *resources[2]; struct pipe_sampler_view *sampler_view_planes[2]; - struct pipe_sampler_view *sampler_view_components[3]; struct pipe_surface *surfaces[2]; }; diff --git a/src/gallium/include/pipe/p_video_decoder.h b/src/gallium/include/pipe/p_video_decoder.h index 40b7dcd..034b860 100644 --- a/src/gallium/include/pipe/p_video_decoder.h +++ b/src/gallium/include/pipe/p_video_decoder.h @@ -153,11 +153,6 @@ struct pipe_video_buffer struct pipe_sampler_view **(*get_sampler_view_planes)(struct pipe_video_buffer *buffer); /** - * get a individual sampler view for each component - */ - struct pipe_sampler_view **(*get_sampler_view_components)(struct pipe_video_buffer *buffer); - - /** * get a individual surfaces for each plane */ struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer); -- 1.7.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev