From: Timothy Arceri Date: Tue, 30 Jan 2018 03:54:13 +0000 (+1100) Subject: radeonsi/nir: add si_nir_lookup_interp_param() helper X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3a47b138e3d94494730b3131f70d1e67cfb1826c;p=mesa.git radeonsi/nir: add si_nir_lookup_interp_param() helper Reviewed-by: Marek Olšák --- 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 +#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,