[Mesa-dev] [PATCH 06/18] radeonsi: add si_nir_load_input_tcs()

Timothy Arceri tarceri at itsqueeze.com
Tue Dec 12 10:24:12 UTC 2017



On 12/12/17 20:46, Nicolai Hähnle wrote:
> On 11.12.2017 03:43, Timothy Arceri wrote:
>> ---
>>   src/gallium/drivers/radeonsi/si_shader.c | 47 
>> ++++++++++++++++++++++++++++++++
>>   1 file changed, 47 insertions(+)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
>> b/src/gallium/drivers/radeonsi/si_shader.c
>> index ba8301b3deb..0561d2ee9b5 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>> @@ -1200,20 +1200,66 @@ static LLVMValueRef fetch_input_tcs(
>>       struct si_shader_context *ctx = si_shader_context(bld_base);
>>       LLVMValueRef dw_addr, stride;
>>       stride = get_tcs_in_vertex_dw_stride(ctx);
>>       dw_addr = get_tcs_in_current_patch_offset(ctx);
>>       dw_addr = get_dw_address(ctx, NULL, reg, stride, dw_addr);
>>       return lds_load(bld_base, tgsi2llvmtype(bld_base, type), 
>> swizzle, dw_addr);
>>   }
>> +static LLVMValueRef si_nir_load_input_tcs(struct ac_shader_abi *abi,
>> +                      LLVMValueRef vertex_index,
>> +                      LLVMValueRef param_index,
>> +                      unsigned const_index,
>> +                      unsigned location,
>> +                      unsigned driver_location,
>> +                      LLVMTypeRef type,
>> +                      unsigned component,
>> +                      unsigned num_components,
>> +                      bool is_patch,
>> +                      bool is_compact)
>> +{
>> +    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
>> +    struct tgsi_shader_info *info = &ctx->shader->selector->info;
>> +    struct lp_build_tgsi_context *bld_base = &ctx->bld_base;
>> +    LLVMValueRef dw_addr, stride;
>> +
>> +    driver_location = driver_location / 4;
>> +
>> +    stride = get_tcs_in_vertex_dw_stride(ctx);
>> +    dw_addr = get_tcs_in_current_patch_offset(ctx);
>> +
>> +    if (param_index) {
>> +        /* Add the constant index to the indirect index */
>> +        param_index = LLVMBuildAdd(ctx->ac.builder, param_index,
>> +                       LLVMConstInt(ctx->i32, const_index, 0), "");
>> +    } else {
>> +        if (const_index != 0)
>> +            param_index = LLVMConstInt(ctx->i32, const_index, 0);
> 
> I generally think it's nicer to keep the driver code and simple, even if 
> it means we end up generating an extra LLVM IR instruction that ends up 
> being trivially optimized away, so I'd make that unconditional here.

Fair enough, I can change. I normally do the same but I've been doing a 
lot of preoptir dumps to find bugs so it was helpfully to keep things a 
little cleaner

> 
> Not a big deal, though.
> 
> Cheers,
> Nicolai
> 
> 
>> +    }
>> +
>> +    dw_addr = get_dw_address_from_generic_indices(ctx, stride, dw_addr,
>> +                              vertex_index, param_index,
>> +                              driver_location,
>> +                              info->input_semantic_name,
>> +                              info->input_semantic_index,
>> +                              is_patch);
>> +
>> +    LLVMValueRef value[4];
>> +    for (unsigned i = 0; i < num_components + component; i++) {
>> +        value[i] = lds_load(bld_base, type, i, dw_addr);
>> +    }
>> +
>> +    return ac_build_varying_gather_values(&ctx->ac, value, 
>> num_components, component);
>> +}
>> +
>>   static LLVMValueRef fetch_output_tcs(
>>           struct lp_build_tgsi_context *bld_base,
>>           const struct tgsi_full_src_register *reg,
>>           enum tgsi_opcode_type type, unsigned swizzle)
>>   {
>>       struct si_shader_context *ctx = si_shader_context(bld_base);
>>       LLVMValueRef dw_addr, stride;
>>       if (reg->Register.Dimension) {
>>           stride = get_tcs_out_vertex_dw_stride(ctx);
>> @@ -5867,20 +5913,21 @@ static bool si_compile_tgsi_main(struct 
>> si_shader_context *ctx,
>>           if (shader->key.as_ls)
>>               ctx->abi.emit_outputs = si_llvm_emit_ls_epilogue;
>>           else if (shader->key.as_es)
>>               ctx->abi.emit_outputs = si_llvm_emit_es_epilogue;
>>           else
>>               ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
>>           bld_base->emit_epilogue = si_tgsi_emit_epilogue;
>>           break;
>>       case PIPE_SHADER_TESS_CTRL:
>>           bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
>> +        ctx->abi.load_tess_inputs = si_nir_load_input_tcs;
>>           bld_base->emit_fetch_funcs[TGSI_FILE_OUTPUT] = 
>> fetch_output_tcs;
>>           bld_base->emit_store = store_output_tcs;
>>           bld_base->emit_epilogue = si_llvm_emit_tcs_epilogue;
>>           break;
>>       case PIPE_SHADER_TESS_EVAL:
>>           bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tes;
>>           ctx->abi.load_tess_inputs = si_nir_load_input_tes;
>>           if (shader->key.as_es)
>>               ctx->abi.emit_outputs = si_llvm_emit_es_epilogue;
>>           else
>>
> 
> 


More information about the mesa-dev mailing list