gallivm: implement implicit primitive flushing
[mesa.git] / src / gallium / auxiliary / vl / vl_idct.h
index 6076bdec46c2d56052f8b99f2db18dfaa8329cb4..575a6206742287242634628170208790be7caa87 100644 (file)
 #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