--- src/amd/common/ac_nir_to_llvm.c | 20 +++++++++------ src/amd/common/ac_shader_abi.h | 4 +++ src/gallium/drivers/radeonsi/si_shader.c | 42 +++++++++++++++++++------------- 3 files changed, 42 insertions(+), 24 deletions(-)
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index ce91d403884..d2a8691b11b 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -4017,37 +4017,38 @@ visit_emit_vertex(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addr } static void visit_end_primitive(struct nir_to_llvm_context *ctx, const nir_intrinsic_instr *instr) { ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_CUT | AC_SENDMSG_GS | (0 << 8), ctx->gs_wave_id); } static LLVMValueRef -visit_load_tess_coord(struct nir_to_llvm_context *ctx, - const nir_intrinsic_instr *instr) +load_tess_coord(struct ac_shader_abi *abi, LLVMTypeRef type, + unsigned num_components) { + struct nir_to_llvm_context *ctx = nir_to_llvm_context_from_abi(abi); + LLVMValueRef coord[4] = { ctx->tes_u, ctx->tes_v, ctx->ac.f32_0, ctx->ac.f32_0, }; if (ctx->tes_primitive_mode == GL_TRIANGLES) coord[2] = LLVMBuildFSub(ctx->builder, ctx->ac.f32_1, LLVMBuildFAdd(ctx->builder, coord[0], coord[1], ""), ""); - LLVMValueRef result = ac_build_gather_values(&ctx->ac, coord, instr->num_components); - return LLVMBuildBitCast(ctx->builder, result, - get_def_type(ctx->nir, &instr->dest.ssa), ""); + LLVMValueRef result = ac_build_gather_values(&ctx->ac, coord, num_components); + return LLVMBuildBitCast(ctx->builder, result, type, ""); } static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { LLVMValueRef result = NULL; switch (instr->intrinsic) { case nir_intrinsic_load_work_group_id: { result = ctx->nctx->workgroup_ids; @@ -4218,23 +4219,27 @@ static void visit_intrinsic(struct ac_nir_context *ctx, case nir_intrinsic_interp_var_at_offset: result = visit_interp(ctx->nctx, instr); break; case nir_intrinsic_emit_vertex: assert(instr->const_index[0] == 0); ctx->abi->emit_vertex(ctx->abi, 0, ctx->outputs); break; case nir_intrinsic_end_primitive: visit_end_primitive(ctx->nctx, instr); break; - case nir_intrinsic_load_tess_coord: - result = visit_load_tess_coord(ctx->nctx, instr); + case nir_intrinsic_load_tess_coord: { + LLVMTypeRef type = ctx->nctx ? + get_def_type(ctx->nctx->nir, &instr->dest.ssa) : + NULL; + result = ctx->abi->load_tess_coord(ctx->abi, type, instr->num_components); break; + } case nir_intrinsic_load_patch_vertices_in: result = LLVMConstInt(ctx->ac.i32, ctx->nctx->options->key.tcs.input_vertices, false); break; default: fprintf(stderr, "Unknown intrinsic: "); nir_print_instr(&instr->instr, stderr); fprintf(stderr, "\n"); break; } if (result) { @@ -6574,20 +6579,21 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm, ctx.gs_max_out_vertices = shaders[i]->info.gs.vertices_out; ctx.abi.load_inputs = load_gs_input; } else if (shaders[i]->info.stage == MESA_SHADER_TESS_CTRL) { ctx.tcs_outputs_read = shaders[i]->info.outputs_read; ctx.tcs_patch_outputs_read = shaders[i]->info.patch_outputs_read; ctx.abi.load_tess_inputs = load_tcs_input; ctx.abi.store_tcs_outputs = store_tcs_output; } else if (shaders[i]->info.stage == MESA_SHADER_TESS_EVAL) { ctx.tes_primitive_mode = shaders[i]->info.tess.primitive_mode; ctx.abi.load_tess_inputs = load_tes_input; + ctx.abi.load_tess_coord = load_tess_coord; } else if (shaders[i]->info.stage == MESA_SHADER_VERTEX) { if (shader_info->info.vs.needs_instance_id) { ctx.shader_info->vs.vgpr_comp_cnt = MAX2(3, ctx.shader_info->vs.vgpr_comp_cnt); } } else if (shaders[i]->info.stage == MESA_SHADER_FRAGMENT) { shader_info->fs.can_discard = shaders[i]->info.fs.uses_discard; } if (i) diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h index 827617c8e97..2278f37c7cd 100644 --- a/src/amd/common/ac_shader_abi.h +++ b/src/amd/common/ac_shader_abi.h @@ -93,20 +93,24 @@ struct ac_shader_abi { LLVMValueRef param_index, unsigned const_index, unsigned location, unsigned driver_location, LLVMValueRef src, unsigned component, bool is_patch, bool is_compact, unsigned writemask); + LLVMValueRef (*load_tess_coord)(struct ac_shader_abi *abi, + LLVMTypeRef type, + unsigned num_components); + LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi, LLVMValueRef index); /** * Load the descriptor for the given buffer. * * \param buffer the buffer as presented in NIR: this is the descriptor * in Vulkan, and the buffer index in OpenGL/Gallium * \param write whether buffer contents will be written */ LLVMValueRef (*load_ssbo)(struct ac_shader_abi *abi, diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 41698720df1..a823d49982f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1895,25 +1895,47 @@ static LLVMValueRef load_sample_position(struct si_shader_context *ctx, LLVMValu LLVMValueRef pos[4] = { buffer_load_const(ctx, resource, offset0), buffer_load_const(ctx, resource, offset1), LLVMConstReal(ctx->f32, 0), LLVMConstReal(ctx->f32, 0) }; return lp_build_gather_values(&ctx->gallivm, pos, 4); } +static LLVMValueRef si_load_tess_coord(struct ac_shader_abi *abi, + LLVMTypeRef type, + unsigned num_components) +{ + struct si_shader_context *ctx = si_shader_context_from_abi(abi); + struct lp_build_context *bld = &ctx->bld_base.base; + + LLVMValueRef coord[4] = { + LLVMGetParam(ctx->main_fn, ctx->param_tes_u), + LLVMGetParam(ctx->main_fn, ctx->param_tes_v), + ctx->ac.f32_0, + ctx->ac.f32_0 + }; + + /* For triangles, the vector should be (u, v, 1-u-v). */ + if (ctx->shader->selector->info.properties[TGSI_PROPERTY_TES_PRIM_MODE] == + PIPE_PRIM_TRIANGLES) + coord[2] = lp_build_sub(bld, ctx->ac.f32_1, + lp_build_add(bld, coord[0], coord[1])); + + return lp_build_gather_values(&ctx->gallivm, coord, 4); +} + void si_load_system_value(struct si_shader_context *ctx, unsigned index, const struct tgsi_full_declaration *decl) { - struct lp_build_context *bld = &ctx->bld_base.base; LLVMValueRef value = 0; assert(index < RADEON_LLVM_MAX_SYSTEM_VALUES); switch (decl->Semantic.Name) { case TGSI_SEMANTIC_INSTANCEID: value = ctx->abi.instance_id; break; case TGSI_SEMANTIC_VERTEXID: @@ -2000,37 +2022,22 @@ void si_load_system_value(struct si_shader_context *ctx, } case TGSI_SEMANTIC_SAMPLEMASK: /* This can only occur with the OpenGL Core profile, which * doesn't support smoothing. */ value = LLVMGetParam(ctx->main_fn, SI_PARAM_SAMPLE_COVERAGE); break; case TGSI_SEMANTIC_TESSCOORD: - { - LLVMValueRef coord[4] = { - LLVMGetParam(ctx->main_fn, ctx->param_tes_u), - LLVMGetParam(ctx->main_fn, ctx->param_tes_v), - ctx->ac.f32_0, - ctx->ac.f32_0 - }; - - /* For triangles, the vector should be (u, v, 1-u-v). */ - if (ctx->shader->selector->info.properties[TGSI_PROPERTY_TES_PRIM_MODE] == - PIPE_PRIM_TRIANGLES) - coord[2] = lp_build_sub(bld, ctx->ac.f32_1, - lp_build_add(bld, coord[0], coord[1])); - - value = lp_build_gather_values(&ctx->gallivm, coord, 4); + value = si_load_tess_coord(&ctx->abi, NULL, 4); break; - } case TGSI_SEMANTIC_VERTICESIN: if (ctx->type == PIPE_SHADER_TESS_CTRL) value = unpack_param(ctx, ctx->param_tcs_out_lds_layout, 26, 6); else if (ctx->type == PIPE_SHADER_TESS_EVAL) value = get_num_tcs_out_vertices(ctx); else assert(!"invalid shader stage for TGSI_SEMANTIC_VERTICESIN"); break; @@ -6055,20 +6062,21 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, 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; ctx->abi.store_tcs_outputs = si_nir_store_output_tcs; ctx->abi.emit_outputs = si_llvm_emit_tcs_epilogue; bld_base->emit_epilogue = si_tgsi_emit_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; + ctx->abi.load_tess_coord = si_load_tess_coord; 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_GEOMETRY: bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs; ctx->abi.load_inputs = si_nir_load_input_gs; ctx->abi.emit_vertex = si_llvm_emit_vertex; -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev