vl: fix a buffer leak in the bicubic filter by using an uploader
[mesa.git] / src / gallium / auxiliary / vl / vl_bicubic_filter.c
index 25bc58c38069c2e783b3078d4cbfbd44824a228d..570f153858314a9ea927a6fcff7f0321f4196a93 100644 (file)
@@ -35,6 +35,7 @@
 #include "util/u_memory.h"
 #include "util/u_math.h"
 #include "util/u_rect.h"
+#include "util/u_upload_mgr.h"
 
 #include "vl_types.h"
 #include "vl_vertex_buffers.h"
@@ -186,8 +187,8 @@ create_frag_shader(struct vl_bicubic_filter *filter, unsigned video_width,
     * t = frac(temp)
     * vtex = floor(i_vtex)/i_size
     */
-   ureg_SUB(shader, ureg_writemask(t_array[21], TGSI_WRITEMASK_XY),
-            i_vtex, half_pixel);
+   ureg_ADD(shader, ureg_writemask(t_array[21], TGSI_WRITEMASK_XY),
+            i_vtex, ureg_negate(half_pixel));
    ureg_MUL(shader, ureg_writemask(t_array[22], TGSI_WRITEMASK_XY),
             ureg_src(t_array[21]), ureg_imm2f(shader, video_width, video_height));
    ureg_FRC(shader, ureg_writemask(t, TGSI_WRITEMASK_XY),
@@ -242,7 +243,7 @@ vl_bicubic_filter_init(struct vl_bicubic_filter *filter, struct pipe_context *pi
 {
    struct pipe_rasterizer_state rs_state;
    struct pipe_blend_state blend;
-   struct vertex2f *offsets = NULL;
+   struct vertex2f offsets[16];
    struct pipe_sampler_state sampler;
    struct pipe_vertex_element ve;
    unsigned i;
@@ -301,10 +302,6 @@ vl_bicubic_filter_init(struct vl_bicubic_filter *filter, struct pipe_context *pi
    if (!filter->ves)
       goto error_ves;
 
-   offsets = MALLOC(sizeof(struct vertex2f) * 16);
-   if (!offsets)
-      goto error_offsets;
-
    offsets[0].x = -1.0f; offsets[0].y = -1.0f;
    offsets[1].x = 0.0f; offsets[1].y = -1.0f;
    offsets[2].x = 1.0f; offsets[2].y = -1.0f;
@@ -344,8 +341,6 @@ error_fs:
    pipe->delete_vs_state(pipe, filter->vs);
 
 error_vs:
-
-error_offsets:
    pipe->delete_vertex_elements_state(pipe, filter->ves);
 
 error_ves:
@@ -390,8 +385,7 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
    struct pipe_framebuffer_state fb_state;
    struct pipe_scissor_state scissor;
    union pipe_color_union clear_color;
-   struct pipe_transfer *buf_transfer;
-   struct pipe_resource *surface_size;
+
    assert(filter && src && dst);
 
    if (dst_clip) {
@@ -408,14 +402,6 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
 
    clear_color.f[0] = clear_color.f[1] = 0.0f;
    clear_color.f[2] = clear_color.f[3] = 0.0f;
-   surface_size = pipe_buffer_create
-   (
-      filter->pipe->screen,
-      PIPE_BIND_CONSTANT_BUFFER,
-      PIPE_USAGE_DEFAULT,
-      2*sizeof(float)
-   );
-
 
    memset(&viewport, 0, sizeof(viewport));
    if(dst_area){
@@ -429,14 +415,16 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
    }
    viewport.scale[2] = 1;
 
-   float *ptr = pipe_buffer_map(filter->pipe, surface_size,
-                               PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE,
-                               &buf_transfer);
+   struct pipe_constant_buffer cb = {};
+   float *ptr;
+
+   u_upload_alloc(filter->pipe->const_uploader, 0, 2 * sizeof(float), 256,
+                  &cb.buffer_offset, &cb.buffer, (void**)&ptr);
+   cb.buffer_size = 2 * sizeof(float);
 
    ptr[0] = 0.5f/viewport.scale[0];
    ptr[1] = 0.5f/viewport.scale[1];
-
-   pipe_buffer_unmap(filter->pipe, buf_transfer);
+   u_upload_unmap(filter->pipe->const_uploader);
 
    memset(&fb_state, 0, sizeof(fb_state));
    fb_state.width = dst->width;
@@ -446,8 +434,9 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter,
 
    filter->pipe->set_scissor_states(filter->pipe, 0, 1, &scissor);
    filter->pipe->clear_render_target(filter->pipe, dst, &clear_color,
-                                     0, 0, dst->width, dst->height);
-   pipe_set_constant_buffer(filter->pipe, PIPE_SHADER_FRAGMENT, 0, surface_size);
+                                     0, 0, dst->width, dst->height, false);
+   filter->pipe->set_constant_buffer(filter->pipe, PIPE_SHADER_FRAGMENT,
+                                     0, &cb);
    filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state);
    filter->pipe->bind_blend_state(filter->pipe, filter->blend);
    filter->pipe->bind_sampler_states(filter->pipe, PIPE_SHADER_FRAGMENT,