diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 1e54e0629b1..2043214f2b4 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -2216,47 +2216,11 @@ get_barycentric(struct ir3_context *ctx, enum ir3_bary bary) return ctx->ij[bary]; } -/* TODO: make this a common NIR helper? - * there is a nir_system_value_from_intrinsic but it takes nir_intrinsic_op so - * it can't be extended to work with this - */ -static gl_system_value -nir_intrinsic_barycentric_sysval(nir_intrinsic_instr *intr) -{ - enum glsl_interp_mode interp_mode = nir_intrinsic_interp_mode(intr); - gl_system_value sysval; - - switch (intr->intrinsic) { - case nir_intrinsic_load_barycentric_pixel: - if (interp_mode == INTERP_MODE_NOPERSPECTIVE) - sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL; - else - sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL; - break; - case nir_intrinsic_load_barycentric_centroid: - if (interp_mode == INTERP_MODE_NOPERSPECTIVE) - sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID; - else - sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID; - break; - case nir_intrinsic_load_barycentric_sample: - if (interp_mode == INTERP_MODE_NOPERSPECTIVE) - sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE; - else - sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE; - break; - default: - unreachable("invalid barycentric intrinsic"); - } - - return sysval; -} - static void emit_intrinsic_barycentric(struct ir3_context *ctx, nir_intrinsic_instr *intr, struct ir3_instruction **dst) { - gl_system_value sysval = nir_intrinsic_barycentric_sysval(intr); + gl_system_value sysval = ir3_nir_intrinsic_barycentric_sysval(intr); if (!ctx->so->key.msaa && ctx->compiler->gen < 6) { switch (sysval) { diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c index c8c7b5202c6..c548dd507bf 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c @@ -1594,3 +1594,36 @@ ir3_const_state_get_free_space(const struct ir3_shader_variant *v, free_space_vec4 = ROUND_DOWN_TO(free_space_vec4, align_vec4); return free_space_vec4; } + +gl_system_value +ir3_nir_intrinsic_barycentric_sysval(nir_intrinsic_instr *intr) +{ + enum glsl_interp_mode interp_mode = + (enum glsl_interp_mode)nir_intrinsic_interp_mode(intr); + gl_system_value sysval; + + switch (intr->intrinsic) { + case nir_intrinsic_load_barycentric_pixel: + if (interp_mode == INTERP_MODE_NOPERSPECTIVE) + sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL; + else + sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL; + break; + case nir_intrinsic_load_barycentric_centroid: + if (interp_mode == INTERP_MODE_NOPERSPECTIVE) + sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID; + else + sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID; + break; + case nir_intrinsic_load_barycentric_sample: + if (interp_mode == INTERP_MODE_NOPERSPECTIVE) + sysval = SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE; + else + sysval = SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE; + break; + default: + unreachable("invalid barycentric intrinsic"); + } + + return sysval; +} diff --git a/src/freedreno/ir3/ir3_nir.h b/src/freedreno/ir3/ir3_nir.h index 1c7e507e277..87a3dc67a60 100644 --- a/src/freedreno/ir3/ir3_nir.h +++ b/src/freedreno/ir3/ir3_nir.h @@ -196,6 +196,13 @@ is_intrinsic_load(nir_intrinsic_op op) uint32_t ir3_nir_max_imm_offset(nir_intrinsic_instr *intrin, const void *data); +/* TODO: make this a common NIR helper? + * there is a nir_system_value_from_intrinsic but it takes nir_intrinsic_op so + * it can't be extended to work with this + */ +gl_system_value +ir3_nir_intrinsic_barycentric_sysval(nir_intrinsic_instr *intr); + ENDC; #endif /* IR3_NIR_H_ */