From 59936a49dd0733492dfcdadb3918e6af6bc86e39 Mon Sep 17 00:00:00 2001 From: Michel Daenzer Date: Thu, 13 Feb 2014 15:37:11 +0900 Subject: radeonsi: Prevent geometry shader from emitting too many vertices --- src/gallium/drivers/radeonsi/si_shader.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/gallium/drivers/radeonsi') diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 77768214f5a..3a441f94909 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1905,6 +1905,7 @@ static void si_llvm_emit_vertex( LLVMValueRef soffset = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, SI_PARAM_GS2VS_OFFSET); LLVMValueRef gs_next_vertex; + LLVMValueRef can_emit, kill; LLVMValueRef t_list_ptr; LLVMValueRef t_list; LLVMValueRef args[2]; @@ -1934,6 +1935,21 @@ static void si_llvm_emit_vertex( /* Write vertex attribute values to GSVS ring */ gs_next_vertex = LLVMBuildLoad(gallivm->builder, si_shader_ctx->gs_next_vertex, ""); + + /* If this thread has already emitted the declared maximum number of + * vertices, kill it: excessive vertex emissions are not supposed to + * have any effect, and GS threads have no externally observable + * effects other than emitting vertices. + */ + can_emit = LLVMBuildICmp(gallivm->builder, LLVMIntULE, gs_next_vertex, + lp_build_const_int32(gallivm, + shader->gs_max_out_vertices), ""); + kill = lp_build_select(&bld_base->base, can_emit, + lp_build_const_float(gallivm, 1.0f), + lp_build_const_float(gallivm, -1.0f)); + build_intrinsic(gallivm->builder, "llvm.AMDGPU.kill", + LLVMVoidTypeInContext(gallivm->context), &kill, 1, 0); + for (i = 0; i < shader->noutput; i++) { LLVMValueRef *out_ptr = si_shader_ctx->radeon_bld.soa.outputs[shader->output[i].index]; -- cgit v1.2.3