[Mesa-dev] [PATCH v2 04/12] radeonsi/nir: add si_nir_lookup_interp_param() helper

Timothy Arceri tarceri at itsqueeze.com
Tue Jan 30 03:55:30 UTC 2018


Reviewed-by: Marek Olšák <marek.olsak at amd.com>
---
 src/amd/common/ac_shader_abi.h                    |  2 ++
 src/gallium/drivers/radeonsi/si_shader_internal.h |  4 +++
 src/gallium/drivers/radeonsi/si_shader_nir.c      | 36 +++++++++++++++++++++++
 3 files changed, 42 insertions(+)

diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h
index 3aab3bf95b..409b49a6cd 100644
--- a/src/amd/common/ac_shader_abi.h
+++ b/src/amd/common/ac_shader_abi.h
@@ -26,6 +26,8 @@
 
 #include <llvm-c/Core.h>
 
+#include "compiler/shader_enums.h"
+
 enum ac_descriptor_type {
 	AC_DESC_IMAGE,
 	AC_DESC_FMASK,
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index 3084d88fad..489c468f03 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -292,6 +292,10 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
 				   LLVMTypeRef type,
 				   unsigned swizzle);
 
+LLVMValueRef si_nir_lookup_interp_param(struct ac_shader_abi *abi,
+					enum glsl_interp_mode interp,
+					unsigned location);
+
 void si_llvm_emit_store(struct lp_build_tgsi_context *bld_base,
 			const struct tgsi_full_instruction *inst,
 			const struct tgsi_opcode_info *info,
diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index e055164dd4..b6aa79857a 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -648,6 +648,42 @@ LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi,
 	return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
 }
 
+LLVMValueRef
+si_nir_lookup_interp_param(struct ac_shader_abi *abi,
+			   enum glsl_interp_mode interp, unsigned location)
+{
+	struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+	int interp_param_idx = -1;
+
+	switch (interp) {
+	case INTERP_MODE_FLAT:
+		return NULL;
+	case INTERP_MODE_SMOOTH:
+	case INTERP_MODE_NONE:
+		if (location == INTERP_CENTER)
+			interp_param_idx = SI_PARAM_PERSP_CENTER;
+		else if (location == INTERP_CENTROID)
+			interp_param_idx = SI_PARAM_PERSP_CENTROID;
+		else if (location == INTERP_SAMPLE)
+			interp_param_idx = SI_PARAM_PERSP_SAMPLE;
+		break;
+	case INTERP_MODE_NOPERSPECTIVE:
+		if (location == INTERP_CENTER)
+			interp_param_idx = SI_PARAM_LINEAR_CENTER;
+		else if (location == INTERP_CENTROID)
+			interp_param_idx = SI_PARAM_LINEAR_CENTROID;
+		else if (location == INTERP_SAMPLE)
+			interp_param_idx = SI_PARAM_LINEAR_SAMPLE;
+		break;
+	default:
+		assert(!"Unhandled interpolation mode.");
+		return NULL;
+	}
+
+	return interp_param_idx != -1 ?
+		LLVMGetParam(ctx->main_fn, interp_param_idx) : NULL;
+}
+
 static LLVMValueRef
 si_nir_load_sampler_desc(struct ac_shader_abi *abi,
 		         unsigned descriptor_set, unsigned base_index,
-- 
2.14.3



More information about the mesa-dev mailing list