#ifndef vl_idct_h
#define vl_idct_h
-#include <pipe/p_state.h>
-#include "vl_vertex_buffers.h"
+#include "pipe/p_state.h"
+#include "tgsi/tgsi_ureg.h"
+
+/* shader based inverse distinct cosinus transformation
+ * expect usage of vl_vertex_buffers as a todo list
+ */
struct vl_idct
{
struct pipe_context *pipe;
unsigned buffer_width;
unsigned buffer_height;
-
- unsigned max_blocks;
+ unsigned nr_of_render_targets;
void *rs_state;
- void *vertex_elems_state;
-
- union
- {
- void *all[4];
- void *stage[2][2];
- struct {
- void *matrix, *source;
- void *transpose, *intermediate;
- } individual;
- } samplers;
+ void *blend;
- void *vs;
- void *matrix_fs, *transpose_fs;
+ void *samplers[2];
- struct pipe_resource *matrix;
- struct pipe_vertex_buffer quad;
+ void *vs_mismatch, *fs_mismatch;
+ void *vs, *fs;
- unsigned vertex_buffer_stride;
+ struct pipe_sampler_view *matrix;
+ struct pipe_sampler_view *transpose;
};
+/* a set of buffers to work with */
struct vl_idct_buffer
{
- struct pipe_viewport_state viewport[2];
- struct pipe_framebuffer_state fb_state[2];
+ struct pipe_viewport_state viewport_mismatch;
+ struct pipe_viewport_state viewport;
- struct pipe_resource *destination;
+ struct pipe_framebuffer_state fb_state_mismatch;
+ struct pipe_framebuffer_state fb_state;
union
{
struct pipe_sampler_view *all[4];
struct pipe_sampler_view *stage[2][2];
struct {
- struct pipe_sampler_view *matrix, *source;
- struct pipe_sampler_view *transpose, *intermediate;
+ struct pipe_sampler_view *source, *matrix;
+ struct pipe_sampler_view *intermediate, *transpose;
} individual;
} sampler_views;
-
- union
- {
- struct pipe_resource *all[4];
- struct pipe_resource *stage[2][2];
- struct {
- struct pipe_resource *matrix, *source;
- struct pipe_resource *transpose, *intermediate;
- } individual;
- } textures;
-
- union
- {
- struct pipe_vertex_buffer all[2];
- struct { struct pipe_vertex_buffer quad, pos; } individual;
- } vertex_bufs;
-
- struct vl_vertex_buffer blocks;
-
- struct pipe_transfer *tex_transfer;
- short *texels;
};
-struct pipe_resource *vl_idct_upload_matrix(struct pipe_context *pipe);
-
-bool vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe,
- unsigned buffer_width, unsigned buffer_height,
- struct pipe_resource *matrix);
-
-void vl_idct_cleanup(struct vl_idct *idct);
-
-bool vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer, struct pipe_resource *dst);
-
-void vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer);
-
-void vl_idct_map_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer);
-
-void vl_idct_add_block(struct vl_idct_buffer *buffer, unsigned x, unsigned y, short *block);
-
-void vl_idct_unmap_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer);
-
-void vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer);
+/* upload the idct matrix, which can be shared by all idct instances of a pipe */
+struct pipe_sampler_view *
+vl_idct_upload_matrix(struct pipe_context *pipe, float scale);
+
+void
+vl_idct_stage2_vert_shader(struct vl_idct *idct, struct ureg_program *shader,
+ unsigned first_output, struct ureg_dst tex);
+
+void
+vl_idct_stage2_frag_shader(struct vl_idct *idct, struct ureg_program *shader,
+ unsigned first_input, struct ureg_dst fragment);
+
+/* init an idct instance */
+bool
+vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe,
+ unsigned buffer_width, unsigned buffer_height,
+ unsigned nr_of_render_targets,
+ struct pipe_sampler_view *matrix,
+ struct pipe_sampler_view *transpose);
+
+/* destroy an idct instance */
+void
+vl_idct_cleanup(struct vl_idct *idct);
+
+/* init a buffer assosiated with agiven idct instance */
+bool
+vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
+ struct pipe_sampler_view *source,
+ struct pipe_sampler_view *intermediate);
+
+/* cleanup a buffer of an idct instance */
+void
+vl_idct_cleanup_buffer(struct vl_idct_buffer *buffer);
+
+/* flush the buffer and start rendering, vertex buffers needs to be setup before calling this */
+void
+vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_verts);
+
+void
+vl_idct_prepare_stage2(struct vl_idct *idct, struct vl_idct_buffer *buffer);
#endif