#include <pipe/p_state.h>
#include <pipe/p_video_state.h>
#include "vl_types.h"
-#include "vl_idct.h"
-#include "vl_vertex_buffers.h"
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
-{
- VL_MPEG12_MC_RENDERER_BUFFER_SLICE, /* Saves memory at the cost of smaller batches */
- VL_MPEG12_MC_RENDERER_BUFFER_PICTURE /* Larger batches, more memory */
-};
-
struct vl_mpeg12_mc_renderer
{
struct pipe_context *pipe;
unsigned buffer_width;
unsigned buffer_height;
enum pipe_video_chroma_format chroma_format;
- enum VL_MPEG12_MC_RENDERER_BUFFER_MODE bufmode;
- unsigned macroblocks_per_batch;
-
- unsigned pos_stride;
- unsigned mv_stride[4];
+ const unsigned (*empty_block_mask)[3][2][2];
struct pipe_viewport_state viewport;
struct pipe_framebuffer_state fb_state;
- struct vl_idct idct_luma, idct_chroma;
-
- void *vertex_elems_state;
void *rs_state;
void *vs, *fs;
- struct pipe_vertex_buffer quad;
-
union
{
void *all[5];
struct vl_mpeg12_mc_buffer
{
- struct vl_idct_buffer idct_y, idct_cb, idct_cr;
-
- struct vl_vertex_buffer pos;
- struct vl_vertex_buffer mv[4];
-
union
{
struct pipe_sampler_view *all[5];
union
{
- struct pipe_resource *all[5];
- struct { struct pipe_resource *y, *cb, *cr, *ref[2]; } individual;
+ struct pipe_resource *all[3];
+ struct { struct pipe_resource *y, *cb, *cr; } individual;
} textures;
- union
- {
- struct pipe_vertex_buffer all[6];
- struct {
- struct pipe_vertex_buffer quad, pos, mv[4];
- } individual;
- } vertex_bufs;
-
struct pipe_surface *surface, *past, *future;
struct pipe_fence_handle **fence;
- unsigned num_macroblocks;
};
bool vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer,
struct pipe_context *pipe,
unsigned picture_width,
unsigned picture_height,
- enum pipe_video_chroma_format chroma_format,
- enum VL_MPEG12_MC_RENDERER_BUFFER_MODE bufmode);
+ enum pipe_video_chroma_format chroma_format);
void vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer);
-bool vl_mpeg12_mc_init_buffer(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer);
+bool vl_mpeg12_mc_init_buffer(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer,
+ struct pipe_resource *y, struct pipe_resource *cr, struct pipe_resource *cb);
void vl_mpeg12_mc_cleanup_buffer(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer);
-void vl_mpeg12_mc_map_buffer(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer);
-
-void vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *renderer,
- struct vl_mpeg12_mc_buffer *buffer,
- struct pipe_surface *surface,
- struct pipe_surface *past,
- struct pipe_surface *future,
- unsigned num_macroblocks,
- struct pipe_mpeg12_macroblock *mpeg12_macroblocks,
- struct pipe_fence_handle **fence);
-
-void vl_mpeg12_mc_unmap_buffer(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer);
+void vl_mpeg12_mc_set_surfaces(struct vl_mpeg12_mc_renderer *renderer,
+ struct vl_mpeg12_mc_buffer *buffer,
+ struct pipe_surface *surface,
+ struct pipe_surface *past,
+ struct pipe_surface *future,
+ struct pipe_fence_handle **fence);
-void vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer);
+void vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer, struct vl_mpeg12_mc_buffer *buffer,
+ unsigned not_empty_start_instance, unsigned not_empty_num_instances,
+ unsigned empty_start_instance, unsigned empty_num_instances);
#endif /* vl_mpeg12_mc_renderer_h */