[Mesa-dev] [PATCH] llvmpipe: fix possible constant buffer overflow

Jose Fonseca jfonseca at vmware.com
Thu Dec 19 09:39:45 PST 2013


Looks great to me.

----- Original Message -----
> It's possible to bind a smaller buffer as a constant buffer, than
> what the shader actually uses/requires. This could cause nasty
> crashes. This patch adds the architecture to pass the maximum
> allowable constant buffer index to the jit so let it make
> sure that the constant buffer indices are always within bounds.
> Currently only used for indirect addressing.
> 
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
>  src/gallium/auxiliary/draw/draw_llvm.c             | 42
>  +++++++++++++++-------
>  src/gallium/auxiliary/draw/draw_llvm.h             | 32 +++++++++++------
>  .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |  6 ++++
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi.h        |  2 ++
>  src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c    | 14 +++++++-
>  src/gallium/drivers/llvmpipe/lp_jit.c              |  7 +++-
>  src/gallium/drivers/llvmpipe/lp_jit.h              |  5 +++
>  src/gallium/drivers/llvmpipe/lp_setup.c            |  7 +++-
>  src/gallium/drivers/llvmpipe/lp_state_fs.c         |  6 ++--
>  9 files changed, 92 insertions(+), 29 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c
> b/src/gallium/auxiliary/draw/draw_llvm.c
> index 71cc45f..e5a3842 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -242,17 +242,20 @@ create_jit_context_type(struct gallivm_state *gallivm,
>  {
>     LLVMTargetDataRef target = gallivm->target;
>     LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
> +   LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context);
>     LLVMTypeRef elem_types[DRAW_JIT_CTX_NUM_FIELDS];
>     LLVMTypeRef context_type;
>  
>     elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /*
>     vs_constants */
>                                   LP_MAX_TGSI_CONST_BUFFERS);
> -   elem_types[1] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type,
> 4),
> +   elem_types[1] = LLVMArrayType(int_type, /* vs_constants_max_index */
> +                                 LP_MAX_TGSI_CONST_BUFFERS);
> +   elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type,
> 4),

In the future I think we could just use the 

   elem_types[DRAW_JIT_CTX_xxx] = ...

to avoid having renumbering these indices.

