r600g: don't leak driver const buffers
authorGrazvydas Ignotas <notasas@gmail.com>
Wed, 20 Jan 2016 23:52:24 +0000 (01:52 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 21 Jan 2016 20:36:24 +0000 (15:36 -0500)
The buffers are referenced from r600_update_driver_const_buffers()
 -> r600_set_constant_buffer() -> u_upload_data(), but nothing
ever releases the reference. Similar case with driver_consts.
Found using valgrind.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/r600/r600_pipe.c

index 08fdd361049d73501747b246049d08172adabd93..8abd60231f9ae2f63f4b0dee5f3b2072a81b1293 100644 (file)
@@ -68,6 +68,7 @@ static const struct debug_named_value r600_debug_options[] = {
 static void r600_destroy_context(struct pipe_context *context)
 {
        struct r600_context *rctx = (struct r600_context *)context;
+       unsigned sh;
 
        r600_isa_destroy(rctx->isa);
 
@@ -76,6 +77,11 @@ static void r600_destroy_context(struct pipe_context *context)
        pipe_resource_reference((struct pipe_resource**)&rctx->dummy_cmask, NULL);
        pipe_resource_reference((struct pipe_resource**)&rctx->dummy_fmask, NULL);
 
+       for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {
+               rctx->b.b.set_constant_buffer(&rctx->b.b, sh, R600_BUFFER_INFO_CONST_BUFFER, NULL);
+               free(rctx->driver_consts[sh].constants);
+       }
+
        if (rctx->fixed_func_tcs_shader)
                rctx->b.b.delete_tcs_state(&rctx->b.b, rctx->fixed_func_tcs_shader);