vl: fix a buffer leak in the bicubic filter by using an uploader
there's no error checking, because the previous code didn't do it either. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -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"
|
||||
@@ -384,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) {
|
||||
@@ -402,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){
|
||||
@@ -423,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;
|
||||
@@ -441,7 +435,8 @@ 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, false);
|
||||
pipe_set_constant_buffer(filter->pipe, PIPE_SHADER_FRAGMENT, 0, surface_size);
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user