[g3dvl] keep a pointer in idct buffer to idct object
[mesa.git] / src / gallium / auxiliary / vl / vl_idct.h
index 01df3f9103fd229bec81019708d500077bbe734d..98e2c795564be544021c34f6cfc564d7cd18ce7e 100644 (file)
 
 #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 max_blocks;
+   unsigned buffer_width;
+   unsigned buffer_height;
+   unsigned nr_of_render_targets;
 
-   struct pipe_viewport_state viewport;
-   struct pipe_resource *vs_const_buf;
-   struct pipe_framebuffer_state fb_state;
+   void *rs_state;
+   void *blend;
 
-   struct pipe_resource *destination;
+   void *samplers[2];
 
-   void *vertex_elems_state;
+   void *vs_mismatch, *fs_mismatch;
+   void *vs, *fs;
 
-   union
-   {
-      void *all[4];
-      void *stage[2][2];
-      struct {
-         void *transpose, *source;
-         void *matrix, *intermediate;
-      } individual;
-   } samplers;
+   struct pipe_sampler_view *matrix;
+   struct pipe_sampler_view *transpose;
+};
+
+/* a set of buffers to work with */
+struct vl_idct_buffer
+{
+   struct vl_idct *idct;
+   
+   struct pipe_viewport_state viewport_mismatch;
+   struct pipe_viewport_state viewport;
+
+   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 *transpose, *source;
-         struct pipe_sampler_view *matrix, *intermediate;
+         struct pipe_sampler_view *source, *matrix;
+         struct pipe_sampler_view *intermediate, *transpose;
       } individual;
    } sampler_views;
-
-   void *vs;
-   void *transpose_fs, *matrix_fs, *eb_fs;
-
-   union
-   {
-      struct pipe_resource *all[4];
-      struct pipe_resource *stage[2][2];
-      struct {
-         struct pipe_resource *transpose, *source;
-         struct pipe_resource *matrix, *intermediate;
-      } individual;
-   } textures;
-
-   union
-   {
-      struct pipe_vertex_buffer all[2];
-      struct { struct pipe_vertex_buffer quad, pos; } individual;
-   } vertex_bufs;
-
-   unsigned num_blocks;
-   unsigned num_empty_blocks;
-
-   struct pipe_transfer *tex_transfer;
-   short *texels;
-
-   struct pipe_transfer *vec_transfer;
-   struct vertex2f *vectors;
-
-   struct {
-      struct pipe_surface *intermediate, *destination;
-   } surfaces;
 };
 
-bool vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe, struct pipe_resource *dst);
-
-void vl_idct_cleanup(struct vl_idct *idct);
-
-void vl_idct_add_block(struct vl_idct *idct, unsigned x, unsigned y, short *block);
-
-void vl_idct_flush(struct vl_idct *idct);
+/* 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_buffer *buffer, unsigned num_verts);
+
+void
+vl_idct_prepare_stage2(struct vl_idct_buffer *buffer);
 
 #endif