radv: mark all tess output for an indirect access.

If a shader does a tcs store with an indirect access, we
were only marking the first spot as used. For indirect access
we always now mark all slots used by the variable.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105464
Fixes: 94f9591995 (radv/ac: add support for TCS/TES inputs/outputs.)
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie
2018-03-14 10:21:46 +10:00
parent 4f0c89d66c
commit 27a5e5366e

View File

@@ -1205,13 +1205,14 @@ static LLVMValueRef get_tcs_tes_buffer_address_params(struct radv_shader_context
static void static void
mark_tess_output(struct radv_shader_context *ctx, mark_tess_output(struct radv_shader_context *ctx,
bool is_patch, uint32_t param) bool is_patch, uint32_t param, int num_slots)
{ {
uint64_t slot_mask = (1ull << num_slots) - 1;
if (is_patch) { if (is_patch) {
ctx->tess_patch_outputs_written |= (1ull << param); ctx->tess_patch_outputs_written |= (slot_mask << param);
} else } else
ctx->tess_outputs_written |= (1ull << param); ctx->tess_outputs_written |= (slot_mask << param);
} }
static LLVMValueRef static LLVMValueRef
@@ -1308,6 +1309,7 @@ store_tcs_output(struct ac_shader_abi *abi,
const unsigned component = var->data.location_frac; const unsigned component = var->data.location_frac;
const bool is_patch = var->data.patch; const bool is_patch = var->data.patch;
const bool is_compact = var->data.compact; const bool is_compact = var->data.compact;
const unsigned count = glsl_count_attribute_slots(var->type, false);
LLVMValueRef dw_addr; LLVMValueRef dw_addr;
LLVMValueRef stride = NULL; LLVMValueRef stride = NULL;
LLVMValueRef buf_addr = NULL; LLVMValueRef buf_addr = NULL;
@@ -1336,7 +1338,10 @@ store_tcs_output(struct ac_shader_abi *abi,
dw_addr = get_tcs_out_current_patch_data_offset(ctx); dw_addr = get_tcs_out_current_patch_data_offset(ctx);
} }
mark_tess_output(ctx, is_patch, param); if (param_index)
mark_tess_output(ctx, is_patch, param, count);
else
mark_tess_output(ctx, is_patch, param, 1);
dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride, dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
param_index); param_index);
@@ -2442,9 +2447,9 @@ handle_ls_outputs_post(struct radv_shader_context *ctx)
if (i == VARYING_SLOT_CLIP_DIST0) if (i == VARYING_SLOT_CLIP_DIST0)
length = ctx->num_output_clips + ctx->num_output_culls; length = ctx->num_output_clips + ctx->num_output_culls;
int param = shader_io_get_unique_index(i); int param = shader_io_get_unique_index(i);
mark_tess_output(ctx, false, param); mark_tess_output(ctx, false, param, 1);
if (length > 4) if (length > 4)
mark_tess_output(ctx, false, param + 1); mark_tess_output(ctx, false, param + 1, 1);
LLVMValueRef dw_addr = LLVMBuildAdd(ctx->ac.builder, base_dw_addr, LLVMValueRef dw_addr = LLVMBuildAdd(ctx->ac.builder, base_dw_addr,
LLVMConstInt(ctx->ac.i32, param * 4, false), LLVMConstInt(ctx->ac.i32, param * 4, false),
""); "");
@@ -2588,13 +2593,13 @@ write_tess_factors(struct radv_shader_context *ctx)
if (inner_comps) { if (inner_comps) {
tess_inner_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_INNER); tess_inner_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_INNER);
mark_tess_output(ctx, true, tess_inner_index); mark_tess_output(ctx, true, tess_inner_index, 1);
lds_inner = LLVMBuildAdd(ctx->ac.builder, lds_base, lds_inner = LLVMBuildAdd(ctx->ac.builder, lds_base,
LLVMConstInt(ctx->ac.i32, tess_inner_index * 4, false), ""); LLVMConstInt(ctx->ac.i32, tess_inner_index * 4, false), "");
} }
tess_outer_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_OUTER); tess_outer_index = shader_io_get_unique_index(VARYING_SLOT_TESS_LEVEL_OUTER);
mark_tess_output(ctx, true, tess_outer_index); mark_tess_output(ctx, true, tess_outer_index, 1);
lds_outer = LLVMBuildAdd(ctx->ac.builder, lds_base, lds_outer = LLVMBuildAdd(ctx->ac.builder, lds_base,
LLVMConstInt(ctx->ac.i32, tess_outer_index * 4, false), ""); LLVMConstInt(ctx->ac.i32, tess_outer_index * 4, false), "");