From c2ae39e0cea7ce43531c9de2e642ffb3add02ba2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 6 Sep 2020 00:24:31 -0400 Subject: [PATCH] nir: add mediump flag to IO semantics Reviewed-by: Alyssa Rosenzweig Reviewed-by: Eric Anholt Part-of: --- src/compiler/nir/nir.h | 3 ++- src/compiler/nir/nir_lower_io.c | 9 +++++++++ src/compiler/nir/nir_print.c | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 30c298c..22d6e6c 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1784,7 +1784,8 @@ typedef struct { unsigned dual_source_blend_index:1; unsigned fb_fetch_output:1; /* for GL_KHR_blend_equation_advanced */ unsigned gs_streams:8; /* xxyyzzww: 2-bit stream index for each component */ - unsigned _pad:9; + unsigned medium_precision:1; /* GLSL mediump qualifier */ + unsigned _pad:8; } nir_io_semantics; #define NIR_INTRINSIC_MAX_INPUTS 5 diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index fbe8e51..52c22ad 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -309,6 +309,9 @@ emit_load(struct lower_io_state *state, semantics.location = var->data.location; semantics.num_slots = get_number_of_slots(state, var); semantics.fb_fetch_output = var->data.fb_fetch_output; + semantics.medium_precision = + var->data.precision == GLSL_PRECISION_MEDIUM || + var->data.precision == GLSL_PRECISION_LOW; nir_intrinsic_set_io_semantics(load, semantics); } @@ -431,6 +434,9 @@ emit_store(struct lower_io_state *state, nir_ssa_def *data, semantics.num_slots = get_number_of_slots(state, var); semantics.dual_source_blend_index = var->data.index; semantics.gs_streams = gs_streams; + semantics.medium_precision = + var->data.precision == GLSL_PRECISION_MEDIUM || + var->data.precision == GLSL_PRECISION_LOW; nir_intrinsic_set_io_semantics(store, semantics); nir_builder_instr_insert(b, &store->instr); @@ -562,6 +568,9 @@ lower_interpolate_at(nir_intrinsic_instr *intrin, struct lower_io_state *state, nir_io_semantics semantics = {0}; semantics.location = var->data.location; semantics.num_slots = get_number_of_slots(state, var); + semantics.medium_precision = + var->data.precision == GLSL_PRECISION_MEDIUM || + var->data.precision == GLSL_PRECISION_LOW; nir_intrinsic_set_io_semantics(load, semantics); load->src[0] = nir_src_for_ssa(&bary_setup->dest.ssa); diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index 810d3ce..bfc35d9 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -982,6 +982,10 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state) } fprintf(fp, ")"); } + if (state->shader->info.stage == MESA_SHADER_FRAGMENT && + nir_intrinsic_io_semantics(instr).medium_precision) { + fprintf(fp, " mediump"); + } } break; -- 2.7.4