r600,compute: Plug few memory leaks

v2: drop inline keyword
    drop radeon_llvm_dispose_kernel_module wrapper

v3: move definitions to .c file
    use in radeonsi

Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Jan Vesely 2016-01-21 11:17:29 -05:00 committed by Marek Olšák
parent e1dcd333e4
commit efc4142acd
8 changed files with 55 additions and 21 deletions

View File

@ -225,7 +225,7 @@ void *evergreen_create_compute_state(
}
}
#else
memset(&shader->binary, 0, sizeof(shader->binary));
radeon_shader_binary_init(&shader->binary);
radeon_elf_read(code, header->num_bytes, &shader->binary);
r600_create_shader(&shader->bc, &shader->binary, &use_kill);
@ -245,13 +245,31 @@ void *evergreen_create_compute_state(
return shader;
}
void evergreen_delete_compute_state(struct pipe_context *ctx, void* state)
void evergreen_delete_compute_state(struct pipe_context *ctx_, void* state)
{
struct r600_pipe_compute *shader = (struct r600_pipe_compute *)state;
struct r600_context *ctx = (struct r600_context *)ctx_;
COMPUTE_DBG(ctx->screen, "*** evergreen_delete_compute_state\n");
struct r600_pipe_compute *shader = state;
if (!shader)
return;
#ifdef HAVE_OPENCL
#if HAVE_LLVM < 0x0306
for (unsigned i = 0; i < shader->num_kernels; i++) {
struct r600_kernel *kernel = &shader->kernels[i];
LLVMDisposeModule(module);
}
FREE(shader->kernels);
LLVMContextDispose(shader->llvm_ctx);
#else
radeon_shader_binary_clean(&shader->binary);
r600_destroy_shader(&shader->bc);
/* TODO destroy shader->code_bo, shader->const_bo
* we'll need something like r600_buffer_free */
#endif
#endif
FREE(shader);
}

View File

@ -910,6 +910,11 @@ unsigned r600_create_shader(struct r600_bytecode *bc,
return 0;
}
void r600_destroy_shader(struct r600_bytecode *bc)
{
FREE(bc->bytecode);
}
unsigned r600_llvm_compile(
LLVMModuleRef mod,
enum radeon_family family,
@ -922,17 +927,14 @@ unsigned r600_llvm_compile(
struct radeon_shader_binary binary;
const char * gpu_family = r600_get_llvm_processor_name(family);
memset(&binary, 0, sizeof(struct radeon_shader_binary));
radeon_shader_binary_init(&binary);
if (dump)
LLVMDumpModule(mod);
r = radeon_llvm_compile(mod, &binary, gpu_family, NULL, debug);
r = r600_create_shader(bc, &binary, use_kill);
FREE(binary.code);
FREE(binary.config);
FREE(binary.rodata);
FREE(binary.global_symbol_offsets);
radeon_shader_binary_clean(&binary);
return r;
}

View File

@ -30,6 +30,8 @@ unsigned r600_create_shader(struct r600_bytecode *bc,
const struct radeon_shader_binary *binary,
boolean *use_kill);
void r600_destroy_shader(struct r600_bytecode *bc);
void r600_shader_binary_read_config(const struct radeon_shader_binary *binary,
struct r600_bytecode *bc,
uint64_t symbol_offset,

View File

@ -48,6 +48,26 @@ struct r600_multi_fence {
struct pipe_fence_handle *sdma;
};
/*
* shader binary helpers.
*/
void radeon_shader_binary_init(struct radeon_shader_binary *b)
{
memset(b, 0, sizeof(*b));
}
void radeon_shader_binary_clean(struct radeon_shader_binary *b)
{
if (!b)
return;
FREE(b->code);
FREE(b->config);
FREE(b->rodata);
FREE(b->global_symbol_offsets);
FREE(b->relocs);
FREE(b->disasm_string);
}
/*
* pipe_context
*/

View File

@ -129,6 +129,9 @@ struct radeon_shader_binary {
char *disasm_string;
};
void radeon_shader_binary_init(struct radeon_shader_binary *b);
void radeon_shader_binary_clean(struct radeon_shader_binary *b);
struct r600_resource {
struct u_resource b;

View File

@ -461,9 +461,6 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){
LLVMContextDispose(program->llvm_ctx);
}
#else
FREE(program->shader.binary.config);
FREE(program->shader.binary.rodata);
FREE(program->shader.binary.global_symbol_offsets);
si_shader_destroy(&program->shader);
#endif

View File

@ -4423,14 +4423,6 @@ out:
return r;
}
void si_shader_destroy_binary(struct radeon_shader_binary *binary)
{
FREE(binary->code);
FREE(binary->rodata);
FREE(binary->relocs);
FREE(binary->disasm_string);
}
void si_shader_destroy(struct si_shader *shader)
{
if (shader->gs_copy_shader) {
@ -4442,5 +4434,6 @@ void si_shader_destroy(struct si_shader *shader)
r600_resource_reference(&shader->scratch_bo, NULL);
r600_resource_reference(&shader->bo, NULL);
si_shader_destroy_binary(&shader->binary);
radeon_shader_binary_clean(&shader->binary);
}

View File

@ -345,7 +345,6 @@ int si_compile_llvm(struct si_screen *sscreen,
struct pipe_debug_callback *debug,
unsigned processor);
void si_shader_destroy(struct si_shader *shader);
void si_shader_destroy_binary(struct radeon_shader_binary *binary);
unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader);
void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,