From: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 223 ++++++++-------------- src/gallium/drivers/radeonsi/si_shader_internal.h | 10 - 2 files changed, 80 insertions(+), 153 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 56892de..a3b1189 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -371,22 +371,20 @@ static LLVMValueRef get_instance_index_for_fetch( static void declare_input_vs( struct si_shader_context *radeon_bld, unsigned input_index, const struct tgsi_full_declaration *decl, LLVMValueRef out[4]) { struct lp_build_context *base = &radeon_bld->soa.bld_base.base; struct gallivm_state *gallivm = base->gallivm; struct si_shader_context *ctx = si_shader_context(&radeon_bld->soa.bld_base); - unsigned divisor = - ctx->shader->key.vs.prolog.instance_divisors[input_index]; unsigned chan; LLVMValueRef t_list_ptr; LLVMValueRef t_offset; LLVMValueRef t_list; LLVMValueRef attribute_offset; LLVMValueRef buffer_index; LLVMValueRef args[3]; LLVMValueRef input; @@ -394,38 +392,23 @@ static void declare_input_vs( /* Load the T list */ t_list_ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_VERTEX_BUFFERS); t_offset = lp_build_const_int32(gallivm, input_index); t_list = build_indexed_load_const(ctx, t_list_ptr, t_offset); /* Build the attribute offset */ attribute_offset = lp_build_const_int32(gallivm, 0); - if (!ctx->no_prolog) { - buffer_index = LLVMGetParam(radeon_bld->main_fn, - ctx->param_vertex_index0 + - input_index); - } else if (divisor) { - /* Build index from instance ID, start instance and divisor */ - ctx->shader->info.uses_instanceid = true; - buffer_index = get_instance_index_for_fetch(ctx, - SI_PARAM_START_INSTANCE, - divisor); - } else { - /* Load the buffer index for vertices. */ - LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn, - ctx->param_vertex_id); - LLVMValueRef base_vertex = LLVMGetParam(radeon_bld->main_fn, - SI_PARAM_BASE_VERTEX); - buffer_index = LLVMBuildAdd(gallivm->builder, base_vertex, vertex_id, ""); - } + buffer_index = LLVMGetParam(radeon_bld->main_fn, + ctx->param_vertex_index0 + + input_index); args[0] = t_list; args[1] = attribute_offset; args[2] = buffer_index; input = lp_build_intrinsic(gallivm->builder, "llvm.SI.vs.load.input", ctx->v4f32, args, 3, LLVMReadNoneAttribute); /* Break up the vec4 into individual components */ for (chan = 0; chan < 4; chan++) { @@ -1308,22 +1291,21 @@ static void declare_input_fs( { struct lp_build_context *base = &radeon_bld->soa.bld_base.base; struct si_shader_context *ctx = si_shader_context(&radeon_bld->soa.bld_base); struct si_shader *shader = ctx->shader; LLVMValueRef main_fn = radeon_bld->main_fn; LLVMValueRef interp_param = NULL; int interp_param_idx; /* Get colors from input VGPRs (set by the prolog). */ - if (!ctx->no_prolog && - decl->Semantic.Name == TGSI_SEMANTIC_COLOR) { + if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR) { unsigned i = decl->Semantic.Index; unsigned colors_read = shader->selector->info.colors_read; unsigned mask = colors_read >> (i * 4); unsigned offset = SI_PARAM_POS_FIXED_PT + 1 + (i ? util_bitcount(colors_read & 0xf) : 0); out[0] = mask & 0x1 ? LLVMGetParam(main_fn, offset++) : base->undef; out[1] = mask & 0x2 ? LLVMGetParam(main_fn, offset++) : base->undef; out[2] = mask & 0x4 ? LLVMGetParam(main_fn, offset++) : base->undef; out[3] = mask & 0x8 ? LLVMGetParam(main_fn, offset++) : base->undef; @@ -2551,59 +2533,54 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base) { struct si_shader_context *ctx = si_shader_context(bld_base); LLVMValueRef rel_patch_id, invocation_id, tf_lds_offset; si_copy_tcs_inputs(bld_base); rel_patch_id = get_rel_patch_id(ctx); invocation_id = unpack_param(ctx, SI_PARAM_REL_IDS, 8, 5); tf_lds_offset = get_tcs_out_current_patch_data_offset(ctx); - if (!ctx->no_epilog) { - /* Return epilog parameters from this function. */ - LLVMBuilderRef builder = bld_base->base.gallivm->builder; - LLVMValueRef ret = ctx->return_value; - LLVMValueRef rw_buffers, rw0, rw1, tf_soffset; - unsigned vgpr; - - /* RW_BUFFERS pointer */ - rw_buffers = LLVMGetParam(ctx->main_fn, - SI_PARAM_RW_BUFFERS); - rw_buffers = LLVMBuildPtrToInt(builder, rw_buffers, ctx->i64, ""); - rw_buffers = LLVMBuildBitCast(builder, rw_buffers, ctx->v2i32, ""); - rw0 = LLVMBuildExtractElement(builder, rw_buffers, - bld_base->uint_bld.zero, ""); - rw1 = LLVMBuildExtractElement(builder, rw_buffers, - bld_base->uint_bld.one, ""); - ret = LLVMBuildInsertValue(builder, ret, rw0, 0, ""); - ret = LLVMBuildInsertValue(builder, ret, rw1, 1, ""); - - /* Tess factor buffer soffset is after user SGPRs. */ - tf_soffset = LLVMGetParam(ctx->main_fn, - SI_PARAM_TESS_FACTOR_OFFSET); - ret = LLVMBuildInsertValue(builder, ret, tf_soffset, - SI_TCS_NUM_USER_SGPR + 1, ""); - - /* VGPRs */ - rel_patch_id = bitcast(bld_base, TGSI_TYPE_FLOAT, rel_patch_id); - invocation_id = bitcast(bld_base, TGSI_TYPE_FLOAT, invocation_id); - tf_lds_offset = bitcast(bld_base, TGSI_TYPE_FLOAT, tf_lds_offset); - - vgpr = SI_TCS_NUM_USER_SGPR + 2; - ret = LLVMBuildInsertValue(builder, ret, rel_patch_id, vgpr++, ""); - ret = LLVMBuildInsertValue(builder, ret, invocation_id, vgpr++, ""); - ret = LLVMBuildInsertValue(builder, ret, tf_lds_offset, vgpr++, ""); - ctx->return_value = ret; - return; - } + /* Return epilog parameters from this function. */ + LLVMBuilderRef builder = bld_base->base.gallivm->builder; + LLVMValueRef ret = ctx->return_value; + LLVMValueRef rw_buffers, rw0, rw1, tf_soffset; + unsigned vgpr; - si_write_tess_factors(bld_base, rel_patch_id, invocation_id, tf_lds_offset); + /* RW_BUFFERS pointer */ + rw_buffers = LLVMGetParam(ctx->main_fn, + SI_PARAM_RW_BUFFERS); + rw_buffers = LLVMBuildPtrToInt(builder, rw_buffers, ctx->i64, ""); + rw_buffers = LLVMBuildBitCast(builder, rw_buffers, ctx->v2i32, ""); + rw0 = LLVMBuildExtractElement(builder, rw_buffers, + bld_base->uint_bld.zero, ""); + rw1 = LLVMBuildExtractElement(builder, rw_buffers, + bld_base->uint_bld.one, ""); + ret = LLVMBuildInsertValue(builder, ret, rw0, 0, ""); + ret = LLVMBuildInsertValue(builder, ret, rw1, 1, ""); + + /* Tess factor buffer soffset is after user SGPRs. */ + tf_soffset = LLVMGetParam(ctx->main_fn, + SI_PARAM_TESS_FACTOR_OFFSET); + ret = LLVMBuildInsertValue(builder, ret, tf_soffset, + SI_TCS_NUM_USER_SGPR + 1, ""); + + /* VGPRs */ + rel_patch_id = bitcast(bld_base, TGSI_TYPE_FLOAT, rel_patch_id); + invocation_id = bitcast(bld_base, TGSI_TYPE_FLOAT, invocation_id); + tf_lds_offset = bitcast(bld_base, TGSI_TYPE_FLOAT, tf_lds_offset); + + vgpr = SI_TCS_NUM_USER_SGPR + 2; + ret = LLVMBuildInsertValue(builder, ret, rel_patch_id, vgpr++, ""); + ret = LLVMBuildInsertValue(builder, ret, invocation_id, vgpr++, ""); + ret = LLVMBuildInsertValue(builder, ret, tf_lds_offset, vgpr++, ""); + ctx->return_value = ret; } static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context *bld_base) { struct si_shader_context *ctx = si_shader_context(bld_base); struct si_shader *shader = ctx->shader; struct tgsi_shader_info *info = &shader->selector->info; struct gallivm_state *gallivm = bld_base->base.gallivm; unsigned i, chan; LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn, @@ -2735,41 +2712,27 @@ static void si_llvm_emit_vs_epilogue(struct lp_build_tgsi_context *bld_base) outputs[i].name = info->output_semantic_name[i]; outputs[i].sid = info->output_semantic_index[i]; for (j = 0; j < 4; j++) outputs[i].values[j] = LLVMBuildLoad(gallivm->builder, ctx->soa.outputs[i][j], ""); } - if (ctx->no_epilog) { - /* Export PrimitiveID when PS needs it. */ - if (si_vs_exports_prim_id(ctx->shader)) { - outputs[i].name = TGSI_SEMANTIC_PRIMID; - outputs[i].sid = 0; - outputs[i].values[0] = bitcast(bld_base, TGSI_TYPE_FLOAT, - get_primitive_id(bld_base, 0)); - outputs[i].values[1] = bld_base->base.undef; - outputs[i].values[2] = bld_base->base.undef; - outputs[i].values[3] = bld_base->base.undef; - i++; - } - } else { - /* Return the primitive ID from the LLVM function. */ - ctx->return_value = - LLVMBuildInsertValue(gallivm->builder, - ctx->return_value, - bitcast(bld_base, TGSI_TYPE_FLOAT, - get_primitive_id(bld_base, 0)), - VS_EPILOG_PRIMID_LOC, ""); - } + /* Return the primitive ID from the LLVM function. */ + ctx->return_value = + LLVMBuildInsertValue(gallivm->builder, + ctx->return_value, + bitcast(bld_base, TGSI_TYPE_FLOAT, + get_primitive_id(bld_base, 0)), + VS_EPILOG_PRIMID_LOC, ""); si_llvm_export_vs(bld_base, outputs, i); FREE(outputs); } struct si_ps_exports { unsigned num; LLVMValueRef args[10][9]; }; @@ -5362,33 +5325,31 @@ static void create_function(struct si_shader_context *ctx) } last_sgpr = num_params-1; /* VGPRs */ params[ctx->param_vertex_id = num_params++] = ctx->i32; params[ctx->param_rel_auto_id = num_params++] = ctx->i32; params[ctx->param_vs_prim_id = num_params++] = ctx->i32; params[ctx->param_instance_id = num_params++] = ctx->i32; - if (!ctx->no_prolog && - !ctx->is_gs_copy_shader) { + if (!ctx->is_gs_copy_shader) { /* Vertex load indices. */ ctx->param_vertex_index0 = num_params; for (i = 0; i < shader->selector->info.num_inputs; i++) params[num_params++] = ctx->i32; num_prolog_vgprs += shader->selector->info.num_inputs; } - if (!ctx->no_epilog && - !ctx->is_gs_copy_shader) { + if (!ctx->is_gs_copy_shader) { /* PrimitiveID output. */ if (!shader->key.vs.as_es && !shader->key.vs.as_ls) for (i = 0; i <= VS_EPILOG_PRIMID_LOC; i++) returns[num_returns++] = ctx->f32; } break; case PIPE_SHADER_TESS_CTRL: params[SI_PARAM_TCS_OFFCHIP_LAYOUT] = ctx->i32; params[SI_PARAM_TCS_OUT_OFFSETS] = ctx->i32; @@ -5396,30 +5357,28 @@ static void create_function(struct si_shader_context *ctx) params[SI_PARAM_TCS_IN_LAYOUT] = ctx->i32; params[ctx->param_oc_lds = SI_PARAM_TCS_OC_LDS] = ctx->i32; params[SI_PARAM_TESS_FACTOR_OFFSET] = ctx->i32; last_sgpr = SI_PARAM_TESS_FACTOR_OFFSET; /* VGPRs */ params[SI_PARAM_PATCH_ID] = ctx->i32; params[SI_PARAM_REL_IDS] = ctx->i32; num_params = SI_PARAM_REL_IDS+1; - if (!ctx->no_epilog) { - /* SI_PARAM_TCS_OC_LDS and PARAM_TESS_FACTOR_OFFSET are - * placed after the user SGPRs. - */ - for (i = 0; i < SI_TCS_NUM_USER_SGPR + 2; i++) - returns[num_returns++] = ctx->i32; /* SGPRs */ + /* SI_PARAM_TCS_OC_LDS and PARAM_TESS_FACTOR_OFFSET are + * placed after the user SGPRs. + */ + for (i = 0; i < SI_TCS_NUM_USER_SGPR + 2; i++) + returns[num_returns++] = ctx->i32; /* SGPRs */ - for (i = 0; i < 3; i++) - returns[num_returns++] = ctx->f32; /* VGPRs */ - } + for (i = 0; i < 3; i++) + returns[num_returns++] = ctx->f32; /* VGPRs */ break; case PIPE_SHADER_TESS_EVAL: params[SI_PARAM_TCS_OFFCHIP_LAYOUT] = ctx->i32; num_params = SI_PARAM_TCS_OFFCHIP_LAYOUT+1; if (shader->key.tes.as_es) { params[ctx->param_oc_lds = num_params++] = ctx->i32; params[ctx->param_tess_offchip = num_params++] = ctx->i32; params[ctx->param_es2gs_offset = num_params++] = ctx->i32; @@ -5431,21 +5390,21 @@ static void create_function(struct si_shader_context *ctx) } last_sgpr = num_params - 1; /* VGPRs */ params[ctx->param_tes_u = num_params++] = ctx->f32; params[ctx->param_tes_v = num_params++] = ctx->f32; params[ctx->param_tes_rel_patch_id = num_params++] = ctx->i32; params[ctx->param_tes_patch_id = num_params++] = ctx->i32; /* PrimitiveID output. */ - if (!ctx->no_epilog && !shader->key.tes.as_es) + if (!shader->key.tes.as_es) for (i = 0; i <= VS_EPILOG_PRIMID_LOC; i++) returns[num_returns++] = ctx->f32; break; case PIPE_SHADER_GEOMETRY: params[SI_PARAM_GS2VS_OFFSET] = ctx->i32; params[SI_PARAM_GS_WAVE_ID] = ctx->i32; last_sgpr = SI_PARAM_GS_WAVE_ID; /* VGPRs */ @@ -5476,54 +5435,50 @@ static void create_function(struct si_shader_context *ctx) params[SI_PARAM_POS_Y_FLOAT] = ctx->f32; params[SI_PARAM_POS_Z_FLOAT] = ctx->f32; params[SI_PARAM_POS_W_FLOAT] = ctx->f32; params[SI_PARAM_FRONT_FACE] = ctx->i32; shader->info.face_vgpr_index = 20; params[SI_PARAM_ANCILLARY] = ctx->i32; params[SI_PARAM_SAMPLE_COVERAGE] = ctx->f32; params[SI_PARAM_POS_FIXED_PT] = ctx->i32; num_params = SI_PARAM_POS_FIXED_PT+1; - if (!ctx->no_prolog) { - /* Color inputs from the prolog. */ - if (shader->selector->info.colors_read) { - unsigned num_color_elements = - util_bitcount(shader->selector->info.colors_read); + /* Color inputs from the prolog. */ + if (shader->selector->info.colors_read) { + unsigned num_color_elements = + util_bitcount(shader->selector->info.colors_read); - assert(num_params + num_color_elements <= ARRAY_SIZE(params)); - for (i = 0; i < num_color_elements; i++) - params[num_params++] = ctx->f32; + assert(num_params + num_color_elements <= ARRAY_SIZE(params)); + for (i = 0; i < num_color_elements; i++) + params[num_params++] = ctx->f32; - num_prolog_vgprs += num_color_elements; - } + num_prolog_vgprs += num_color_elements; } - if (!ctx->no_epilog) { - /* Outputs for the epilog. */ - num_return_sgprs = SI_SGPR_ALPHA_REF + 1; - num_returns = - num_return_sgprs + - util_bitcount(shader->selector->info.colors_written) * 4 + - shader->selector->info.writes_z + - shader->selector->info.writes_stencil + - shader->selector->info.writes_samplemask + - 1 /* SampleMaskIn */; - - num_returns = MAX2(num_returns, - num_return_sgprs + - PS_EPILOG_SAMPLEMASK_MIN_LOC + 1); - - for (i = 0; i < num_return_sgprs; i++) - returns[i] = ctx->i32; - for (; i < num_returns; i++) - returns[i] = ctx->f32; - } + /* Outputs for the epilog. */ + num_return_sgprs = SI_SGPR_ALPHA_REF + 1; + num_returns = + num_return_sgprs + + util_bitcount(shader->selector->info.colors_written) * 4 + + shader->selector->info.writes_z + + shader->selector->info.writes_stencil + + shader->selector->info.writes_samplemask + + 1 /* SampleMaskIn */; + + num_returns = MAX2(num_returns, + num_return_sgprs + + PS_EPILOG_SAMPLEMASK_MIN_LOC + 1); + + for (i = 0; i < num_return_sgprs; i++) + returns[i] = ctx->i32; + for (; i < num_returns; i++) + returns[i] = ctx->f32; break; case PIPE_SHADER_COMPUTE: params[SI_PARAM_GRID_SIZE] = v3i32; params[SI_PARAM_BLOCK_SIZE] = v3i32; params[SI_PARAM_BLOCK_ID] = v3i32; last_sgpr = SI_PARAM_BLOCK_ID; params[SI_PARAM_THREAD_ID] = v3i32; num_params = SI_PARAM_THREAD_ID + 1; @@ -6561,28 +6516,20 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, break; default: assert(!"Unsupported shader type"); return false; } create_meta_data(ctx); create_function(ctx); preload_ring_buffers(ctx); - if (ctx->no_prolog && sel->type == PIPE_SHADER_FRAGMENT && - shader->key.ps.prolog.poly_stipple) { - LLVMValueRef list = LLVMGetParam(ctx->main_fn, - SI_PARAM_RW_BUFFERS); - si_llvm_emit_polygon_stipple(ctx, list, - SI_PARAM_POS_FIXED_PT); - } - if (ctx->type == PIPE_SHADER_GEOMETRY) { int i; for (i = 0; i < 4; i++) { ctx->gs_next_vertex[i] = lp_build_alloca(bld_base->base.gallivm, ctx->i32, ""); } } if (!lp_build_tgsi_llvm(bld_base, sel->tokens)) { @@ -6988,32 +6935,22 @@ int si_compile_tgsi_shader(struct si_screen *sscreen, /* Dump TGSI code before doing TGSI->LLVM conversion in case the * conversion fails. */ if (r600_can_dump_shader(&sscreen->b, sel->info.processor) && !(sscreen->b.debug_flags & DBG_NO_TGSI)) { tgsi_dump(sel->tokens, 0); si_dump_streamout(&sel->so); } si_init_shader_ctx(&ctx, sscreen, shader, tm); - ctx.no_prolog = is_monolithic; - ctx.no_epilog = is_monolithic; ctx.separate_prolog = !is_monolithic; - if (ctx.type == PIPE_SHADER_VERTEX || - ctx.type == PIPE_SHADER_TESS_CTRL || - ctx.type == PIPE_SHADER_TESS_EVAL || - ctx.type == PIPE_SHADER_FRAGMENT) { - ctx.no_prolog = false; - ctx.no_epilog = false; - } - memset(shader->info.vs_output_param_offset, 0xff, sizeof(shader->info.vs_output_param_offset)); shader->info.uses_instanceid = sel->info.uses_instanceid; bld_base = &ctx.soa.bld_base; ctx.load_system_value = declare_system_value; if (!si_compile_tgsi_main(&ctx, shader)) { si_llvm_dispose(&ctx); diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 2f5d346..669813c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -47,30 +47,20 @@ struct si_llvm_flow; struct si_shader_context { struct lp_build_tgsi_soa_context soa; struct gallivm_state gallivm; struct si_shader *shader; struct si_screen *screen; unsigned type; /* PIPE_SHADER_* specifies the type of shader. */ bool is_gs_copy_shader; - /* Whether main TGSI code translation should assume that no prolog - * or epilog is present, respectively. - * - * This is used temporarily to indicate a monolithic shader that is - * _not_ assembled from parts via inlining. Will be removed once the - * transition is complete. - */ - bool no_prolog; - bool no_epilog; - /* Whether the prolog will be compiled separately. */ bool separate_prolog; /** This function is responsible for initilizing the inputs array and will be * called once for each input declared in the TGSI shader. */ void (*load_input)(struct si_shader_context *, unsigned input_index, const struct tgsi_full_declaration *decl, LLVMValueRef out[4]); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev