tgsi/ureg: add ureg_UARL shortcut (v2)
[mesa.git] / src / gallium / auxiliary / vl / vl_median_filter.c
index 0129013f637e9bf6187752f9609d52de5ea2b8e2..aa9a6b26485661c2392b5dc490027f18d151cde9 100644 (file)
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -39,8 +39,8 @@
 
 enum VS_OUTPUT
 {
-   VS_O_VPOS,
-   VS_O_VTEX
+   VS_O_VPOS = 0,
+   VS_O_VTEX = 0
 };
 
 static void *
@@ -82,6 +82,7 @@ create_frag_shader(struct vl_median_filter *filter,
    struct ureg_src i_vtex;
    struct ureg_src sampler;
    struct ureg_dst *t_array = MALLOC(sizeof(struct ureg_dst) * num_offsets);
+   struct ureg_dst o_fragment;
    const unsigned median = num_offsets >> 1;
    int i, j;
 
@@ -107,12 +108,9 @@ create_frag_shader(struct vl_median_filter *filter,
    i_vtex = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
    sampler = ureg_DECL_sampler(shader, 0);
 
-   for (i = 0; i < num_offsets; ++i) {
-      if (i == median)
-         t_array[i] = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
-      else
-         t_array[i] = ureg_DECL_temporary(shader);
-   }
+   for (i = 0; i < num_offsets; ++i)
+      t_array[i] = ureg_DECL_temporary(shader);
+   o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
 
    /*
     * t_array[0..*] = vtex + offset[0..*]
@@ -148,6 +146,7 @@ create_frag_shader(struct vl_median_filter *filter,
       else
          ureg_MIN(shader, t_array[j - 1], ureg_src(t_array[j]), ureg_src(t_array[j - 1]));
    }
+   ureg_MOV(shader, o_fragment, ureg_src(t_array[median]));
 
    ureg_END(shader);
 
@@ -165,7 +164,7 @@ generate_offsets(enum vl_median_filter_shape shape, unsigned size,
    assert(offsets && num_offsets);
 
    /* size needs to be odd */
-   size = align(size, 2) - 1;
+   size = align(size + 1, 2) - 1;
    half_size = size >> 1;
 
    switch(shape) {
@@ -249,13 +248,14 @@ vl_median_filter_init(struct vl_median_filter *filter, struct pipe_context *pipe
 
    assert(filter && pipe);
    assert(width && height);
-   assert(size > 0 && size < 20);
+   assert(size > 1 && size < 20);
 
    memset(filter, 0, sizeof(*filter));
    filter->pipe = pipe;
 
    memset(&rs_state, 0, sizeof(rs_state));
-   rs_state.gl_rasterization_rules = true;
+   rs_state.half_pixel_center = true;
+   rs_state.bottom_edge_rule = true;
    rs_state.depth_clip = 1;
    filter->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
    if (!filter->rs_state)
@@ -375,7 +375,6 @@ vl_median_filter_render(struct vl_median_filter *filter,
    viewport.scale[0] = dst->width;
    viewport.scale[1] = dst->height;
    viewport.scale[2] = 1;
-   viewport.scale[3] = 1;
 
    memset(&fb_state, 0, sizeof(fb_state));
    fb_state.width = dst->width;
@@ -385,13 +384,15 @@ vl_median_filter_render(struct vl_median_filter *filter,
 
    filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state);
    filter->pipe->bind_blend_state(filter->pipe, filter->blend);
-   filter->pipe->bind_fragment_sampler_states(filter->pipe, 1, &filter->sampler);
-   filter->pipe->set_fragment_sampler_views(filter->pipe, 1, &src);
+   filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,
+                                     0, 1, &filter->sampler);
+   filter->pipe->set_sampler_views(filter->pipe, PIPE_SHADER_FRAGMENT,
+                                   0, 1, &src);
    filter->pipe->bind_vs_state(filter->pipe, filter->vs);
    filter->pipe->bind_fs_state(filter->pipe, filter->fs);
    filter->pipe->set_framebuffer_state(filter->pipe, &fb_state);
-   filter->pipe->set_viewport_state(filter->pipe, &viewport);
-   filter->pipe->set_vertex_buffers(filter->pipe, 1, &filter->quad);
+   filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport);
+   filter->pipe->set_vertex_buffers(filter->pipe, 0, 1, &filter->quad);
    filter->pipe->bind_vertex_elements_state(filter->pipe, filter->ves);
 
    util_draw_arrays(filter->pipe, PIPE_PRIM_QUADS, 0, 4);