summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/draw
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2014-08-28 19:49:35 +0200
committerMathias Fröhlich <[email protected]>2014-09-30 20:45:19 +0200
commit83c62597fc8eb38bf274fa1a3ca03c6adafb4bf9 (patch)
tree512da771be3fa564311d151785c62eb06ad40a64 /src/gallium/auxiliary/draw
parent98d00d664009c74ac0c827b3c41c15e3fe1993d4 (diff)
llvmpipe: Use two LLVMContexts per OpenGL context instead of a global one.
This is one step to make llvmpipe thread safe as mandated by the OpenGL standard. Using the global LLVMContext is obviously a problem for that kind of use pattern. The patch introduces two LLVMContext instances that are private to an OpenGL context and used for all compiles. One is put into struct draw_llvm and the other one into struct llvmpipe_context. Reviewed-by: Jose Fonseca <[email protected]> Signed-off-by: Mathias Froehlich <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.c15
-rw-r--r--src/gallium/auxiliary/draw/draw_llvm.h2
2 files changed, 15 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index 504f3efab2e..8469d6999b1 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_llvm.c
@@ -493,6 +493,10 @@ draw_llvm_create(struct draw_context *draw)
llvm->draw = draw;
+ llvm->context = LLVMContextCreate();
+ if (!llvm->context)
+ goto fail;
+
llvm->nr_variants = 0;
make_empty_list(&llvm->vs_variants_list);
@@ -500,6 +504,10 @@ draw_llvm_create(struct draw_context *draw)
make_empty_list(&llvm->gs_variants_list);
return llvm;
+
+fail:
+ draw_llvm_destroy(llvm);
+ return NULL;
}
@@ -509,6 +517,9 @@ draw_llvm_create(struct draw_context *draw)
void
draw_llvm_destroy(struct draw_llvm *llvm)
{
+ LLVMContextDispose(llvm->context);
+ llvm->context = NULL;
+
/* XXX free other draw_llvm data? */
FREE(llvm);
}
@@ -540,7 +551,7 @@ draw_llvm_create_variant(struct draw_llvm *llvm,
util_snprintf(module_name, sizeof(module_name), "draw_llvm_vs_variant%u",
variant->shader->variants_cached);
- variant->gallivm = gallivm_create(module_name);
+ variant->gallivm = gallivm_create(module_name, llvm->context);
create_jit_types(variant);
@@ -2195,7 +2206,7 @@ draw_gs_llvm_create_variant(struct draw_llvm *llvm,
util_snprintf(module_name, sizeof(module_name), "draw_llvm_gs_variant%u",
variant->shader->variants_cached);
- variant->gallivm = gallivm_create(module_name);
+ variant->gallivm = gallivm_create(module_name, llvm->context);
create_gs_jit_types(variant);
diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h
index ed97cf72115..a4bd1edcf0d 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.h
+++ b/src/gallium/auxiliary/draw/draw_llvm.h
@@ -461,6 +461,8 @@ struct llvm_geometry_shader {
struct draw_llvm {
struct draw_context *draw;
+ LLVMContextRef context;
+
struct draw_jit_context jit_context;
struct draw_gs_jit_context gs_jit_context;