r600/shader: add get_lds_offset0 helper
authorDave Airlie <airlied@redhat.com>
Mon, 30 Nov 2015 05:39:58 +0000 (15:39 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 6 Dec 2015 23:59:01 +0000 (09:59 +1000)
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 <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index b6a4fcd927dd756a88416573e0d0c123114e48bd..53b4c7788fca9d8898813dbe23cd0b7d6e48b5fe 100644 (file)
@@ -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;