[Mesa-dev] [PATCH] gallivm: fix texel fetch for array textures

Roland Scheidegger sroland at vmware.com
Wed Dec 12 13:48:25 PST 2012


I was wrong that there is no test for this in piglit.
spec/glsl-1.30/execution/fs-texelFetch-2D.c (and the offset version)
only test 2d samplers, but texturing/shaders/texelFetch.c can test all
samplers, in both fs and vs.
It currently crashes though with llvmpipe (using glsl and GL version
overrides) due to integer texture formats being used, so I think adding
another test is not necessary and we can just use this one later.

Roland


Am 12.12.2012 21:46, schrieb Jose Fonseca:
> Looks good AFAICT.
> 
> Maybe we should add a test for this in piglit?
> 
> Jose
> 
> ----- Original Message -----
>> From: Roland Scheidegger <sroland at vmware.com>
>>
>> Since we don't call lp_build_sample_common() in the texel fetch path
>> we missed
>> the layer fixup code. If someone would have tried to do texelFetch
>> with array
>> textures it would have crashed for sure.
>> Not really tested (no overlap of texelFetch and array texture tests
>> in piglit).
>> ---
>>  src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |   55
>>  ++++++++++++++-------
>>  1 file changed, 38 insertions(+), 17 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
>> b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
>> index ba265b2..701e8c1 100644
>> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
>> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
>> @@ -973,6 +973,28 @@ lp_build_sample_mipmap(struct
>> lp_build_sample_context *bld,
>>     }
>>  }
>>  
>> +
>> +/**
>> + * Clamp layer coord to valid values.
>> + */
>> +static LLVMValueRef
>> +lp_build_layer_coord(struct lp_build_sample_context *bld,
>> +                     unsigned unit,
>> +                     LLVMValueRef layer)
>> +{
>> +   LLVMValueRef maxlayer;
>> +
>> +   layer = lp_build_iround(&bld->coord_bld, layer);
>> +   maxlayer = bld->dynamic_state->depth(bld->dynamic_state,
>> +                                        bld->gallivm, unit);
>> +   maxlayer = lp_build_sub(&bld->int_bld, maxlayer,
>> bld->int_bld.one);
>> +   maxlayer = lp_build_broadcast_scalar(&bld->int_coord_bld,
>> maxlayer);
>> +   return lp_build_clamp(&bld->int_coord_bld, layer,
>> +                         bld->int_coord_bld.zero, maxlayer);
>> +
>> +}
>> +
>> +
>>  /**
>>   * Calculate cube face, lod, mip levels.
>>   */
>> @@ -1018,23 +1040,11 @@ lp_build_sample_common(struct
>> lp_build_sample_context *bld,
>>        face_derivs.ddx_ddy[1] = NULL;
>>        derivs = &face_derivs;
>>     }
>> -   else if (target == PIPE_TEXTURE_1D_ARRAY ||
>> -            target == PIPE_TEXTURE_2D_ARRAY) {
>> -      LLVMValueRef layer, maxlayer;
>> -
>> -      if (target == PIPE_TEXTURE_1D_ARRAY) {
>> -         layer = *t;
>> -      }
>> -      else {
>> -         layer = *r;
>> -      }
>> -      layer = lp_build_iround(&bld->coord_bld, layer);
>> -      maxlayer = bld->dynamic_state->depth(bld->dynamic_state,
>> -                                           bld->gallivm, unit);
>> -      maxlayer = lp_build_sub(&bld->int_bld, maxlayer,
>> bld->int_bld.one);
>> -      maxlayer = lp_build_broadcast_scalar(&bld->int_coord_bld,
>> maxlayer);
>> -      *r = lp_build_clamp(&bld->int_coord_bld, layer,
>> -                          bld->int_coord_bld.zero, maxlayer);
>> +   else if (target == PIPE_TEXTURE_1D_ARRAY) {
>> +      *r = lp_build_layer_coord(bld, unit, *t);
>> +   }
>> +   else if (target == PIPE_TEXTURE_2D_ARRAY) {
>> +      *r = lp_build_layer_coord(bld, unit, *r);
>>     }
>>  
>>     /*
>> @@ -1205,6 +1215,7 @@ lp_build_fetch_texel(struct
>> lp_build_sample_context *bld,
>>     struct lp_build_context *perquadi_bld = &bld->perquadi_bld;
>>     struct lp_build_context *int_coord_bld = &bld->int_coord_bld;
>>     unsigned dims = bld->dims, chan;
>> +   unsigned target = bld->static_state->target;
>>     LLVMValueRef size, ilevel;
>>     LLVMValueRef row_stride_vec = NULL, img_stride_vec = NULL;
>>     LLVMValueRef x = coords[0], y = coords[1], z = coords[2];
>> @@ -1227,6 +1238,16 @@ lp_build_fetch_texel(struct
>> lp_build_sample_context *bld,
>>     lp_build_extract_image_sizes(bld, &bld->int_size_bld,
>>     int_coord_bld->type,
>>                                  size, &width, &height, &depth);
>>  
>> +   if (target == PIPE_TEXTURE_1D_ARRAY ||
>> +       target == PIPE_TEXTURE_2D_ARRAY) {
>> +      if (target == PIPE_TEXTURE_1D_ARRAY) {
>> +         z = lp_build_layer_coord(bld, unit, y);
>> +      }
>> +      else {
>> +         z = lp_build_layer_coord(bld, unit, z);
>> +      }
>> +   }
>> +
>>     /* This is a lot like border sampling */
>>     if (offsets[0]) {
>>        /* XXX coords are really unsigned, offsets are signed */
>> --
>> 1.7.9.5
>>
>>



More information about the mesa-dev mailing list