From c17a441666d1e339140a68b2c619bf5195f3ff30 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 27 Dec 2019 15:32:50 -0500 Subject: [PATCH] pan/midgard: Implement flat shading We need to shuffle around some lowerings but it's just a flag. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/midgard_compile.c | 22 ++++++++++++++++------ src/panfrost/midgard/midgard_compile.h | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 4e2e9c985d6..abdd07cbb96 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1252,7 +1252,7 @@ emit_varying_read( compiler_context *ctx, unsigned dest, unsigned offset, unsigned nr_comp, unsigned component, - nir_src *indirect_offset, nir_alu_type type) + nir_src *indirect_offset, nir_alu_type type, bool flat) { /* XXX: Half-floats? */ /* TODO: swizzle, mask */ @@ -1266,7 +1266,7 @@ emit_varying_read( midgard_varying_parameter p = { .is_varying = 1, .interpolation = midgard_interp_default, - .flat = /*var->data.interpolation == INTERP_MODE_FLAT*/ 0 + .flat = flat, }; unsigned u; @@ -1445,15 +1445,21 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) case nir_intrinsic_load_uniform: case nir_intrinsic_load_ubo: case nir_intrinsic_load_ssbo: - case nir_intrinsic_load_input: { + case nir_intrinsic_load_input: + case nir_intrinsic_load_interpolated_input: { bool is_uniform = instr->intrinsic == nir_intrinsic_load_uniform; bool is_ubo = instr->intrinsic == nir_intrinsic_load_ubo; bool is_ssbo = instr->intrinsic == nir_intrinsic_load_ssbo; + bool is_flat = instr->intrinsic == nir_intrinsic_load_input; + bool is_interp = instr->intrinsic == nir_intrinsic_load_interpolated_input; /* Get the base type of the intrinsic */ /* TODO: Infer type? Does it matter? */ nir_alu_type t = - (is_ubo || is_ssbo) ? nir_type_uint : nir_intrinsic_type(instr); + (is_ubo || is_ssbo) ? nir_type_uint : + (is_interp) ? nir_type_float : + nir_intrinsic_type(instr); + t = nir_alu_type_get_base_type(t); if (!(is_ubo || is_ssbo)) { @@ -1471,7 +1477,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) offset += nir_src_as_uint(*src_offset); /* We may need to apply a fractional offset */ - int component = instr->intrinsic == nir_intrinsic_load_input ? + int component = (is_flat || is_interp) ? nir_intrinsic_component(instr) : 0; reg = nir_dest_index(ctx, &instr->dest); @@ -1499,7 +1505,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) emit_ssbo_access(ctx, &instr->instr, true, reg, offset, indirect_offset, uindex); } else if (ctx->stage == MESA_SHADER_FRAGMENT && !ctx->is_blend) { - emit_varying_read(ctx, reg, offset, nr_comp, component, !direct ? &instr->src[0] : NULL, t); + emit_varying_read(ctx, reg, offset, nr_comp, component, indirect_offset, t, is_flat); } else if (ctx->is_blend) { /* For blend shaders, load the input color, which is * preloaded to r0 */ @@ -1517,6 +1523,10 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) break; } + /* Artefact of load_interpolated_input. TODO: other barycentric modes */ + case nir_intrinsic_load_barycentric_pixel: + break; + /* Reads 128-bit value raw off the tilebuffer during blending, tasty */ case nir_intrinsic_load_raw_output_pan: diff --git a/src/panfrost/midgard/midgard_compile.h b/src/panfrost/midgard/midgard_compile.h index 60954664664..317a2b9e4c4 100644 --- a/src/panfrost/midgard/midgard_compile.h +++ b/src/panfrost/midgard/midgard_compile.h @@ -147,6 +147,7 @@ static const nir_shader_compiler_options midgard_nir_options = { .lower_doubles_options = nir_lower_dmod, .vectorize_io = true, + .use_interpolated_input_intrinsics = true }; #endif -- 2.30.2