From b10cc245198d375b940a49b4f93a73bc75e47ce8 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 1 Feb 2016 17:34:12 -0500 Subject: [PATCH] nir: passthrough-edgeflags support Handled by tgsi_emulate for glsl->tgsi case. Signed-off-by: Rob Clark Reviewed-by: Connor Abbott Reviewed-by: Eric Anholt --- src/compiler/Makefile.sources | 1 + src/compiler/nir/nir.h | 2 + .../nir/nir_lower_passthrough_edgeflags.c | 58 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 src/compiler/nir/nir_lower_passthrough_edgeflags.c diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index 903e882c1e7..63fbbd0a0b0 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -200,6 +200,7 @@ NIR_FILES = \ nir/nir_lower_indirect_derefs.c \ nir/nir_lower_io.c \ nir/nir_lower_outputs_to_temporaries.c \ + nir/nir_lower_passthrough_edgeflags.c \ nir/nir_lower_phis_to_scalar.c \ nir/nir_lower_returns.c \ nir/nir_lower_samplers.c \ diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 4075a5f0fc2..51773412d20 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2374,6 +2374,8 @@ void nir_lower_two_sided_color(nir_shader *shader); void nir_lower_clamp_color_outputs(nir_shader *shader); +void nir_lower_passthrough_edgeflags(nir_shader *shader); + typedef struct nir_lower_wpos_ytransform_options { int state_tokens[5]; bool fs_coord_origin_upper_left :1; diff --git a/src/compiler/nir/nir_lower_passthrough_edgeflags.c b/src/compiler/nir/nir_lower_passthrough_edgeflags.c new file mode 100644 index 00000000000..c570c8ef333 --- /dev/null +++ b/src/compiler/nir/nir_lower_passthrough_edgeflags.c @@ -0,0 +1,58 @@ +/* + * Copyright © 2015 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "nir.h" +#include "nir_builder.h" + +static void +lower_impl(nir_function_impl *impl) +{ + nir_shader *shader = impl->function->shader; + nir_builder b; + nir_variable *in, *out; + nir_ssa_def *def; + + nir_builder_init(&b, impl); + b.cursor = nir_before_cf_list(&impl->body); + + in = nir_variable_create(shader, nir_var_shader_in, + glsl_vec4_type(), "edgeflag_in"); + in->data.location = VERT_ATTRIB_EDGEFLAG; + + out = nir_variable_create(shader, nir_var_shader_out, + glsl_vec4_type(), "edgeflag_out"); + out->data.location = VARYING_SLOT_EDGE; + + def = nir_load_var(&b, in); + nir_store_var(&b, out, def, 0xf); + + nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_dominance); +} + +void nir_lower_passthrough_edgeflags(nir_shader *shader) +{ + nir_function *function = nir_shader_get_entrypoint(shader); + if (function->impl) + lower_impl(function->impl); +} -- 2.30.2