diff options
author | Mathias Fröhlich <Mathias.Froehlich@gmx.net> | 2014-08-28 19:49:35 +0200 |
---|---|---|
committer | Mathias Fröhlich <Mathias.Froehlich@gmx.net> | 2014-09-30 20:45:19 +0200 |
commit | 83c62597fc8eb38bf274fa1a3ca03c6adafb4bf9 (patch) | |
tree | 512da771be3fa564311d151785c62eb06ad40a64 /src/gallium/auxiliary/draw | |
parent | 98d00d664009c74ac0c827b3c41c15e3fe1993d4 (diff) | |
download | external_mesa3d-83c62597fc8eb38bf274fa1a3ca03c6adafb4bf9.zip external_mesa3d-83c62597fc8eb38bf274fa1a3ca03c6adafb4bf9.tar.gz external_mesa3d-83c62597fc8eb38bf274fa1a3ca03c6adafb4bf9.tar.bz2 |
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 <jfonseca@vmware.com>
Signed-off-by: Mathias Froehlich <Mathias.Froehlich@web.de>
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.c | 15 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.h | 2 |
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 504f3ef..8469d69 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 ed97cf7..a4bd1ed 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; |