>                                                   DRAW_TOTAL_CLIP_PLANES),
>                                                   0);
> -   elem_types[2] = LLVMPointerType(float_type, 0); /* viewport */
> -   elem_types[3] = LLVMArrayType(texture_type,
> +   elem_types[3] = LLVMPointerType(float_type, 0); /* viewport */
> +   elem_types[4] = LLVMArrayType(texture_type,
>                                   PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures
>                                   */
> -   elem_types[4] = LLVMArrayType(sampler_type,
> +   elem_types[5] = LLVMArrayType(sampler_type,
>                                   PIPE_MAX_SAMPLERS); /* samplers */
>     context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
>                                            Elements(elem_types), 0);
> @@ -264,6 +267,8 @@ create_jit_context_type(struct gallivm_state *gallivm,
>  
>     LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, vs_constants,
>                            target, context_type, DRAW_JIT_CTX_CONSTANTS);
> +   LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, vs_constants_max_index,
> +                          target, context_type,
> DRAW_JIT_CTX_CONSTANTS_MAX_INDEX);
>     LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, planes,
>                            target, context_type, DRAW_JIT_CTX_PLANES);
>     LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, viewport,
> @@ -298,20 +303,22 @@ create_gs_jit_context_type(struct gallivm_state
> *gallivm,
>  
>     elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /*
>     constants */
>                                   LP_MAX_TGSI_CONST_BUFFERS);
> -   elem_types[1] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type,
> 4),
> +   elem_types[1] = LLVMArrayType(int_type, /* constants_max_index */
> +                                 LP_MAX_TGSI_CONST_BUFFERS);
> +   elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type,
> 4),
>                                                   DRAW_TOTAL_CLIP_PLANES),
>                                                   0);
> -   elem_types[2] = LLVMPointerType(float_type, 0); /* viewport */
> +   elem_types[3] = LLVMPointerType(float_type, 0); /* viewport */
>  
> -   elem_types[3] = LLVMArrayType(texture_type,
> +   elem_types[4] = LLVMArrayType(texture_type,
>                                   PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures
>                                   */
> -   elem_types[4] = LLVMArrayType(sampler_type,
> +   elem_types[5] = 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[6] = LLVMPointerType(LLVMPointerType(int_type, 0), 0);
>     elem_types[7] = LLVMPointerType(LLVMVectorType(int_type,
>                                                    vector_length), 0);
> +   elem_types[8] = LLVMPointerType(LLVMVectorType(int_type,
> +                                                  vector_length), 0);
>  
>     context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
>                                            Elements(elem_types), 0);
> @@ -323,6 +330,8 @@ create_gs_jit_context_type(struct gallivm_state *gallivm,
>  
>     LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, constants,
>                            target, context_type, DRAW_GS_JIT_CTX_CONSTANTS);
> +   LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, constants_max_index,
> +                          target, context_type,
> DRAW_GS_JIT_CTX_CONSTANTS_MAX_INDEX);
>     LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, planes,
>                            target, context_type, DRAW_GS_JIT_CTX_PLANES);
>     LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, viewport,
> @@ -617,7 +626,10 @@ generate_vs(struct draw_llvm_variant *variant,
>  {
>     struct draw_llvm *llvm = variant->llvm;
>     const struct tgsi_token *tokens =
>     llvm->draw->vs.vertex_shader->state.tokens;
> -   LLVMValueRef consts_ptr = draw_jit_context_vs_constants(variant->gallivm,
> context_ptr);
> +   LLVMValueRef consts_ptr =
> +      draw_jit_context_vs_constants(variant->gallivm, context_ptr);
> +   LLVMValueRef consts_max_index_ptr =
> +      draw_jit_context_vs_constants_max_index(variant->gallivm,
> context_ptr);
>     struct lp_build_sampler_soa *sampler = 0;
>  
>     if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
> @@ -633,6 +645,7 @@ generate_vs(struct draw_llvm_variant *variant,
>                       vs_type,
>                       NULL /*struct lp_build_mask_context *mask*/,
>                       consts_ptr,
> +                     consts_max_index_ptr,
>                       system_values,
>                       inputs,
>                       outputs,
> @@ -2089,7 +2102,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     unsigned i;
>     struct draw_gs_llvm_iface gs_iface;
>     const struct tgsi_token *tokens = variant->shader->base.state.tokens;
> -   LLVMValueRef consts_ptr;
> +   LLVMValueRef consts_ptr, consts_max_index_ptr;
>     LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
>     struct lp_build_mask_context mask;
>     const struct tgsi_shader_info *gs_info = &variant->shader->base.info;
> @@ -2163,6 +2176,8 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>     gs_type.length = vector_length;
>  
>     consts_ptr = draw_gs_jit_context_constants(variant->gallivm,
>     context_ptr);
> +   consts_max_index_ptr =
> +      draw_gs_jit_context_constants_max_index(variant->gallivm,
> context_ptr);
>  
>     /* code generated texture sampling */
>     sampler = draw_llvm_sampler_soa_create(variant->key.samplers,
> @@ -2185,6 +2200,7 @@ draw_gs_llvm_generate(struct draw_llvm *llvm,
>                       gs_type,
>                       &mask,
>                       consts_ptr,
> +                     consts_max_index_ptr,
>                       &system_values,
>                       NULL,
>                       outputs,
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.h
> b/src/gallium/auxiliary/draw/draw_llvm.h
> index 1d238a2..5005ba6 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.h
> +++ b/src/gallium/auxiliary/draw/draw_llvm.h
> @@ -123,6 +123,7 @@ enum {
>  struct draw_jit_context
>  {
>     const float *vs_constants[LP_MAX_TGSI_CONST_BUFFERS];
> +   int vs_constants_max_index[LP_MAX_TGSI_CONST_BUFFERS];
>     float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
>     float *viewport;
>  
> @@ -131,17 +132,21 @@ struct draw_jit_context
>  };
>  
>  enum {
> -   DRAW_JIT_CTX_CONSTANTS   = 0,
> -   DRAW_JIT_CTX_PLANES      = 1,
> -   DRAW_JIT_CTX_VIEWPORT    = 2,
> -   DRAW_JIT_CTX_TEXTURES    = 3,
> -   DRAW_JIT_CTX_SAMPLERS    = 4,
> +   DRAW_JIT_CTX_CONSTANTS            = 0,
> +   DRAW_JIT_CTX_CONSTANTS_MAX_INDEX  = 1,
> +   DRAW_JIT_CTX_PLANES               = 2,
> +   DRAW_JIT_CTX_VIEWPORT             = 3,
> +   DRAW_JIT_CTX_TEXTURES             = 4,
> +   DRAW_JIT_CTX_SAMPLERS             = 5,
>     DRAW_JIT_CTX_NUM_FIELDS
>  };
>  
>  #define draw_jit_context_vs_constants(_gallivm, _ptr) \
>     lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_CONSTANTS,
>     "vs_constants")
>  
> +#define draw_jit_context_vs_constants_max_index(_gallivm, _ptr) \
> +   lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_CONSTANTS_MAX_INDEX,
> "vs_constants_max_index")
> +
>  #define draw_jit_context_planes(_gallivm, _ptr) \
>     lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_CTX_PLANES, "planes")
>  
> @@ -200,6 +205,7 @@ enum {
>  struct draw_gs_jit_context
>  {
>     const float *constants[LP_MAX_TGSI_CONST_BUFFERS];
> +   int constants_max_index[LP_MAX_TGSI_CONST_BUFFERS];
>     float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
>     float *viewport;
>  
> @@ -215,23 +221,27 @@ struct draw_gs_jit_context
>  
>  enum {
>     DRAW_GS_JIT_CTX_CONSTANTS = 0,
> -   DRAW_GS_JIT_CTX_PLANES = 1,
> -   DRAW_GS_JIT_CTX_VIEWPORT = 2,
> +   DRAW_GS_JIT_CTX_CONSTANTS_MAX_INDEX = 1,
> +   DRAW_GS_JIT_CTX_PLANES = 2,
> +   DRAW_GS_JIT_CTX_VIEWPORT = 3,
>     /* Textures and samples are reserved for DRAW_JIT_CTX_TEXTURES
>      * and DRAW_JIT_CTX_SAMPLERS, because they both need
>      * to be at exactly the same locations as they are in the
>      * VS ctx structure for sampling to work. */
>     DRAW_GS_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES,
>     DRAW_GS_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS,
> -   DRAW_GS_JIT_CTX_PRIM_LENGTHS = 5,
> -   DRAW_GS_JIT_CTX_EMITTED_VERTICES = 6,
> -   DRAW_GS_JIT_CTX_EMITTED_PRIMS = 7,
> -   DRAW_GS_JIT_CTX_NUM_FIELDS = 8
> +   DRAW_GS_JIT_CTX_PRIM_LENGTHS = 6,
> +   DRAW_GS_JIT_CTX_EMITTED_VERTICES = 7,
> +   DRAW_GS_JIT_CTX_EMITTED_PRIMS = 8,
> +   DRAW_GS_JIT_CTX_NUM_FIELDS = 9
>  };
>  
>  #define draw_gs_jit_context_constants(_gallivm, _ptr) \
>     lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_CONSTANTS,
>     "constants")
>  
> +#define draw_gs_jit_context_constants_max_index(_gallivm, _ptr) \
> +   lp_build_struct_get_ptr(_gallivm, _ptr,
> DRAW_GS_JIT_CTX_CONSTANTS_MAX_INDEX, "constants_max_index")
> +
>  #define draw_gs_jit_context_planes(_gallivm, _ptr) \
>     lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PLANES, "planes")
>  
> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> index 9f17241..cf20a03 100644
> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
> @@ -262,10 +262,16 @@ llvm_middle_end_bind_parameters(struct
> draw_pt_middle_end *middle)
>     unsigned i;
>  
>     for (i = 0; i < Elements(fpme->llvm->jit_context.vs_constants); ++i) {
> +      int num_consts = draw->pt.user.vs_constants_size[i] / sizeof(float);
>        fpme->llvm->jit_context.vs_constants[i] =
>        draw->pt.user.vs_constants[i];
> +      fpme->llvm->jit_context.vs_constants_max_index[i] =
> +         num_consts ? num_consts - 1 : 0;
>     }
>     for (i = 0; i < Elements(fpme->llvm->gs_jit_context.constants); ++i) {
> +      int num_consts = draw->pt.user.gs_constants_size[i] / sizeof(float);
>        fpme->llvm->gs_jit_context.constants[i] =
>        draw->pt.user.gs_constants[i];
> +      fpme->llvm->gs_jit_context.constants_max_index[i] =
> +         num_consts ? num_consts - 1 : 0;
>     }
>  
>     fpme->llvm->jit_context.planes =
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> index 881cd5b..4f988b8 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
> @@ -225,6 +225,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
>                    struct lp_type type,
>                    struct lp_build_mask_context *mask,
>                    LLVMValueRef consts_ptr,
> +                  LLVMValueRef const_sizes_ptr,
>                    const struct lp_bld_tgsi_system_values *system_values,
>                    const LLVMValueRef (*inputs)[4],
>                    LLVMValueRef (*outputs)[4],
> @@ -433,6 +434,7 @@ struct lp_build_tgsi_soa_context
>     LLVMValueRef max_output_vertices_vec;
>  
>     LLVMValueRef consts_ptr;
> +   LLVMValueRef const_sizes_ptr;
>     const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS];
>     LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS];
>  
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> index 6d8dc8c..fdbba21 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> @@ -996,6 +996,7 @@ emit_fetch_constant(
>     unsigned dimension = 0;
>     LLVMValueRef dimension_index;
>     LLVMValueRef consts_ptr;
> +   LLVMValueRef max_const_buf_index;
>     LLVMValueRef res;
>  
>     /* XXX: Handle fetching xyzw components as a vector */
> @@ -1008,7 +1009,10 @@ emit_fetch_constant(
>     }
>  
>     dimension_index = lp_build_const_int32(gallivm, dimension);
> -   consts_ptr = lp_build_array_get(gallivm, bld->consts_ptr,
> dimension_index);
> +   consts_ptr =
> +      lp_build_array_get(gallivm, bld->consts_ptr, dimension_index);
> +   max_const_buf_index =
> +      lp_build_array_get(gallivm, bld->const_sizes_ptr, dimension_index);
>  
>     if (reg->Register.Indirect) {
>        LLVMValueRef indirect_index;
> @@ -1021,6 +1025,11 @@ emit_fetch_constant(
>                                            reg->Register.Index,
>                                            &reg->Indirect);
>  
> +      max_const_buf_index = lp_build_broadcast_scalar(uint_bld,
> +                                                      max_const_buf_index);
> +      indirect_index = lp_build_min(uint_bld, indirect_index,
> +                                    max_const_buf_index);
> +
>        /* index_vec = indirect_index * 4 + swizzle */
>        index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2);
>        index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec);
> @@ -1044,6 +1053,7 @@ emit_fetch_constant(
>        struct lp_build_context *bld_fetch = stype_to_fetch(bld_base, stype);
>        res = LLVMBuildBitCast(builder, res, bld_fetch->vec_type, "");
>     }
> +
>     return res;
>  }
>  
> @@ -3352,6 +3362,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
>                    struct lp_type type,
>                    struct lp_build_mask_context *mask,
>                    LLVMValueRef consts_ptr,
> +                  LLVMValueRef const_sizes_ptr,
>                    const struct lp_bld_tgsi_system_values *system_values,
>                    const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS],
>                    LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
> @@ -3379,6 +3390,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
>     bld.inputs = inputs;
>     bld.outputs = outputs;
>     bld.consts_ptr = consts_ptr;
> +   bld.const_sizes_ptr = const_sizes_ptr;
>     bld.sampler = sampler;
>     bld.bld_base.info = info;
>     bld.indirect_files = info->indirect_files;
> diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c
> b/src/gallium/drivers/llvmpipe/lp_jit.c
> index fa36fd3..7dbab10 100644
> --- a/src/gallium/drivers/llvmpipe/lp_jit.c
> +++ b/src/gallium/drivers/llvmpipe/lp_jit.c
> @@ -166,7 +166,9 @@ lp_jit_create_types(struct lp_fragment_shader_variant
> *lp)
>        LLVMTypeRef context_type;
>  
>        elem_types[LP_JIT_CTX_CONSTANTS] =
> -            LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0),
> LP_MAX_TGSI_CONST_BUFFERS);
> +         LLVMArrayType(LLVMPointerType(LLVMFloatTypeInContext(lc), 0),
> LP_MAX_TGSI_CONST_BUFFERS);
> +      elem_types[LP_JIT_CTX_CONSTANTS_MAX_INDEX] =
> +            LLVMArrayType(LLVMInt32TypeInContext(lc),
> LP_MAX_TGSI_CONST_BUFFERS);
>        elem_types[LP_JIT_CTX_ALPHA_REF] = LLVMFloatTypeInContext(lc);
>        elem_types[LP_JIT_CTX_STENCIL_REF_FRONT] =
>        elem_types[LP_JIT_CTX_STENCIL_REF_BACK] = LLVMInt32TypeInContext(lc);
> @@ -190,6 +192,9 @@ lp_jit_create_types(struct lp_fragment_shader_variant
> *lp)
>        LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, constants,
>                               gallivm->target, context_type,
>                               LP_JIT_CTX_CONSTANTS);
> +      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, constants_max_index,
> +                             gallivm->target, context_type,
> +                             LP_JIT_CTX_CONSTANTS_MAX_INDEX);
>        LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, alpha_ref_value,
>                               gallivm->target, context_type,
>                               LP_JIT_CTX_ALPHA_REF);
> diff --git a/src/gallium/drivers/llvmpipe/lp_jit.h
> b/src/gallium/drivers/llvmpipe/lp_jit.h
> index 8eefa7c..b10ee51 100644
> --- a/src/gallium/drivers/llvmpipe/lp_jit.h
> +++ b/src/gallium/drivers/llvmpipe/lp_jit.h
> @@ -121,6 +121,7 @@ enum {
>  struct lp_jit_context
>  {
>     const float *constants[LP_MAX_TGSI_CONST_BUFFERS];
> +   int constants_max_index[LP_MAX_TGSI_CONST_BUFFERS];
>  
>     float alpha_ref_value;
>  
> @@ -142,6 +143,7 @@ struct lp_jit_context
>   */
>  enum {
>     LP_JIT_CTX_CONSTANTS = 0,
> +   LP_JIT_CTX_CONSTANTS_MAX_INDEX,
>     LP_JIT_CTX_ALPHA_REF,
>     LP_JIT_CTX_STENCIL_REF_FRONT,
>     LP_JIT_CTX_STENCIL_REF_BACK,
> @@ -157,6 +159,9 @@ enum {
>  #define lp_jit_context_constants(_gallivm, _ptr) \
>     lp_build_struct_get_ptr(_gallivm, _ptr, LP_JIT_CTX_CONSTANTS,
>     "constants")
>  
> +#define lp_jit_context_constants_max_index(_gallivm, _ptr) \
> +   lp_build_struct_get_ptr(_gallivm, _ptr, LP_JIT_CTX_CONSTANTS_MAX_INDEX,
> "constants_max_index")
> +
>  #define lp_jit_context_alpha_ref_value(_gallivm, _ptr) \
>     lp_build_struct_get(_gallivm, _ptr, LP_JIT_CTX_ALPHA_REF,
>     "alpha_ref_value")
>  
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c
> b/src/gallium/drivers/llvmpipe/lp_setup.c
> index 2fad469..b238104 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup.c
> @@ -987,6 +987,7 @@ try_update_scene_state( struct lp_setup_context *setup )
>           struct pipe_resource *buffer = setup->constants[i].current.buffer;
>           const unsigned current_size =
>           setup->constants[i].current.buffer_size;
>           const ubyte *current_data = NULL;
> +         int num_constants;
>  
>           if (buffer) {
>              /* resource buffer */
> @@ -1027,7 +1028,11 @@ try_update_scene_state( struct lp_setup_context *setup
> )
>              setup->constants[i].stored_data = NULL;
>           }
>  
> -         setup->fs.current.jit_context.constants[i] =
> setup->constants[i].stored_data;
> +         setup->fs.current.jit_context.constants[i] =
> +            setup->constants[i].stored_data;
> +         num_constants = setup->constants[i].stored_size / sizeof(float);
> +         setup->fs.current.jit_context.constants_max_index[i] =
> +            num_constants ? num_constants - 1 : 0;
>           setup->dirty |= LP_SETUP_NEW_FS;
>        }
>     }
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 2118c1a..4ccc909 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -262,7 +262,7 @@ generate_fs_loop(struct gallivm_state *gallivm,
>     const struct tgsi_token *tokens = shader->base.tokens;
>     LLVMTypeRef vec_type;
>     LLVMValueRef mask_ptr, mask_val;
> -   LLVMValueRef consts_ptr;
> +   LLVMValueRef consts_ptr, consts_max_index_ptr;
>     LLVMValueRef z;
>     LLVMValueRef z_value, s_value;
>     LLVMValueRef z_fb, s_fb;
> @@ -334,6 +334,8 @@ generate_fs_loop(struct gallivm_state *gallivm,
>     vec_type = lp_build_vec_type(gallivm, type);
>  
>     consts_ptr = lp_jit_context_constants(gallivm, context_ptr);
> +   consts_max_index_ptr =
> +      lp_jit_context_constants_max_index(gallivm, context_ptr);
>  
>     lp_build_for_loop_begin(&loop_state, gallivm,
>                             lp_build_const_int32(gallivm, 0),
> @@ -412,7 +414,7 @@ generate_fs_loop(struct gallivm_state *gallivm,
>  
>     /* Build the actual shader */
>     lp_build_tgsi_soa(gallivm, tokens, type, &mask,
> -                     consts_ptr, &system_values,
> +                     consts_ptr, consts_max_index_ptr, &system_values,
>                       interp->inputs,
>                       outputs, sampler, &shader->info.base, NULL);
>  
> --
> 1.8.3.2
> 



Jose


More information about the mesa-dev mailing list