diff options
author | Marek Olšák <[email protected]> | 2020-01-03 16:25:48 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2020-01-15 15:06:33 -0500 |
commit | 7a25521f92817c28790c59a00a21bd5b11d09e3b (patch) | |
tree | 79f195d9f8345c55e84b22ba3466fad4aeedc208 /src/gallium | |
parent | cf65c6f0d281bc64c9cea07b7f394036b2eeeaad (diff) |
radeonsi/gfx10: separate code for getting edgeflags from the gs_invocation_id VGPR
Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeonsi/gfx10_shader_ngg.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c b/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c index f951c8ca6d7..0eb422a7686 100644 --- a/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c +++ b/src/gallium/drivers/radeonsi/gfx10_shader_ngg.c @@ -71,6 +71,18 @@ static LLVMValueRef ngg_get_query_buf(struct si_shader_context *ctx) LLVMConstInt(ctx->i32, GFX10_GS_QUERY_BUF, false)); } +static LLVMValueRef ngg_get_initial_edgeflag(struct si_shader_context *ctx, unsigned index) +{ + if (ctx->type == PIPE_SHADER_VERTEX) { + LLVMValueRef tmp; + tmp = LLVMBuildLShr(ctx->ac.builder, + ac_get_arg(&ctx->ac, ctx->args.gs_invocation_id), + LLVMConstInt(ctx->ac.i32, 8 + index, false), ""); + return LLVMBuildTrunc(ctx->ac.builder, tmp, ctx->ac.i1, ""); + } + return ctx->i1false; +} + static void build_streamout_vertex(struct si_shader_context *ctx, LLVMValueRef *so_buffer, LLVMValueRef *wg_offset_dw, unsigned stream, LLVMValueRef offset_vtx, @@ -668,15 +680,7 @@ void gfx10_emit_ngg_epilogue(struct ac_shader_abi *abi, memcpy(prim.index, vtxindex, sizeof(vtxindex[0]) * 3); for (unsigned i = 0; i < num_vertices; ++i) { - if (ctx->type != PIPE_SHADER_VERTEX) { - prim.edgeflag[i] = ctx->i1false; - continue; - } - - tmp = LLVMBuildLShr(builder, - ac_get_arg(&ctx->ac, ctx->args.gs_invocation_id), - LLVMConstInt(ctx->ac.i32, 8 + i, false), ""); - prim.edgeflag[i] = LLVMBuildTrunc(builder, tmp, ctx->ac.i1, ""); + prim.edgeflag[i] = ngg_get_initial_edgeflag(ctx, i); if (sel->info.writes_edgeflag) { tmp2 = LLVMBuildLoad(builder, user_edgeflags[i], ""); |