Browse Source

radeonsi: move code writing tess factors into a separate function

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
tags/11.2-branchpoint
Marek Olšák 9 years ago
parent
commit
e21142087c
1 changed files with 21 additions and 9 deletions
  1. 21
    9
      src/gallium/drivers/radeonsi/si_shader.c

+ 21
- 9
src/gallium/drivers/radeonsi/si_shader.c View File

@@ -1959,21 +1959,20 @@ handle_semantic:
}
}

/* This only writes the tessellation factor levels. */
static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
LLVMValueRef rel_patch_id,
LLVMValueRef invocation_id,
LLVMValueRef tcs_out_current_patch_data_offset)
{
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
struct gallivm_state *gallivm = bld_base->base.gallivm;
struct si_shader *shader = si_shader_ctx->shader;
unsigned tess_inner_index, tess_outer_index;
LLVMValueRef lds_base, lds_inner, lds_outer;
LLVMValueRef tf_base, rel_patch_id, byteoffset, buffer, rw_buffers;
LLVMValueRef out[6], vec0, vec1, invocation_id;
LLVMValueRef lds_base, lds_inner, lds_outer, byteoffset, buffer;
LLVMValueRef out[6], vec0, vec1, rw_buffers, tf_base;
unsigned stride, outer_comps, inner_comps, i;
struct lp_build_if_state if_ctx;

invocation_id = unpack_param(si_shader_ctx, SI_PARAM_REL_IDS, 8, 5);

/* Do this only for invocation 0, because the tess levels are per-patch,
* not per-vertex.
*
@@ -2012,7 +2011,7 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
tess_inner_index = si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSINNER, 0);
tess_outer_index = si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSOUTER, 0);

lds_base = get_tcs_out_current_patch_data_offset(si_shader_ctx);
lds_base = tcs_out_current_patch_data_offset;
lds_inner = LLVMBuildAdd(gallivm->builder, lds_base,
lp_build_const_int32(gallivm,
tess_inner_index * 4), "");
@@ -2041,7 +2040,6 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
/* Get the offset. */
tf_base = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn,
SI_PARAM_TESS_FACTOR_OFFSET);
rel_patch_id = get_rel_patch_id(si_shader_ctx);
byteoffset = LLVMBuildMul(gallivm->builder, rel_patch_id,
lp_build_const_int32(gallivm, 4 * stride), "");

@@ -2054,6 +2052,20 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
lp_build_endif(&if_ctx);
}

/* This only writes the tessellation factor levels. */
static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base)
{
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);
LLVMValueRef invocation_id;

invocation_id = unpack_param(si_shader_ctx, SI_PARAM_REL_IDS, 8, 5);

si_write_tess_factors(bld_base,
get_rel_patch_id(si_shader_ctx),
invocation_id,
get_tcs_out_current_patch_data_offset(si_shader_ctx));
}

static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context * bld_base)
{
struct si_shader_context *si_shader_ctx = si_shader_context(bld_base);

Loading…
Cancel
Save