Re: [Mesa-dev] [PATCH 3/3] llvmpipe/draw: Fix texture sampling in geometry shaders
On 03/26/2013 06:56 PM, Zack Rusin wrote: We weren't correctly propagating the samplers and sampler views when they were related to geometry shaders. Signed-off-by: Zack Rusinza...@vmware.com --- src/gallium/auxiliary/draw/draw_context.c |4 +- src/gallium/auxiliary/draw/draw_llvm.c | 83 --- src/gallium/auxiliary/draw/draw_llvm.h | 31 +++--- src/gallium/drivers/llvmpipe/lp_context.c |4 + src/gallium/drivers/llvmpipe/lp_context.h |1 + src/gallium/drivers/llvmpipe/lp_draw_arrays.c |4 + src/gallium/drivers/llvmpipe/lp_state.h |8 ++ src/gallium/drivers/llvmpipe/lp_state_sampler.c | 127 +++ 8 files changed, 205 insertions(+), 57 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index d64b82b..ceb74df 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -792,8 +792,8 @@ draw_set_samplers(struct draw_context *draw, draw-num_samplers[shader_stage] = num; #ifdef HAVE_LLVM - if (draw-llvm shader_stage == PIPE_SHADER_VERTEX) - draw_llvm_set_sampler_state(draw); + if (draw-llvm) + draw_llvm_set_sampler_state(draw, shader_stage); #endif } diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index f857183..3e47452 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -249,17 +249,17 @@ create_gs_jit_context_type(struct gallivm_state *gallivm, elem_types[1] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), DRAW_TOTAL_CLIP_PLANES), 0); elem_types[2] = LLVMPointerType(float_type, 0); /* viewport */ - - elem_types[3] = LLVMPointerType(LLVMPointerType(int_type, 0), 0); - elem_types[4] = LLVMPointerType(LLVMVectorType(int_type, - vector_length), 0); - elem_types[5] = LLVMPointerType(LLVMVectorType(int_type, - vector_length), 0); - elem_types[6] = LLVMArrayType(texture_type, + elem_types[3] = LLVMArrayType(texture_type, PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */ - elem_types[7] = LLVMArrayType(sampler_type, + elem_types[4] = LLVMArrayType(sampler_type, PIPE_MAX_SAMPLERS); /* samplers */ + + elem_types[5] = LLVMPointerType(LLVMPointerType(int_type, 0), 0); + elem_types[6] = LLVMPointerType(LLVMVectorType(int_type, + vector_length), 0); + elem_types[7] = LLVMPointerType(LLVMVectorType(int_type, + vector_length), 0); context_type = LLVMStructTypeInContext(gallivm-context, elem_types, Elements(elem_types), 0); @@ -275,18 +275,18 @@ create_gs_jit_context_type(struct gallivm_state *gallivm, target, context_type, 1); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, viewport, target, context_type, 2); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths, - target, context_type, 3); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_vertices, - target, context_type, 4); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_prims, - target, context_type, 5); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, textures, target, context_type, - DRAW_GS_JIT_CTX_TEXTURES); + DRAW_JIT_CTX_TEXTURES); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, samplers, target, context_type, - DRAW_GS_JIT_CTX_SAMPLERS); + DRAW_JIT_CTX_SAMPLERS); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths, + target, context_type, 5); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_vertices, + target, context_type, 6); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_prims, + target, context_type, 7); LP_CHECK_STRUCT_SIZE(struct draw_gs_jit_context, target, context_type); @@ -1721,33 +1721,36 @@ draw_llvm_set_mapped_texture(struct draw_context *draw, void -draw_llvm_set_sampler_state(struct draw_context *draw) +draw_llvm_set_sampler_state(struct draw_context *draw, +unsigned shader_type) { unsigned i; - for (i = 0; i draw-num_samplers[PIPE_SHADER_VERTEX]; i++) { - struct draw_jit_sampler *jit_sam =draw-llvm-jit_context.samplers[i]; - - if (draw-samplers[i]) { -
[Mesa-dev] [PATCH 3/3] llvmpipe/draw: Fix texture sampling in geometry shaders
We weren't correctly propagating the samplers and sampler views when they were related to geometry shaders. Signed-off-by: Zack Rusin za...@vmware.com --- src/gallium/auxiliary/draw/draw_context.c |4 +- src/gallium/auxiliary/draw/draw_llvm.c | 83 --- src/gallium/auxiliary/draw/draw_llvm.h | 31 +++--- src/gallium/drivers/llvmpipe/lp_context.c |4 + src/gallium/drivers/llvmpipe/lp_context.h |1 + src/gallium/drivers/llvmpipe/lp_draw_arrays.c |4 + src/gallium/drivers/llvmpipe/lp_state.h |8 ++ src/gallium/drivers/llvmpipe/lp_state_sampler.c | 127 +++ 8 files changed, 205 insertions(+), 57 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index d64b82b..ceb74df 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -792,8 +792,8 @@ draw_set_samplers(struct draw_context *draw, draw-num_samplers[shader_stage] = num; #ifdef HAVE_LLVM - if (draw-llvm shader_stage == PIPE_SHADER_VERTEX) - draw_llvm_set_sampler_state(draw); + if (draw-llvm) + draw_llvm_set_sampler_state(draw, shader_stage); #endif } diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index f857183..3e47452 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -249,17 +249,17 @@ create_gs_jit_context_type(struct gallivm_state *gallivm, elem_types[1] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), DRAW_TOTAL_CLIP_PLANES), 0); elem_types[2] = LLVMPointerType(float_type, 0); /* viewport */ - - elem_types[3] = LLVMPointerType(LLVMPointerType(int_type, 0), 0); - elem_types[4] = LLVMPointerType(LLVMVectorType(int_type, - vector_length), 0); - elem_types[5] = LLVMPointerType(LLVMVectorType(int_type, - vector_length), 0); - elem_types[6] = LLVMArrayType(texture_type, + elem_types[3] = LLVMArrayType(texture_type, PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */ - elem_types[7] = LLVMArrayType(sampler_type, + elem_types[4] = LLVMArrayType(sampler_type, PIPE_MAX_SAMPLERS); /* samplers */ + + elem_types[5] = LLVMPointerType(LLVMPointerType(int_type, 0), 0); + elem_types[6] = LLVMPointerType(LLVMVectorType(int_type, + vector_length), 0); + elem_types[7] = LLVMPointerType(LLVMVectorType(int_type, + vector_length), 0); context_type = LLVMStructTypeInContext(gallivm-context, elem_types, Elements(elem_types), 0); @@ -275,18 +275,18 @@ create_gs_jit_context_type(struct gallivm_state *gallivm, target, context_type, 1); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, viewport, target, context_type, 2); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths, - target, context_type, 3); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_vertices, - target, context_type, 4); - LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_prims, - target, context_type, 5); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, textures, target, context_type, - DRAW_GS_JIT_CTX_TEXTURES); + DRAW_JIT_CTX_TEXTURES); LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, samplers, target, context_type, - DRAW_GS_JIT_CTX_SAMPLERS); + DRAW_JIT_CTX_SAMPLERS); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths, + target, context_type, 5); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_vertices, + target, context_type, 6); + LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_prims, + target, context_type, 7); LP_CHECK_STRUCT_SIZE(struct draw_gs_jit_context, target, context_type); @@ -1721,33 +1721,36 @@ draw_llvm_set_mapped_texture(struct draw_context *draw, void -draw_llvm_set_sampler_state(struct draw_context *draw) +draw_llvm_set_sampler_state(struct draw_context *draw, +unsigned shader_type) { unsigned i; - for (i = 0; i draw-num_samplers[PIPE_SHADER_VERTEX]; i++) { - struct draw_jit_sampler *jit_sam = draw-llvm-jit_context.samplers[i]; - - if (draw-samplers[i]) { - const struct pipe_sampler_state *s -=