#ifndef vl_vertex_buffers_h
#define vl_vertex_buffers_h
-#include <assert.h>
-#include <pipe/p_state.h>
+#include "pipe/p_state.h"
+#include "pipe/p_video_state.h"
+
+#include "vl_defines.h"
#include "vl_types.h"
+/* vertex buffers act as a todo list
+ * uploading all the usefull informations to video ram
+ * so a vertex shader can work with them
+ */
+
+/* inputs to the vertex shaders */
+enum VS_INPUT
+{
+ VS_I_RECT = 0,
+ VS_I_VPOS = 1,
+
+ VS_I_BLOCK_NUM = 2,
+
+ VS_I_MV_TOP = 2,
+ VS_I_MV_BOTTOM = 3,
+
+ NUM_VS_INPUTS = 4
+};
+
+enum vl_mv_weight
+{
+ PIPE_VIDEO_MV_WEIGHT_MIN = 0,
+ PIPE_VIDEO_MV_WEIGHT_HALF = 128,
+ PIPE_VIDEO_MV_WEIGHT_MAX = 256
+};
+
+enum vl_field_select
+{
+ PIPE_VIDEO_FRAME = 0,
+ PIPE_VIDEO_TOP_FIELD = 1,
+ PIPE_VIDEO_BOTTOM_FIELD = 3,
+
+ /* TODO
+ PIPE_VIDEO_DUALPRIME
+ PIPE_VIDEO_16x8
+ */
+};
+
+struct vl_motionvector
+{
+ struct {
+ int16_t x, y;
+ int16_t field_select; /**< enum pipe_video_field_select */
+ int16_t weight; /**< enum pipe_video_mv_weight */
+ } top, bottom;
+};
+
+struct vl_ycbcr_block
+{
+ uint8_t x, y;
+ uint8_t intra;
+ uint8_t coding;
+ float block_num;
+};
+
struct vl_vertex_buffer
{
- unsigned num_verts;
- unsigned stride;
- struct pipe_resource *resource;
- struct pipe_transfer *transfer;
- void *vectors;
+ unsigned width, height;
+
+ struct {
+ struct pipe_resource *resource;
+ struct pipe_transfer *transfer;
+ struct vl_ycbcr_block *vertex_stream;
+ } ycbcr[VL_MAX_PLANES];
+
+ struct {
+ struct pipe_resource *resource;
+ struct pipe_transfer *transfer;
+ struct vl_motionvector *vertex_stream;
+ } mv[VL_MAX_REF_FRAMES];
};
-struct pipe_vertex_buffer vl_vb_upload_quads(struct pipe_context *pipe, unsigned max_blocks);
+struct pipe_vertex_buffer vl_vb_upload_quads(struct pipe_context *pipe);
+
+struct pipe_vertex_buffer vl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height);
-struct pipe_vertex_element vl_vb_get_quad_vertex_element(void);
+void *vl_vb_get_ves_ycbcr(struct pipe_context *pipe);
-unsigned vl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements,
- unsigned vertex_buffer_index);
+void *vl_vb_get_ves_mv(struct pipe_context *pipe);
-struct pipe_vertex_buffer vl_vb_init(struct vl_vertex_buffer *buffer,
- struct pipe_context *pipe,
- unsigned max_blocks, unsigned stride);
+bool vl_vb_init(struct vl_vertex_buffer *buffer,
+ struct pipe_context *pipe,
+ unsigned width, unsigned height);
+
+unsigned vl_vb_attributes_per_plock(struct vl_vertex_buffer *buffer);
void vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
-static inline void
-vl_vb_add_block(struct vl_vertex_buffer *buffer, void *elements)
-{
- void *pos;
- unsigned i;
+struct pipe_vertex_buffer vl_vb_get_ycbcr(struct vl_vertex_buffer *buffer, int component);
- assert(buffer);
+struct vl_ycbcr_block *vl_vb_get_ycbcr_stream(struct vl_vertex_buffer *buffer, int component);
- pos = buffer->vectors + buffer->num_verts * buffer->stride;
- for(i = 0; i < 4; ++i) {
- memcpy(pos, elements, buffer->stride);
- pos += buffer->stride;
- buffer->num_verts++;
- }
-}
+struct pipe_vertex_buffer vl_vb_get_mv(struct vl_vertex_buffer *buffer, int ref_frame);
-void vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
+unsigned vl_vb_get_mv_stream_stride(struct vl_vertex_buffer *buffer);
+
+struct vl_motionvector *vl_vb_get_mv_stream(struct vl_vertex_buffer *buffer, int ref_frame);
-unsigned vl_vb_restart(struct vl_vertex_buffer *buffer);
+void vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
void vl_vb_cleanup(struct vl_vertex_buffer *buffer);
-#endif
+#endif /* vl_vertex_buffers_h */