From 4477be2404c9e3bb14835afcb1516daa25b8bb08 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 30 Nov 2015 15:39:58 +1000 Subject: [PATCH] r600/shader: add get_lds_offset0 helper This retrievs the offset into the LDS for a patch or non-patch variable, it takes the RelPatch channel and a temporary register. Signed-off-by: Dave Airlie --- src/gallium/drivers/r600/r600_shader.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index b6a4fcd..53b4c77 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -763,6 +763,28 @@ static int single_alu_op3(struct r600_shader_ctx *ctx, int op, return 0; } +/* put it in temp_reg.x */ +static int get_lds_offset0(struct r600_shader_ctx *ctx, + int rel_patch_chan, + int temp_reg, bool is_patch_var) +{ + int r; + + /* MUL temp.x, patch_stride (input_vals.x), rel_patch_id (r0.y (tcs)) */ + /* ADD + Dimension - patch0_offset (input_vals.z), + Non-dim - patch0_data_offset (input_vals.w) + */ + r = single_alu_op3(ctx, ALU_OP3_MULADD_UINT24, + temp_reg, 0, + ctx->tess_output_info, 0, + 0, rel_patch_chan, + ctx->tess_output_info, is_patch_var ? 3 : 2); + if (r) + return r; + return 0; +} + static inline int get_address_file_reg(struct r600_shader_ctx *ctx, int index) { return index > 0 ? ctx->bc->index_reg[index - 1] : ctx->bc->ar_reg; -- 2.7.4