radeon/compute: Stop leaking LLVMContexts in radeon_llvm_parse_bitcode
[mesa.git] / src / gallium / drivers / radeonsi / radeonsi_compute.c
index 2d53f2d9864d85f6790c4d4c02a730c607bc7d6e..214ea3c25525feba541b37482e22c75c2b0c3e42 100644 (file)
@@ -20,6 +20,7 @@ struct si_pipe_compute {
 
         struct pipe_resource *global_buffers[MAX_GLOBAL_BUFFERS];
 
+       LLVMContextRef llvm_ctx;
 };
 
 static void *radeonsi_create_compute_state(
@@ -33,6 +34,8 @@ static void *radeonsi_create_compute_state(
        const unsigned char *code;
        unsigned i;
 
+       program->llvm_ctx = LLVMContextCreate();
+
        header = cso->prog;
        code = cso->prog + sizeof(struct pipe_llvm_program_header);
 
@@ -41,13 +44,13 @@ static void *radeonsi_create_compute_state(
        program->private_size = cso->req_private_mem;
        program->input_size = cso->req_input_mem;
 
-       program->num_kernels = radeon_llvm_get_num_kernels(code,
+       program->num_kernels = radeon_llvm_get_num_kernels(program->llvm_ctx, code,
                                                        header->num_bytes);
        program->kernels = CALLOC(sizeof(struct si_pipe_shader),
                                                        program->num_kernels);
        for (i = 0; i < program->num_kernels; i++) {
-               LLVMModuleRef mod = radeon_llvm_get_kernel_module(i, code,
-                                                       header->num_bytes);
+               LLVMModuleRef mod = radeon_llvm_get_kernel_module(program->llvm_ctx, i,
+                                                       code, header->num_bytes);
                si_compile_llvm(rctx, &program->kernels[i], mod);
                LLVMDisposeModule(mod);
        }
@@ -272,6 +275,10 @@ static void si_delete_compute_state(struct pipe_context *ctx, void* state){
                FREE(program->kernels);
        }
 
+       if (program->llvm_ctx){
+               LLVMContextDispose(program->llvm_ctx);
+       }
+
        //And then free the program itself.
        FREE(program);
 }