diff options
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/vl/vl_compositor.c | 51 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_compositor.h | 3 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c | 69 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h | 3 |
4 files changed, 120 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 8f21eb68d64..b128af19ba3 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -30,6 +30,8 @@ #include <pipe/p_context.h> #include <util/u_inlines.h> #include <util/u_memory.h> +#include <util/u_keymap.h> +#include <util/u_sampler.h> #include <tgsi/tgsi_ureg.h> #include "vl_csc.h" @@ -251,6 +253,21 @@ cleanup_buffers(struct vl_compositor *c) pipe_resource_reference(&c->fs_const_buf, NULL); } +static void +texview_map_delete(const struct keymap *map, + const void *key, void *data, + void *user) +{ + struct pipe_context *pipe = (struct pipe_context*)user; + + assert(map); + assert(key); + assert(data); + assert(user); + + pipe->sampler_view_destroy(pipe, data); +} + bool vl_compositor_init(struct vl_compositor *compositor, struct pipe_context *pipe) { unsigned i; @@ -261,13 +278,22 @@ bool vl_compositor_init(struct vl_compositor *compositor, struct pipe_context *p compositor->pipe = pipe; - if (!init_pipe_state(compositor)) + compositor->texview_map = util_new_keymap(sizeof(struct pipe_surface*), -1, + texview_map_delete); + if (!compositor->texview_map) return false; + + if (!init_pipe_state(compositor)) { + util_delete_keymap(compositor->texview_map, compositor->pipe); + return false; + } if (!init_shaders(compositor)) { + util_delete_keymap(compositor->texview_map, compositor->pipe); cleanup_pipe_state(compositor); return false; } if (!init_buffers(compositor)) { + util_delete_keymap(compositor->texview_map, compositor->pipe); cleanup_shaders(compositor); cleanup_pipe_state(compositor); return false; @@ -288,6 +314,7 @@ void vl_compositor_cleanup(struct vl_compositor *compositor) { assert(compositor); + util_delete_keymap(compositor->texview_map, compositor->pipe); cleanup_buffers(compositor); cleanup_shaders(compositor); cleanup_pipe_state(compositor); @@ -459,8 +486,28 @@ static void draw_layers(struct vl_compositor *c, num_rects = gen_data(c, src_surface, src_rect, dst_rect, src_surfaces); for (i = 0; i < num_rects; ++i) { - //c->pipe->set_fragment_sampler_views(c->pipe, 1, &src_surfaces[i]->texture); + boolean delete_view = FALSE; + struct pipe_sampler_view *surface_view = (struct pipe_sampler_view*)util_keymap_lookup(c->texview_map, + &src_surfaces[i]); + if (!surface_view) { + struct pipe_sampler_view templat; + u_sampler_view_default_template(&templat, src_surfaces[i]->texture, + src_surfaces[i]->texture->format); + surface_view = c->pipe->create_sampler_view(c->pipe, src_surfaces[i]->texture, + &templat); + if (!surface_view) + return; + + delete_view = !util_keymap_insert(c->texview_map, &src_surfaces[i], + surface_view, c->pipe); + } + + c->pipe->set_fragment_sampler_views(c->pipe, 1, &surface_view); c->pipe->draw_arrays(c->pipe, PIPE_PRIM_TRIANGLES, i * 6, 6); + + if (delete_view) { + c->pipe->sampler_view_destroy(c->pipe, surface_view); + } } } diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 4b0cdd6be5f..026ae559ed7 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -34,6 +34,7 @@ #include "vl_types.h" struct pipe_context; +struct keymap; #define VL_COMPOSITOR_MAX_LAYERS 16 @@ -59,6 +60,8 @@ struct vl_compositor struct pipe_video_rect layer_src_rects[VL_COMPOSITOR_MAX_LAYERS]; struct pipe_video_rect layer_dst_rects[VL_COMPOSITOR_MAX_LAYERS]; unsigned dirty_layers; + + struct keymap *texview_map; }; bool vl_compositor_init(struct vl_compositor *compositor, struct pipe_context *pipe); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c index a4a9320d667..1e9a02c270d 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c @@ -32,6 +32,7 @@ #include <util/u_format.h> #include <util/u_math.h> #include <util/u_memory.h> +#include <util/u_keymap.h> #include <util/u_sampler.h> #include <tgsi/tgsi_ureg.h> @@ -1004,6 +1005,33 @@ gen_macroblock_stream(struct vl_mpeg12_mc_renderer *r, pipe_buffer_unmap(r->pipe, r->vertex_bufs.individual.ref[i].buffer, buf_transfer[i + 1]); } +static struct pipe_sampler_view +*find_or_create_sampler_view(struct vl_mpeg12_mc_renderer *r, struct pipe_surface *surface) +{ + struct pipe_sampler_view *sampler_view; + assert(r); + assert(surface); + + sampler_view = (struct pipe_sampler_view*)util_keymap_lookup(r->texview_map, &surface); + if (!sampler_view) { + struct pipe_sampler_view templat; + boolean added_to_map; + + u_sampler_view_default_template(&templat, surface->texture, + surface->texture->format); + sampler_view = r->pipe->create_sampler_view(r->pipe, surface->texture, + &templat); + if (!sampler_view) + return NULL; + + added_to_map = util_keymap_insert(r->texview_map, &surface, + sampler_view, r->pipe); + assert(added_to_map); + } + + return sampler_view; +} + static void flush(struct vl_mpeg12_mc_renderer *r) { @@ -1051,10 +1079,11 @@ flush(struct vl_mpeg12_mc_renderer *r) vb_start += num_macroblocks[MACROBLOCK_TYPE_INTRA] * 24; } - if (false /*num_macroblocks[MACROBLOCK_TYPE_FWD_FRAME_PRED] > 0*/) { + if (num_macroblocks[MACROBLOCK_TYPE_FWD_FRAME_PRED] > 0) { r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.p); r->textures.individual.ref[0] = r->past->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->past); r->pipe->set_fragment_sampler_views(r->pipe, 4, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->p_vs[0]); @@ -1069,6 +1098,7 @@ flush(struct vl_mpeg12_mc_renderer *r) r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.p); r->textures.individual.ref[0] = r->past->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->past); r->pipe->set_fragment_sampler_views(r->pipe, 4, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->p_vs[1]); @@ -1079,10 +1109,11 @@ flush(struct vl_mpeg12_mc_renderer *r) vb_start += num_macroblocks[MACROBLOCK_TYPE_FWD_FIELD_PRED] * 24; } - if (false /*num_macroblocks[MACROBLOCK_TYPE_BKWD_FRAME_PRED] > 0*/) { + if (num_macroblocks[MACROBLOCK_TYPE_BKWD_FRAME_PRED] > 0) { r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.p); r->textures.individual.ref[0] = r->future->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->future); r->pipe->set_fragment_sampler_views(r->pipe, 4, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->p_vs[0]); @@ -1097,6 +1128,7 @@ flush(struct vl_mpeg12_mc_renderer *r) r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.p); r->textures.individual.ref[0] = r->future->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->future); r->pipe->set_fragment_sampler_views(r->pipe, 4, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->p_vs[1]); @@ -1107,11 +1139,13 @@ flush(struct vl_mpeg12_mc_renderer *r) vb_start += num_macroblocks[MACROBLOCK_TYPE_BKWD_FIELD_PRED] * 24; } - if (false /*num_macroblocks[MACROBLOCK_TYPE_BI_FRAME_PRED] > 0*/) { + if (num_macroblocks[MACROBLOCK_TYPE_BI_FRAME_PRED] > 0) { r->pipe->set_vertex_buffers(r->pipe, 3, r->vertex_bufs.all); r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.b); r->textures.individual.ref[0] = r->past->texture; r->textures.individual.ref[1] = r->future->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->past); + r->sampler_views.individual.ref[1] = find_or_create_sampler_view(r, r->future); r->pipe->set_fragment_sampler_views(r->pipe, 5, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 5, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->b_vs[0]); @@ -1127,6 +1161,8 @@ flush(struct vl_mpeg12_mc_renderer *r) r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems_state.individual.b); r->textures.individual.ref[0] = r->past->texture; r->textures.individual.ref[1] = r->future->texture; + r->sampler_views.individual.ref[0] = find_or_create_sampler_view(r, r->past); + r->sampler_views.individual.ref[1] = find_or_create_sampler_view(r, r->future); r->pipe->set_fragment_sampler_views(r->pipe, 5, r->sampler_views.all); r->pipe->bind_fragment_sampler_states(r->pipe, 5, r->samplers.all); r->pipe->bind_vs_state(r->pipe, r->b_vs[1]); @@ -1270,6 +1306,21 @@ grab_macroblock(struct vl_mpeg12_mc_renderer *r, ++r->num_macroblocks; } +static void +texview_map_delete(const struct keymap *map, + const void *key, void *data, + void *user) +{ + struct pipe_context *pipe = (struct pipe_context*)user; + + assert(map); + assert(key); + assert(data); + assert(user); + + pipe->sampler_view_destroy(pipe, data); +} + bool vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer, struct pipe_context *pipe, @@ -1302,13 +1353,22 @@ vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer, renderer->eb_handling = eb_handling; renderer->pot_buffers = pot_buffers; - if (!init_pipe_state(renderer)) + renderer->texview_map = util_new_keymap(sizeof(struct pipe_surface*), -1, + texview_map_delete); + if (!renderer->texview_map) + return false; + + if (!init_pipe_state(renderer)) { + util_delete_keymap(renderer->texview_map, renderer->pipe); return false; + } if (!init_shaders(renderer)) { + util_delete_keymap(renderer->texview_map, renderer->pipe); cleanup_pipe_state(renderer); return false; } if (!init_buffers(renderer)) { + util_delete_keymap(renderer->texview_map, renderer->pipe); cleanup_shaders(renderer); cleanup_pipe_state(renderer); return false; @@ -1333,6 +1393,7 @@ vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer) xfer_buffers_unmap(renderer); + util_delete_keymap(renderer->texview_map, renderer->pipe); cleanup_pipe_state(renderer); cleanup_shaders(renderer); cleanup_buffers(renderer); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h index 2e37efbc3cd..85191cf6b02 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h @@ -35,6 +35,7 @@ struct pipe_context; struct pipe_macroblock; +struct keymap; /* A slice is video-width (rounded up to a multiple of macroblock width) x macroblock height */ enum VL_MPEG12_MC_RENDERER_BUFFER_MODE @@ -105,6 +106,8 @@ struct vl_mpeg12_mc_renderer short *texels[3]; struct vertex2f surface_tex_inv_size; struct vertex2f zero_block[3]; + + struct keymap *texview_map; }; bool vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer, |