Re: [Mesa-dev] [PATCH 3/3] llvmpipe/draw: Fix texture sampling in geometry shaders

2013-03-27 Thread Brian Paul

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

2013-03-26 Thread Zack Rusin
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
-=