summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c59
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h4
-rw-r--r--src/gallium/drivers/softpipe/sp_video_context.c4
3 files changed, 44 insertions, 23 deletions
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c
index 445e2aae234..4b3d2d6d551 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c
@@ -989,8 +989,23 @@ vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer)
}
void
-vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer
- *renderer,
+vl_mpeg12_mc_map_buffer(struct vl_mpeg12_mc_renderer *renderer)
+{
+ unsigned i;
+
+ assert(renderer);
+
+ vl_idct_map_buffers(&renderer->idct_luma, &renderer->idct_y);
+ vl_idct_map_buffers(&renderer->idct_chroma, &renderer->idct_cr);
+ vl_idct_map_buffers(&renderer->idct_chroma, &renderer->idct_cb);
+
+ vl_vb_map(&renderer->pos, renderer->pipe);
+ for(i = 0; i < 4; ++i)
+ vl_vb_map(&renderer->mv[i], renderer->pipe);
+}
+
+void
+vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *renderer,
struct pipe_surface *surface,
struct pipe_surface *past,
struct pipe_surface *future,
@@ -1024,17 +1039,30 @@ vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer
num_macroblocks -= num_to_submit;
if (renderer->num_macroblocks == renderer->macroblocks_per_batch) {
+ vl_mpeg12_mc_unmap_buffer(renderer);
vl_mpeg12_mc_renderer_flush(renderer);
-
- /* Next time we get this surface it may have new ref frames */
- pipe_surface_reference(&renderer->surface, NULL);
- pipe_surface_reference(&renderer->past, NULL);
- pipe_surface_reference(&renderer->future, NULL);
+ vl_mpeg12_mc_map_buffer(renderer);
}
}
}
void
+vl_mpeg12_mc_unmap_buffer(struct vl_mpeg12_mc_renderer *renderer)
+{
+ unsigned i;
+
+ assert(renderer);
+
+ vl_idct_unmap_buffers(&renderer->idct_luma, &renderer->idct_y);
+ vl_idct_unmap_buffers(&renderer->idct_chroma, &renderer->idct_cr);
+ vl_idct_unmap_buffers(&renderer->idct_chroma, &renderer->idct_cb);
+
+ vl_vb_unmap(&renderer->pos, renderer->pipe);
+ for(i = 0; i < 4; ++i)
+ vl_vb_unmap(&renderer->mv[i], renderer->pipe);
+}
+
+void
vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer)
{
unsigned i;
@@ -1045,20 +1073,13 @@ vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer)
if (renderer->num_macroblocks == 0)
return;
- vl_idct_unmap_buffers(&renderer->idct_luma, &renderer->idct_y);
- vl_idct_unmap_buffers(&renderer->idct_chroma, &renderer->idct_cr);
- vl_idct_unmap_buffers(&renderer->idct_chroma, &renderer->idct_cb);
-
vl_idct_flush(&renderer->idct_luma, &renderer->idct_y);
vl_idct_flush(&renderer->idct_chroma, &renderer->idct_cr);
vl_idct_flush(&renderer->idct_chroma, &renderer->idct_cb);
- vl_vb_unmap(&renderer->pos, renderer->pipe);
vl_vb_restart(&renderer->pos);
- for(i = 0; i < 4; ++i) {
- vl_vb_unmap(&renderer->mv[i], renderer->pipe);
+ for(i = 0; i < 4; ++i)
vl_vb_restart(&renderer->mv[i]);
- }
renderer->fb_state.cbufs[0] = renderer->surface;
renderer->pipe->bind_rasterizer_state(renderer->pipe, renderer->rs_state);
@@ -1085,13 +1106,5 @@ vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer)
renderer->pipe->flush(renderer->pipe, PIPE_FLUSH_RENDER_CACHE, renderer->fence);
- vl_idct_map_buffers(&renderer->idct_luma, &renderer->idct_y);
- vl_idct_map_buffers(&renderer->idct_chroma, &renderer->idct_cr);
- vl_idct_map_buffers(&renderer->idct_chroma, &renderer->idct_cb);
-
- vl_vb_map(&renderer->pos, renderer->pipe);
- for(i = 0; i < 4; ++i)
- vl_vb_map(&renderer->mv[i], renderer->pipe);
-
renderer->num_macroblocks = 0;
}
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h
index e12ac50ae0d..2f35bcbcd45 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h
@@ -112,6 +112,8 @@ bool vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer,
void vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer);
+void vl_mpeg12_mc_map_buffer(struct vl_mpeg12_mc_renderer *renderer);
+
void vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *renderer,
struct pipe_surface *surface,
struct pipe_surface *past,
@@ -120,6 +122,8 @@ void vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *rend
struct pipe_mpeg12_macroblock *mpeg12_macroblocks,
struct pipe_fence_handle **fence);
+void vl_mpeg12_mc_unmap_buffer(struct vl_mpeg12_mc_renderer *renderer);
+
void vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer);
#endif /* vl_mpeg12_mc_renderer_h */
diff --git a/src/gallium/drivers/softpipe/sp_video_context.c b/src/gallium/drivers/softpipe/sp_video_context.c
index 35636d8475c..166c09e20be 100644
--- a/src/gallium/drivers/softpipe/sp_video_context.c
+++ b/src/gallium/drivers/softpipe/sp_video_context.c
@@ -282,7 +282,9 @@ sp_mpeg12_render_picture(struct pipe_video_context *vpipe,
assert(dst_surface);
assert(dst_area);
+ vl_mpeg12_mc_unmap_buffer(&ctx->mc_renderer);
vl_mpeg12_mc_renderer_flush(&ctx->mc_renderer);
+ vl_mpeg12_mc_map_buffer(&ctx->mc_renderer);
vl_compositor_render(&ctx->compositor, src_surface,
picture_type, src_area, dst_surface, dst_area, fence);
@@ -328,7 +330,9 @@ sp_mpeg12_set_decode_target(struct pipe_video_context *vpipe,
assert(dt);
if (ctx->decode_target != dt) {
+ vl_mpeg12_mc_unmap_buffer(&ctx->mc_renderer);
vl_mpeg12_mc_renderer_flush(&ctx->mc_renderer);
+ vl_mpeg12_mc_map_buffer(&ctx->mc_renderer);
pipe_surface_reference(&ctx->decode_target, dt);
}
}