radeonsi/nir: add si_nir_lookup_interp_param() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 30 Jan 2018 03:54:13 +0000 (14:54 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 30 Jan 2018 22:14:07 +0000 (09:14 +1100)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_shader_abi.h
src/gallium/drivers/radeonsi/si_shader_internal.h
src/gallium/drivers/radeonsi/si_shader_nir.c

index 3aab3bf95b3b90bcf08db4cd01be50a9ccf65cfb..409b49a6cd79104212c937c77e8ef28512371ac5 100644 (file)
@@ -26,6 +26,8 @@
 
 #include <llvm-c/Core.h>
 
+#include "compiler/shader_enums.h"
+
 enum ac_descriptor_type {
        AC_DESC_IMAGE,
        AC_DESC_FMASK,
index 3084d88fad6df81af1252de20475679947152f0c..489c468f0307d97d02f117db81a75e1e19a67534 100644 (file)
@@ -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,
index e055164dd4048065b0d471f38358aa493faadf12..b6aa79857af1a3cc3576e18756a87ea370b4353c 100644 (file)
@@ -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,