Mesa (master): radeonsi: Prevent geometry shader from emitting too many vertices

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Feb 27 01:54:24 UTC 2014


Module: Mesa
Branch: master
Commit: 59936a49dd0733492dfcdadb3918e6af6bc86e39
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=59936a49dd0733492dfcdadb3918e6af6bc86e39

Author: Michel Daenzer <michel.daenzer at amd.com>
Date:   Thu Feb 13 15:37:11 2014 +0900

radeonsi: Prevent geometry shader from emitting too many vertices

---

 src/gallium/drivers/radeonsi/si_shader.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 7776821..3a441f9 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];




More information about the mesa-commit mailing list