aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-01-03 16:25:48 -0500
committerMarek Olšák <[email protected]>2020-01-15 15:06:33 -0500
commit7a25521f92817c28790c59a00a21bd5b11d09e3b (patch)
tree79f195d9f8345c55e84b22ba3466fad4aeedc208 /src/gallium
parentcf65c6f0d281bc64c9cea07b7f394036b2eeeaad (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.c22
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], "");