From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 108 ++++++++++++++----------------- 1 file changed, 48 insertions(+), 60 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 3876010..2da00f9 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -293,37 +293,35 @@ get_tcs_out_current_patch_data_offset(struct si_shader_context *ctx) LLVMValueRef patch_stride = get_tcs_out_patch_stride(ctx); LLVMValueRef rel_patch_id = get_rel_patch_id(ctx); return LLVMBuildAdd(gallivm->builder, patch0_patch_data_offset, LLVMBuildMul(gallivm->builder, patch_stride, rel_patch_id, ""), ""); } static LLVMValueRef get_instance_index_for_fetch( - struct si_shader_context *radeon_bld, + struct si_shader_context *ctx, unsigned param_start_instance, unsigned divisor) { - struct si_shader_context *ctx = - si_shader_context(&radeon_bld->bld_base); - struct gallivm_state *gallivm = radeon_bld->bld_base.base.gallivm; + struct gallivm_state *gallivm = ctx->bld_base.base.gallivm; - LLVMValueRef result = LLVMGetParam(radeon_bld->main_fn, + LLVMValueRef result = LLVMGetParam(ctx->main_fn, ctx->param_instance_id); /* The division must be done before START_INSTANCE is added. */ if (divisor > 1) result = LLVMBuildUDiv(gallivm->builder, result, lp_build_const_int32(gallivm, divisor), ""); return LLVMBuildAdd(gallivm->builder, result, - LLVMGetParam(radeon_bld->main_fn, param_start_instance), ""); + LLVMGetParam(ctx->main_fn, param_start_instance), ""); } /* Bitcast <4 x float> to <2 x double>, extract the component, and convert * to float. */ static LLVMValueRef extract_double_to_float(struct si_shader_context *ctx, LLVMValueRef vec4, unsigned double_index) { LLVMBuilderRef builder = ctx->gallivm.builder; LLVMTypeRef f64 = LLVMDoubleTypeInContext(ctx->gallivm.context); @@ -1279,30 +1277,28 @@ static void interp_fs_input(struct si_shader_context *ctx, } else { result[chan] = ac_build_fs_interp_mov(&ctx->ac, lp_build_const_int32(gallivm, 2), /* P0 */ llvm_chan, attr_number, prim_mask); } } } } static void declare_input_fs( - struct si_shader_context *radeon_bld, + struct si_shader_context *ctx, unsigned input_index, const struct tgsi_full_declaration *decl, LLVMValueRef out[4]) { - struct lp_build_context *base = &radeon_bld->bld_base.base; - struct si_shader_context *ctx = - si_shader_context(&radeon_bld->bld_base); + struct lp_build_context *base = &ctx->bld_base.base; struct si_shader *shader = ctx->shader; - LLVMValueRef main_fn = radeon_bld->main_fn; + LLVMValueRef main_fn = ctx->main_fn; LLVMValueRef interp_param = NULL; int interp_param_idx; /* Get colors from input VGPRs (set by the prolog). */ 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); @@ -1328,171 +1324,165 @@ static void declare_input_fs( interp_param = NULL; /* load the constant color */ interp_fs_input(ctx, input_index, decl->Semantic.Name, decl->Semantic.Index, shader->selector->info.num_inputs, shader->selector->info.colors_read, interp_param, LLVMGetParam(main_fn, SI_PARAM_PRIM_MASK), LLVMGetParam(main_fn, SI_PARAM_FRONT_FACE), &out[0]); } -static LLVMValueRef get_sample_id(struct si_shader_context *radeon_bld) +static LLVMValueRef get_sample_id(struct si_shader_context *ctx) { - return unpack_param(si_shader_context(&radeon_bld->bld_base), - SI_PARAM_ANCILLARY, 8, 4); + return unpack_param(ctx, SI_PARAM_ANCILLARY, 8, 4); } /** * Load a dword from a constant buffer. */ static LLVMValueRef buffer_load_const(struct si_shader_context *ctx, LLVMValueRef resource, LLVMValueRef offset) { LLVMBuilderRef builder = ctx->gallivm.builder; LLVMValueRef args[2] = {resource, offset}; return lp_build_intrinsic(builder, "llvm.SI.load.const", ctx->f32, args, 2, LP_FUNC_ATTR_READNONE | LP_FUNC_ATTR_LEGACY); } -static LLVMValueRef load_sample_position(struct si_shader_context *radeon_bld, LLVMValueRef sample_id) +static LLVMValueRef load_sample_position(struct si_shader_context *ctx, LLVMValueRef sample_id) { - struct si_shader_context *ctx = - si_shader_context(&radeon_bld->bld_base); - struct lp_build_context *uint_bld = &radeon_bld->bld_base.uint_bld; - struct gallivm_state *gallivm = &radeon_bld->gallivm; + struct lp_build_context *uint_bld = &ctx->bld_base.uint_bld; + struct gallivm_state *gallivm = &ctx->gallivm; LLVMBuilderRef builder = gallivm->builder; LLVMValueRef desc = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS); LLVMValueRef buf_index = lp_build_const_int32(gallivm, SI_PS_CONST_SAMPLE_POSITIONS); LLVMValueRef resource = ac_build_indexed_load_const(&ctx->ac, desc, buf_index); /* offset = sample_id * 8 (8 = 2 floats containing samplepos.xy) */ LLVMValueRef offset0 = lp_build_mul_imm(uint_bld, sample_id, 8); LLVMValueRef offset1 = LLVMBuildAdd(builder, offset0, lp_build_const_int32(gallivm, 4), ""); LLVMValueRef pos[4] = { buffer_load_const(ctx, resource, offset0), buffer_load_const(ctx, resource, offset1), lp_build_const_float(gallivm, 0), lp_build_const_float(gallivm, 0) }; return lp_build_gather_values(gallivm, pos, 4); } -static void declare_system_value( - struct si_shader_context *radeon_bld, - unsigned index, - const struct tgsi_full_declaration *decl) +static void declare_system_value(struct si_shader_context *ctx, + unsigned index, + const struct tgsi_full_declaration *decl) { - struct si_shader_context *ctx = - si_shader_context(&radeon_bld->bld_base); - struct lp_build_context *bld = &radeon_bld->bld_base.base; - struct gallivm_state *gallivm = &radeon_bld->gallivm; + struct lp_build_context *bld = &ctx->bld_base.base; + struct gallivm_state *gallivm = &ctx->gallivm; LLVMValueRef value = 0; switch (decl->Semantic.Name) { case TGSI_SEMANTIC_INSTANCEID: - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, ctx->param_instance_id); break; case TGSI_SEMANTIC_VERTEXID: value = LLVMBuildAdd(gallivm->builder, - LLVMGetParam(radeon_bld->main_fn, + LLVMGetParam(ctx->main_fn, ctx->param_vertex_id), - LLVMGetParam(radeon_bld->main_fn, + LLVMGetParam(ctx->main_fn, SI_PARAM_BASE_VERTEX), ""); break; case TGSI_SEMANTIC_VERTEXID_NOBASE: - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, ctx->param_vertex_id); break; case TGSI_SEMANTIC_BASEVERTEX: - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, SI_PARAM_BASE_VERTEX); break; case TGSI_SEMANTIC_BASEINSTANCE: - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, SI_PARAM_START_INSTANCE); break; case TGSI_SEMANTIC_DRAWID: - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, SI_PARAM_DRAWID); break; case TGSI_SEMANTIC_INVOCATIONID: if (ctx->type == PIPE_SHADER_TESS_CTRL) value = unpack_param(ctx, SI_PARAM_REL_IDS, 8, 5); else if (ctx->type == PIPE_SHADER_GEOMETRY) - value = LLVMGetParam(radeon_bld->main_fn, + value = LLVMGetParam(ctx->main_fn, SI_PARAM_GS_INSTANCE_ID); else assert(!"INVOCATIONID not implemented"); break; case TGSI_SEMANTIC_POSITION: { LLVMValueRef pos[4] = { - LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_X_FLOAT), - LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_Y_FLOAT), - LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_Z_FLOAT), - lp_build_emit_llvm_unary(&radeon_bld->bld_base, TGSI_OPCODE_RCP, - LLVMGetParam(radeon_bld->main_fn, + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_X_FLOAT), + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_Y_FLOAT), + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_Z_FLOAT), + lp_build_emit_llvm_unary(&ctx->bld_base, TGSI_OPCODE_RCP, + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_W_FLOAT)), }; value = lp_build_gather_values(gallivm, pos, 4); break; } case TGSI_SEMANTIC_FACE: - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_FRONT_FACE); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_FRONT_FACE); break; case TGSI_SEMANTIC_SAMPLEID: - value = get_sample_id(radeon_bld); + value = get_sample_id(ctx); break; case TGSI_SEMANTIC_SAMPLEPOS: { LLVMValueRef pos[4] = { - LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_X_FLOAT), - LLVMGetParam(radeon_bld->main_fn, SI_PARAM_POS_Y_FLOAT), + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_X_FLOAT), + LLVMGetParam(ctx->main_fn, SI_PARAM_POS_Y_FLOAT), lp_build_const_float(gallivm, 0), lp_build_const_float(gallivm, 0) }; - pos[0] = lp_build_emit_llvm_unary(&radeon_bld->bld_base, + pos[0] = lp_build_emit_llvm_unary(&ctx->bld_base, TGSI_OPCODE_FRC, pos[0]); - pos[1] = lp_build_emit_llvm_unary(&radeon_bld->bld_base, + pos[1] = lp_build_emit_llvm_unary(&ctx->bld_base, TGSI_OPCODE_FRC, pos[1]); value = lp_build_gather_values(gallivm, pos, 4); break; } case TGSI_SEMANTIC_SAMPLEMASK: /* This can only occur with the OpenGL Core profile, which * doesn't support smoothing. */ - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_SAMPLE_COVERAGE); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_SAMPLE_COVERAGE); break; case TGSI_SEMANTIC_TESSCOORD: { LLVMValueRef coord[4] = { - LLVMGetParam(radeon_bld->main_fn, ctx->param_tes_u), - LLVMGetParam(radeon_bld->main_fn, ctx->param_tes_v), + LLVMGetParam(ctx->main_fn, ctx->param_tes_u), + LLVMGetParam(ctx->main_fn, ctx->param_tes_v), bld->zero, bld->zero }; /* 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, bld->one, lp_build_add(bld, coord[0], coord[1])); @@ -1517,21 +1507,21 @@ static void declare_system_value( rw_buffers = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS); buffer = ac_build_indexed_load_const(&ctx->ac, rw_buffers, lp_build_const_int32(gallivm, SI_HS_RING_TESS_OFFCHIP)); base = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds); addr = get_tcs_tes_buffer_address(ctx, get_rel_patch_id(ctx), NULL, lp_build_const_int32(gallivm, param)); - value = buffer_load(&radeon_bld->bld_base, TGSI_TYPE_FLOAT, + value = buffer_load(&ctx->bld_base, TGSI_TYPE_FLOAT, ~0, buffer, base, addr, true); break; } case TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI: case TGSI_SEMANTIC_DEFAULT_TESSINNER_SI: { LLVMValueRef buf, slot, val[4]; int i, offset; @@ -1542,56 +1532,56 @@ static void declare_system_value( offset = decl->Semantic.Name == TGSI_SEMANTIC_DEFAULT_TESSINNER_SI ? 4 : 0; for (i = 0; i < 4; i++) val[i] = buffer_load_const(ctx, buf, lp_build_const_int32(gallivm, (offset + i) * 4)); value = lp_build_gather_values(gallivm, val, 4); break; } case TGSI_SEMANTIC_PRIMID: - value = get_primitive_id(&radeon_bld->bld_base, 0); + value = get_primitive_id(&ctx->bld_base, 0); break; case TGSI_SEMANTIC_GRID_SIZE: - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_GRID_SIZE); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_GRID_SIZE); break; case TGSI_SEMANTIC_BLOCK_SIZE: { LLVMValueRef values[3]; unsigned i; unsigned *properties = ctx->shader->selector->info.properties; if (properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] != 0) { unsigned sizes[3] = { properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH], properties[TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT], properties[TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH] }; for (i = 0; i < 3; ++i) values[i] = lp_build_const_int32(gallivm, sizes[i]); value = lp_build_gather_values(gallivm, values, 3); } else { - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_BLOCK_SIZE); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_BLOCK_SIZE); } break; } case TGSI_SEMANTIC_BLOCK_ID: - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_BLOCK_ID); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_BLOCK_ID); break; case TGSI_SEMANTIC_THREAD_ID: - value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_THREAD_ID); + value = LLVMGetParam(ctx->main_fn, SI_PARAM_THREAD_ID); break; case TGSI_SEMANTIC_HELPER_INVOCATION: if (HAVE_LLVM >= 0x0309) { value = lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.ps.live", ctx->i1, NULL, 0, LP_FUNC_ATTR_READNONE); value = LLVMBuildNot(gallivm->builder, value, ""); value = LLVMBuildSExt(gallivm->builder, value, ctx->i32, ""); @@ -1599,30 +1589,28 @@ static void declare_system_value( assert(!"TGSI_SEMANTIC_HELPER_INVOCATION unsupported"); return; } break; default: assert(!"unknown system value"); return; } - radeon_bld->system_values[index] = value; + ctx->system_values[index] = value; } -static void declare_compute_memory(struct si_shader_context *radeon_bld, +static void declare_compute_memory(struct si_shader_context *ctx, const struct tgsi_full_declaration *decl) { - struct si_shader_context *ctx = - si_shader_context(&radeon_bld->bld_base); struct si_shader_selector *sel = ctx->shader->selector; - struct gallivm_state *gallivm = &radeon_bld->gallivm; + struct gallivm_state *gallivm = &ctx->gallivm; LLVMTypeRef i8p = LLVMPointerType(ctx->i8, LOCAL_ADDR_SPACE); LLVMValueRef var; assert(decl->Declaration.MemType == TGSI_MEMORY_TYPE_SHARED); assert(decl->Range.First == decl->Range.Last); assert(!ctx->shared_memory); var = LLVMAddGlobalInAddressSpace(gallivm->module, LLVMArrayType(ctx->i8, sel->local_size), -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev