vl: seperate shader buffers from components
[mesa.git] / src / gallium / auxiliary / vl / vl_idct.c
index 45180499e2eb0ce961d3d413cf418e99380c6eab..325551aad0d49b4571c4f0fcfb87f8961cb2588f 100644 (file)
 
 #include <assert.h>
 
-#include <pipe/p_context.h>
-#include <pipe/p_screen.h>
+#include "pipe/p_context.h"
+#include "pipe/p_screen.h"
 
-#include <util/u_draw.h>
-#include <util/u_sampler.h>
+#include "util/u_draw.h"
+#include "util/u_sampler.h"
+#include "util/u_memory.h"
 
-#include <tgsi/tgsi_ureg.h>
+#include "tgsi/tgsi_ureg.h"
 
 #include "vl_defines.h"
 #include "vl_types.h"
@@ -142,7 +143,7 @@ static void *
 create_mismatch_vert_shader(struct vl_idct *idct)
 {
    struct ureg_program *shader;
-   struct ureg_src vrect, vpos;
+   struct ureg_src vpos;
    struct ureg_src scale;
    struct ureg_dst t_tex;
    struct ureg_dst o_vpos, o_addr[2];
@@ -151,7 +152,6 @@ create_mismatch_vert_shader(struct vl_idct *idct)
    if (!shader)
       return NULL;
 
-   vrect = ureg_DECL_vs_input(shader, VS_I_RECT);
    vpos = ureg_DECL_vs_input(shader, VS_I_VPOS);
 
    t_tex = ureg_DECL_temporary(shader);
@@ -219,7 +219,9 @@ create_mismatch_frag_shader(struct vl_idct *idct)
    }
 
    for (i = 0; i < 8; ++i) {
-      struct ureg_src s_addr[2] = { ureg_src(m[i][0]), ureg_src(m[i][1]) };
+      struct ureg_src s_addr[2];
+      s_addr[0] = ureg_src(m[i][0]);
+      s_addr[1] = ureg_src(m[i][1]);
       fetch_four(shader, m[i], s_addr, ureg_DECL_sampler(shader, 0), false);
    }
 
@@ -323,7 +325,7 @@ create_stage1_frag_shader(struct vl_idct *idct)
    struct ureg_src l_addr[2], r_addr[2];
 
    struct ureg_dst l[4][2], r[2];
-   struct ureg_dst fragment[idct->nr_of_render_targets];
+   struct ureg_dst *fragment;
 
    int i, j;
 
@@ -331,6 +333,8 @@ create_stage1_frag_shader(struct vl_idct *idct)
    if (!shader)
       return NULL;
 
+   fragment = MALLOC(idct->nr_of_render_targets * sizeof(struct ureg_dst));
+
    l_addr[0] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_L_ADDR0, TGSI_INTERPOLATE_LINEAR);
    l_addr[1] = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_L_ADDR1, TGSI_INTERPOLATE_LINEAR);
 
@@ -353,14 +357,19 @@ create_stage1_frag_shader(struct vl_idct *idct)
    }
 
    for (i = 0; i < 4; ++i) {
-      struct ureg_src s_addr[2] = { ureg_src(l[i][0]), ureg_src(l[i][1]) };
+      struct ureg_src s_addr[2];
+      s_addr[0] = ureg_src(l[i][0]);
+      s_addr[1] = ureg_src(l[i][1]);
       fetch_four(shader, l[i], s_addr, ureg_DECL_sampler(shader, 0), false);
    }
 
    for (i = 0; i < idct->nr_of_render_targets; ++i) {
+      struct ureg_src s_addr[2];
+
       increment_addr(shader, r, r_addr, true, true, i - (signed)idct->nr_of_render_targets / 2, BLOCK_HEIGHT);
 
-      struct ureg_src s_addr[2] = { ureg_src(r[0]), ureg_src(r[1]) };
+      s_addr[0] = ureg_src(r[0]);
+      s_addr[1] = ureg_src(r[1]);
       fetch_four(shader, r, s_addr, ureg_DECL_sampler(shader, 1), false);
 
       for (j = 0; j < 4; ++j) {
@@ -377,6 +386,8 @@ create_stage1_frag_shader(struct vl_idct *idct)
 
    ureg_END(shader);
 
+   FREE(fragment);
+
    return ureg_create_shader_and_destroy(shader, idct->pipe);
 }
 
@@ -603,9 +614,9 @@ init_source(struct vl_idct *idct, struct vl_idct_buffer *buffer)
 }
 
 static void
-cleanup_source(struct vl_idct *idct, struct vl_idct_buffer *buffer)
+cleanup_source(struct vl_idct_buffer *buffer)
 {
-   assert(idct && buffer);
+   assert(buffer);
 
    pipe_surface_reference(&buffer->fb_state_mismatch.cbufs[0], NULL);
 
@@ -654,13 +665,13 @@ error_surfaces:
 }
 
 static void
-cleanup_intermediate(struct vl_idct *idct, struct vl_idct_buffer *buffer)
+cleanup_intermediate(struct vl_idct_buffer *buffer)
 {
    unsigned i;
 
-   assert(idct && buffer);
+   assert(buffer);
 
-   for(i = 0; i < idct->nr_of_render_targets; ++i)
+   for(i = 0; i < PIPE_MAX_COLOR_BUFS; ++i)
       pipe_surface_reference(&buffer->fb_state.cbufs[i], NULL);
 
    pipe_sampler_view_reference(&buffer->sampler_views.individual.intermediate, NULL);
@@ -749,7 +760,8 @@ bool vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe,
                   struct pipe_sampler_view *matrix,
                   struct pipe_sampler_view *transpose)
 {
-   assert(idct && pipe && matrix);
+   assert(idct && pipe);
+   assert(matrix && transpose);
 
    idct->pipe = pipe;
    idct->buffer_width = buffer_width;
@@ -777,6 +789,7 @@ vl_idct_cleanup(struct vl_idct *idct)
    cleanup_state(idct);
 
    pipe_sampler_view_reference(&idct->matrix, NULL);
+   pipe_sampler_view_reference(&idct->transpose, NULL);
 }
 
 bool
@@ -784,9 +797,8 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
                     struct pipe_sampler_view *source,
                     struct pipe_sampler_view *intermediate)
 {
-   assert(buffer);
-   assert(idct);
-   assert(source);
+   assert(buffer && idct);
+   assert(source && intermediate);
 
    memset(buffer, 0, sizeof(struct vl_idct_buffer));
 
@@ -805,18 +817,20 @@ vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
 }
 
 void
-vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer)
+vl_idct_cleanup_buffer(struct vl_idct_buffer *buffer)
 {
-   assert(idct && buffer);
+   assert(buffer);
+
+   cleanup_source(buffer);
+   cleanup_intermediate(buffer);
 
-   cleanup_source(idct, buffer);
-   cleanup_intermediate(idct, buffer);
+   pipe_sampler_view_reference(&buffer->sampler_views.individual.matrix, NULL);
+   pipe_sampler_view_reference(&buffer->sampler_views.individual.transpose, NULL);
 }
 
 void
 vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_instances)
 {
-   assert(idct);
    assert(buffer);
 
    idct->pipe->bind_rasterizer_state(idct->pipe, idct->rs_state);
@@ -842,7 +856,6 @@ vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_
 void
 vl_idct_prepare_stage2(struct vl_idct *idct, struct vl_idct_buffer *buffer)
 {
-   assert(idct);
    assert(buffer);
 
    /* second stage */