#ifndef vl_mpeg12_mc_renderer_h #define vl_mpeg12_mc_renderer_h #include #include #include struct pipe_context; struct pipe_video_surface; struct pipe_macroblock; /* 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 */ }; enum VL_MPEG12_MC_RENDERER_EMPTY_BLOCK { VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ALL, /* Waste of memory bandwidth */ VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE, /* Can only do point-filtering when interpolating subsampled chroma channels */ VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_NONE /* Needs conditional texel fetch! */ }; struct vl_mpeg12_mc_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 VL_MPEG12_MC_RENDERER_EMPTY_BLOCK eb_handling; bool pot_buffers; unsigned macroblocks_per_batch; struct pipe_viewport_state viewport; struct pipe_constant_buffer vs_const_buf; struct pipe_constant_buffer fs_const_buf; struct pipe_framebuffer_state fb_state; struct pipe_vertex_element vertex_elems[8]; union { void *all[5]; struct { void *y, *cb, *cr, *ref[2]; } individual; } samplers; void *i_vs, *p_vs[2], *b_vs[2]; void *i_fs, *p_fs[2], *b_fs[2]; union { struct pipe_texture *all[5]; struct { struct pipe_texture *y, *cb, *cr, *ref[2]; } individual; } textures; union { struct pipe_vertex_buffer all[3]; struct { struct pipe_vertex_buffer ycbcr, ref[2]; } individual; } vertex_bufs; struct pipe_texture *surface, *past, *future; struct pipe_fence_handle **fence; unsigned num_macroblocks; struct pipe_mpeg12_macroblock *macroblock_buf; struct pipe_transfer *tex_transfer[3]; short *texels[3]; struct { float x, y; } surface_tex_inv_size; struct { float x, y; } zero_block[3]; }; 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 VL_MPEG12_MC_RENDERER_EMPTY_BLOCK eb_handling, bool pot_buffers); void vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer); void vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *renderer, struct pipe_texture *surface, struct pipe_texture *past, struct pipe_texture *future, unsigned num_macroblocks, struct pipe_mpeg12_macroblock *mpeg12_macroblocks, struct pipe_fence_handle **fence); #endif /* vl_mpeg12_mc_renderer_h */