1
/**************************************************************************
3
* Copyright 2009 Younes Manton.
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
**************************************************************************/
28
#ifndef vl_mpeg12_mc_renderer_h
29
#define vl_mpeg12_mc_renderer_h
31
#include <pipe/p_compiler.h>
32
#include <pipe/p_state.h>
33
#include <pipe/p_video_state.h>
36
struct pipe_video_surface;
37
struct pipe_macroblock;
39
/* A slice is video-width (rounded up to a multiple of macroblock width) x macroblock height */
40
enum VL_MPEG12_MC_RENDERER_BUFFER_MODE
42
VL_MPEG12_MC_RENDERER_BUFFER_SLICE, /* Saves memory at the cost of smaller batches */
43
VL_MPEG12_MC_RENDERER_BUFFER_PICTURE /* Larger batches, more memory */
46
enum VL_MPEG12_MC_RENDERER_EMPTY_BLOCK
48
VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ALL, /* Waste of memory bandwidth */
49
VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_ONE, /* Can only do point-filtering when interpolating subsampled chroma channels */
50
VL_MPEG12_MC_RENDERER_EMPTY_BLOCK_XFER_NONE /* Needs conditional texel fetch! */
53
struct vl_mpeg12_mc_renderer
55
struct pipe_context *pipe;
56
unsigned picture_width;
57
unsigned picture_height;
58
enum pipe_video_chroma_format chroma_format;
59
enum VL_MPEG12_MC_RENDERER_BUFFER_MODE bufmode;
60
enum VL_MPEG12_MC_RENDERER_EMPTY_BLOCK eb_handling;
62
unsigned macroblocks_per_batch;
64
struct pipe_viewport_state viewport;
65
struct pipe_scissor_state scissor;
66
struct pipe_buffer *vs_const_buf;
67
struct pipe_buffer *fs_const_buf;
68
struct pipe_framebuffer_state fb_state;
69
struct pipe_vertex_element vertex_elems[8];
74
struct { void *y, *cb, *cr, *ref[2]; } individual;
77
void *i_vs, *p_vs[2], *b_vs[2];
78
void *i_fs, *p_fs[2], *b_fs[2];
82
struct pipe_texture *all[5];
83
struct { struct pipe_texture *y, *cb, *cr, *ref[2]; } individual;
88
struct pipe_vertex_buffer all[3];
89
struct { struct pipe_vertex_buffer ycbcr, ref[2]; } individual;
92
struct pipe_texture *surface, *past, *future;
93
struct pipe_fence_handle **fence;
94
unsigned num_macroblocks;
95
struct pipe_mpeg12_macroblock *macroblock_buf;
96
struct pipe_transfer *tex_transfer[3];
98
struct { float x, y; } surface_tex_inv_size;
99
struct { float x, y; } zero_block[3];
102
bool vl_mpeg12_mc_renderer_init(struct vl_mpeg12_mc_renderer *renderer,
103
struct pipe_context *pipe,
104
unsigned picture_width,
105
unsigned picture_height,
106
enum pipe_video_chroma_format chroma_format,
107
enum VL_MPEG12_MC_RENDERER_BUFFER_MODE bufmode,
108
enum VL_MPEG12_MC_RENDERER_EMPTY_BLOCK eb_handling,
111
void vl_mpeg12_mc_renderer_cleanup(struct vl_mpeg12_mc_renderer *renderer);
113
void vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer *renderer,
114
struct pipe_texture *surface,
115
struct pipe_texture *past,
116
struct pipe_texture *future,
117
unsigned num_macroblocks,
118
struct pipe_mpeg12_macroblock *mpeg12_macroblocks,
119
struct pipe_fence_handle **fence);
121
#endif /* vl_mpeg12_mc_renderer_h */