aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2018-01-30 14:54:13 +1100
committerTimothy Arceri <[email protected]>2018-01-31 09:14:07 +1100
commit3a47b138e3d94494730b3131f70d1e67cfb1826c (patch)
tree23b2e621e12b2a976fdd0be5dea29b16f88b8214
parentb8808848ce5964cbff8dc1e2f5f6928f5632b8a2 (diff)
radeonsi/nir: add si_nir_lookup_interp_param() helper
Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r--src/amd/common/ac_shader_abi.h2
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_internal.h4
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_nir.c36
3 files changed, 42 insertions, 0 deletions
diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h
index 3aab3bf95b3..409b49a6cd7 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 3084d88fad6..489c468f030 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 e055164dd40..b6aa79857af 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,