[Mesa-dev] [PATCH] ac: fix get_image_coords() for radeonsi

Timothy Arceri tarceri at itsqueeze.com
Wed Aug 1 04:12:13 UTC 2018



On 31/07/18 16:52, Bas Nieuwenhuizen wrote:
> On Fri, Jul 27, 2018 at 11:40 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
>>
>>
>> On 27/07/18 19:10, Bas Nieuwenhuizen wrote:
>>>
>>> On Fri, Jul 27, 2018 at 7:32 AM, Timothy Arceri <tarceri at itsqueeze.com>
>>> wrote:
>>>>
>>>> Because this was setting image to true we would end up calling
>>>> si_load_image_desc() when we sould be calling
>>>> si_load_sampler_desc().
>>>
>>>
>>> Since the descriptor is part of an image, not a sampler,
>>> get_image_descriptor looks like the right thing to me?
>>>
>>> What assertion are you getting?
>>
>>
>> LLVMValueRef si_load_image_desc(struct si_shader_context *ctx,
>>                                  LLVMValueRef list, LLVMValueRef index,
>>                                  enum ac_descriptor_type desc_type, bool
>> dcc_off)
>> {
>>          LLVMBuilderRef builder = ctx->ac.builder;
>>          LLVMValueRef rsrc;
>>
>>          if (desc_type == AC_DESC_BUFFER) {
>>                  index = LLVMBuildMul(builder, index,
>>                                       LLVMConstInt(ctx->i32, 2, 0), "");
>>                  index = LLVMBuildAdd(builder, index,
>>                                       ctx->i32_1, "");
>>                  list = LLVMBuildPointerCast(builder, list,
>>
>> ac_array_in_const32_addr_space(ctx->v4i32), "");
>>          } else {
>>                  assert(desc_type == AC_DESC_IMAGE);
>>          }
>>
>>          rsrc = ac_build_load_to_sgpr(&ctx->ac, list, index);
>>          if (desc_type == AC_DESC_IMAGE && dcc_off)
>>                  rsrc = force_dcc_off(ctx, rsrc);
>>          return rsrc;
>> }
>>
>> vs
>>
>> LLVMValueRef si_load_sampler_desc(struct si_shader_context *ctx,
>>                                    LLVMValueRef list, LLVMValueRef index,
>>                                    enum ac_descriptor_type type)
>> {
>>          LLVMBuilderRef builder = ctx->ac.builder;
>>
>>          switch (type) {
>>          case AC_DESC_IMAGE:
>>                  /* The image is at [0:7]. */
>>                  index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32,
>> 2, 0), "");
>>                  break;
>>          case AC_DESC_BUFFER:
>>                  /* The buffer is in [4:7]. */
>>                  index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32,
>> 4, 0), "");
>>                  index = LLVMBuildAdd(builder, index, ctx->i32_1, "");
>>                  list = LLVMBuildPointerCast(builder, list,
>>
>> ac_array_in_const32_addr_space(ctx->v4i32), "");
>>                  break;
>>          case AC_DESC_FMASK:
>>                  /* The FMASK is at [8:15]. */
>>                  index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32,
>> 2, 0), "");
>>                  index = LLVMBuildAdd(builder, index, ctx->i32_1, "");
>>                  break;
>>          case AC_DESC_SAMPLER:
>>                  /* The sampler state is at [12:15]. */
>>                  index = LLVMBuildMul(builder, index, LLVMConstInt(ctx->i32,
>> 4, 0), "");
>>                  index = LLVMBuildAdd(builder, index, LLVMConstInt(ctx->i32,
>> 3, 0), "");
>>                  list = LLVMBuildPointerCast(builder, list,
>>
>> ac_array_in_const32_addr_space(ctx->v4i32), "");
>>                  break;
>>          }
>>
>>          return ac_build_load_to_sgpr(&ctx->ac, list, index);
>>
>> }
> 
> I think we should fix the image path to get an fmask descriptor
> though. If you look one level up the bounding of dynamic indices is
> different for textures and images:
> 
> static LLVMValueRef
> si_nir_load_sampler_desc(struct ac_shader_abi *abi,
>                   unsigned descriptor_set, unsigned base_index,
>                   unsigned constant_index, LLVMValueRef dynamic_index,
>                   enum ac_descriptor_type desc_type, bool image,
>               bool write, bool bindless)
> {
>      struct si_shader_context *ctx = si_shader_context_from_abi(abi);
>      LLVMBuilderRef builder = ctx->ac.builder;
>      LLVMValueRef list = LLVMGetParam(ctx->main_fn,
> ctx->param_samplers_and_images);
>      LLVMValueRef index;
> 
>      assert(!descriptor_set);
> 
>      dynamic_index = dynamic_index ? dynamic_index : ctx->ac.i32_0;
>      index = LLVMBuildAdd(builder, dynamic_index,
>                   LLVMConstInt(ctx->ac.i32, base_index + constant_index, false),
>                   "");
> 
>      if (image) {
>          assert(desc_type == AC_DESC_IMAGE || desc_type == AC_DESC_BUFFER);
>          assert(base_index + constant_index < ctx->num_images);
> 
>          if (dynamic_index)
>              index = si_llvm_bound_index(ctx, index, ctx->num_images);
> 
>          index = LLVMBuildSub(ctx->ac.builder,
>                       LLVMConstInt(ctx->i32, SI_NUM_IMAGES - 1, 0),
>                       index, "");
> 
>          /* TODO: be smarter about when we use dcc_off */
>          return si_load_image_desc(ctx, list, index, desc_type, write);
>      }
> 
>      assert(base_index + constant_index < ctx->num_samplers);
> 
>      if (dynamic_index)
>          index = si_llvm_bound_index(ctx, index, ctx->num_samplers);
> 
>      index = LLVMBuildAdd(ctx->ac.builder, index,
>                   LLVMConstInt(ctx->i32, SI_NUM_IMAGES / 2, 0), "");
> 
>      return si_load_sampler_desc(ctx, list, index, desc_type);
> }

Right but that looks consistent with the dynamic index used in radeonsi 
see tex_fetch_ptrs()


More information about the mesa-dev mailing list