llvmpipe: Reuse llvmpipes LLVMContext in the draw context.
Reuse the LLVMContext already allocated in llvmpipe_context for draw_llvm if ppossible. This should decrease the memory footprint of an llvmpipe context. v2: Fix compile with llvm disabled. Reviewed-by: Jose Fonseca <jfonseca@vmware.com> Signed-off-by: Mathias Froehlich <Mathias.Froehlich@web.de>
This commit is contained in:
parent
d90ff351f3
commit
43e2109326
|
@ -81,7 +81,8 @@ draw_get_option_use_llvm(void)
|
||||||
* Create new draw module context with gallivm state for LLVM JIT.
|
* Create new draw module context with gallivm state for LLVM JIT.
|
||||||
*/
|
*/
|
||||||
static struct draw_context *
|
static struct draw_context *
|
||||||
draw_create_context(struct pipe_context *pipe, boolean try_llvm)
|
draw_create_context(struct pipe_context *pipe, void *context,
|
||||||
|
boolean try_llvm)
|
||||||
{
|
{
|
||||||
struct draw_context *draw = CALLOC_STRUCT( draw_context );
|
struct draw_context *draw = CALLOC_STRUCT( draw_context );
|
||||||
if (draw == NULL)
|
if (draw == NULL)
|
||||||
|
@ -92,7 +93,7 @@ draw_create_context(struct pipe_context *pipe, boolean try_llvm)
|
||||||
|
|
||||||
#if HAVE_LLVM
|
#if HAVE_LLVM
|
||||||
if (try_llvm && draw_get_option_use_llvm()) {
|
if (try_llvm && draw_get_option_use_llvm()) {
|
||||||
draw->llvm = draw_llvm_create(draw);
|
draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -120,17 +121,26 @@ err_out:
|
||||||
struct draw_context *
|
struct draw_context *
|
||||||
draw_create(struct pipe_context *pipe)
|
draw_create(struct pipe_context *pipe)
|
||||||
{
|
{
|
||||||
return draw_create_context(pipe, TRUE);
|
return draw_create_context(pipe, NULL, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if HAVE_LLVM
|
||||||
|
struct draw_context *
|
||||||
|
draw_create_with_llvm_context(struct pipe_context *pipe,
|
||||||
|
void *context)
|
||||||
|
{
|
||||||
|
return draw_create_context(pipe, context, TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new draw context, without LLVM JIT.
|
* Create a new draw context, without LLVM JIT.
|
||||||
*/
|
*/
|
||||||
struct draw_context *
|
struct draw_context *
|
||||||
draw_create_no_llvm(struct pipe_context *pipe)
|
draw_create_no_llvm(struct pipe_context *pipe)
|
||||||
{
|
{
|
||||||
return draw_create_context(pipe, FALSE);
|
return draw_create_context(pipe, NULL, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,11 @@ struct draw_so_target {
|
||||||
|
|
||||||
struct draw_context *draw_create( struct pipe_context *pipe );
|
struct draw_context *draw_create( struct pipe_context *pipe );
|
||||||
|
|
||||||
|
#if HAVE_LLVM
|
||||||
|
struct draw_context *draw_create_with_llvm_context(struct pipe_context *pipe,
|
||||||
|
void *context);
|
||||||
|
#endif
|
||||||
|
|
||||||
struct draw_context *draw_create_no_llvm(struct pipe_context *pipe);
|
struct draw_context *draw_create_no_llvm(struct pipe_context *pipe);
|
||||||
|
|
||||||
void draw_destroy( struct draw_context *draw );
|
void draw_destroy( struct draw_context *draw );
|
||||||
|
|
|
@ -480,7 +480,7 @@ get_vertex_header_ptr_type(struct draw_llvm_variant *variant)
|
||||||
* Create per-context LLVM info.
|
* Create per-context LLVM info.
|
||||||
*/
|
*/
|
||||||
struct draw_llvm *
|
struct draw_llvm *
|
||||||
draw_llvm_create(struct draw_context *draw)
|
draw_llvm_create(struct draw_context *draw, LLVMContextRef context)
|
||||||
{
|
{
|
||||||
struct draw_llvm *llvm;
|
struct draw_llvm *llvm;
|
||||||
|
|
||||||
|
@ -493,7 +493,11 @@ draw_llvm_create(struct draw_context *draw)
|
||||||
|
|
||||||
llvm->draw = draw;
|
llvm->draw = draw;
|
||||||
|
|
||||||
llvm->context = LLVMContextCreate();
|
llvm->context = context;
|
||||||
|
if (!llvm->context) {
|
||||||
|
llvm->context = LLVMContextCreate();
|
||||||
|
llvm->context_owned = true;
|
||||||
|
}
|
||||||
if (!llvm->context)
|
if (!llvm->context)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -517,7 +521,8 @@ fail:
|
||||||
void
|
void
|
||||||
draw_llvm_destroy(struct draw_llvm *llvm)
|
draw_llvm_destroy(struct draw_llvm *llvm)
|
||||||
{
|
{
|
||||||
LLVMContextDispose(llvm->context);
|
if (llvm->context_owned)
|
||||||
|
LLVMContextDispose(llvm->context);
|
||||||
llvm->context = NULL;
|
llvm->context = NULL;
|
||||||
|
|
||||||
/* XXX free other draw_llvm data? */
|
/* XXX free other draw_llvm data? */
|
||||||
|
|
|
@ -462,6 +462,7 @@ struct draw_llvm {
|
||||||
struct draw_context *draw;
|
struct draw_context *draw;
|
||||||
|
|
||||||
LLVMContextRef context;
|
LLVMContextRef context;
|
||||||
|
boolean context_owned;
|
||||||
|
|
||||||
struct draw_jit_context jit_context;
|
struct draw_jit_context jit_context;
|
||||||
struct draw_gs_jit_context gs_jit_context;
|
struct draw_gs_jit_context gs_jit_context;
|
||||||
|
@ -490,7 +491,7 @@ llvm_geometry_shader(struct draw_geometry_shader *gs)
|
||||||
|
|
||||||
|
|
||||||
struct draw_llvm *
|
struct draw_llvm *
|
||||||
draw_llvm_create(struct draw_context *draw);
|
draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context);
|
||||||
|
|
||||||
void
|
void
|
||||||
draw_llvm_destroy(struct draw_llvm *llvm);
|
draw_llvm_destroy(struct draw_llvm *llvm);
|
||||||
|
|
|
@ -171,7 +171,8 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
|
||||||
/*
|
/*
|
||||||
* Create drawing context and plug our rendering stage into it.
|
* Create drawing context and plug our rendering stage into it.
|
||||||
*/
|
*/
|
||||||
llvmpipe->draw = draw_create(&llvmpipe->pipe);
|
llvmpipe->draw = draw_create_with_llvm_context(&llvmpipe->pipe,
|
||||||
|
llvmpipe->context);
|
||||||
if (!llvmpipe->draw)
|
if (!llvmpipe->draw)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue