diff options
author | Rob Clark <[email protected]> | 2016-02-01 17:34:12 -0500 |
---|---|---|
committer | Rob Clark <[email protected]> | 2016-05-11 12:20:11 -0400 |
commit | b10cc245198d375b940a49b4f93a73bc75e47ce8 (patch) | |
tree | 65838b8ffa4cbd42a4307bfc4118a8822b2f1661 /src/compiler | |
parent | 3a939d034e41755b46b51fbe9071f5d31cdf1f81 (diff) |
nir: passthrough-edgeflags support
Handled by tgsi_emulate for glsl->tgsi case.
Signed-off-by: Rob Clark <[email protected]>
Reviewed-by: Connor Abbott <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/Makefile.sources | 1 | ||||
-rw-r--r-- | src/compiler/nir/nir.h | 2 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_passthrough_edgeflags.c | 58 |
3 files changed, 61 insertions, 0 deletions
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); +} |