From: Nicolai Hähnle <nicolai.haeh...@amd.com> We will use this helper in radeonsi's NIR path. --- src/gallium/auxiliary/Makefile.sources | 2 + src/gallium/auxiliary/tgsi/tgsi_from_mesa.c | 150 ++++++++++++++++++++++++++++ src/gallium/auxiliary/tgsi/tgsi_from_mesa.h | 43 ++++++++ src/mesa/state_tracker/st_program.c | 86 +--------------- src/mesa/state_tracker/st_program.h | 21 +--- 5 files changed, 203 insertions(+), 99 deletions(-) create mode 100644 src/gallium/auxiliary/tgsi/tgsi_from_mesa.c create mode 100644 src/gallium/auxiliary/tgsi/tgsi_from_mesa.h
diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources index 99ab0c0..9ae8e6c 100644 --- a/src/gallium/auxiliary/Makefile.sources +++ b/src/gallium/auxiliary/Makefile.sources @@ -140,20 +140,22 @@ C_SOURCES := \ tgsi/tgsi_aa_point.c \ tgsi/tgsi_aa_point.h \ tgsi/tgsi_build.c \ tgsi/tgsi_build.h \ tgsi/tgsi_dump.c \ tgsi/tgsi_dump.h \ tgsi/tgsi_exec.c \ tgsi/tgsi_exec.h \ tgsi/tgsi_emulate.c \ tgsi/tgsi_emulate.h \ + tgsi/tgsi_from_mesa.c \ + tgsi/tgsi_from_mesa.h \ tgsi/tgsi_info.c \ tgsi/tgsi_info.h \ tgsi/tgsi_iterate.c \ tgsi/tgsi_iterate.h \ tgsi/tgsi_lowering.c \ tgsi/tgsi_lowering.h \ tgsi/tgsi_opcode_tmp.h \ tgsi/tgsi_parse.c \ tgsi/tgsi_parse.h \ tgsi/tgsi_point_sprite.c \ diff --git a/src/gallium/auxiliary/tgsi/tgsi_from_mesa.c b/src/gallium/auxiliary/tgsi/tgsi_from_mesa.c new file mode 100644 index 0000000..44fae1c --- /dev/null +++ b/src/gallium/auxiliary/tgsi/tgsi_from_mesa.c @@ -0,0 +1,150 @@ +/* + * Copyright 2017 Advanced Micro Devices, Inc. + * + * 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS 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 "tgsi/tgsi_from_mesa.h" + +#include "pipe/p_compiler.h" + +/** + * Determine the semantic index that is used when the given varying is mapped + * to TGSI_SEMANTIC_GENERIC. + */ +unsigned +tgsi_get_generic_gl_varying_index(gl_varying_slot attr, + bool needs_texcoord_semantic) +{ + if (attr >= VARYING_SLOT_VAR0) { + if (needs_texcoord_semantic) + return attr - VARYING_SLOT_VAR0; + else + return 9 + (attr - VARYING_SLOT_VAR0); + } + if (attr == VARYING_SLOT_PNTC) { + assert(!needs_texcoord_semantic); + return 8; + } + if (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) { + assert(!needs_texcoord_semantic); + return attr - VARYING_SLOT_TEX0; + } + + assert(0); + return 0; +} + +/** + * Determine the semantic name and index used for the given varying. + */ +void +tgsi_get_gl_varying_semantic(gl_varying_slot attr, + bool needs_texcoord_semantic, + unsigned *semantic_name, + unsigned *semantic_index) +{ + switch (attr) { + case VARYING_SLOT_POS: + *semantic_name = TGSI_SEMANTIC_POSITION; + *semantic_index = 0; + break; + case VARYING_SLOT_COL0: + *semantic_name = TGSI_SEMANTIC_COLOR; + *semantic_index = 0; + break; + case VARYING_SLOT_COL1: + *semantic_name = TGSI_SEMANTIC_COLOR; + *semantic_index = 1; + break; + case VARYING_SLOT_BFC0: + *semantic_name = TGSI_SEMANTIC_BCOLOR; + *semantic_index = 0; + break; + case VARYING_SLOT_BFC1: + *semantic_name = TGSI_SEMANTIC_BCOLOR; + *semantic_index = 1; + break; + case VARYING_SLOT_FOGC: + *semantic_name = TGSI_SEMANTIC_FOG; + *semantic_index = 0; + break; + case VARYING_SLOT_PSIZ: + *semantic_name = TGSI_SEMANTIC_PSIZE; + *semantic_index = 0; + break; + case VARYING_SLOT_CLIP_DIST0: + *semantic_name = TGSI_SEMANTIC_CLIPDIST; + *semantic_index = 0; + break; + case VARYING_SLOT_CLIP_DIST1: + *semantic_name = TGSI_SEMANTIC_CLIPDIST; + *semantic_index = 1; + break; + case VARYING_SLOT_CULL_DIST0: + case VARYING_SLOT_CULL_DIST1: + /* these should have been lowered by GLSL */ + assert(0); + break; + case VARYING_SLOT_EDGE: + *semantic_name = TGSI_SEMANTIC_EDGEFLAG; + *semantic_index = 0; + break; + case VARYING_SLOT_CLIP_VERTEX: + *semantic_name = TGSI_SEMANTIC_CLIPVERTEX; + *semantic_index = 0; + break; + case VARYING_SLOT_LAYER: + *semantic_name = TGSI_SEMANTIC_LAYER; + *semantic_index = 0; + break; + case VARYING_SLOT_VIEWPORT: + *semantic_name = TGSI_SEMANTIC_VIEWPORT_INDEX; + *semantic_index = 0; + break; + case VARYING_SLOT_PNTC: + *semantic_name = TGSI_SEMANTIC_PCOORD; + *semantic_index = 0; + break; + + case VARYING_SLOT_TEX0: + case VARYING_SLOT_TEX1: + case VARYING_SLOT_TEX2: + case VARYING_SLOT_TEX3: + case VARYING_SLOT_TEX4: + case VARYING_SLOT_TEX5: + case VARYING_SLOT_TEX6: + case VARYING_SLOT_TEX7: + if (needs_texcoord_semantic) { + *semantic_name = TGSI_SEMANTIC_TEXCOORD; + *semantic_index = attr - VARYING_SLOT_TEX0; + break; + } + /* fall through */ + case VARYING_SLOT_VAR0: + default: + assert(attr >= VARYING_SLOT_VAR0 || + (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); + *semantic_name = TGSI_SEMANTIC_GENERIC; + *semantic_index = + tgsi_get_generic_gl_varying_index(attr, needs_texcoord_semantic); + break; + } +} diff --git a/src/gallium/auxiliary/tgsi/tgsi_from_mesa.h b/src/gallium/auxiliary/tgsi/tgsi_from_mesa.h new file mode 100644 index 0000000..4c708f4 --- /dev/null +++ b/src/gallium/auxiliary/tgsi/tgsi_from_mesa.h @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Advanced Micro Devices, Inc. + * + * 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 + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS 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. + */ + +#ifndef TGSI_FROM_MESA_H +#define TGSI_FROM_MESA_H + +#include <stdbool.h> + +#include "pipe/p_shader_tokens.h" + +#include "compiler/shader_enums.h" + +void +tgsi_get_gl_varying_semantic(gl_varying_slot attr, + bool needs_texcoord_semantic, + unsigned *semantic_name, + unsigned *semantic_index); + +unsigned +tgsi_get_generic_gl_varying_index(gl_varying_slot attr, + bool needs_texcoord_semantic); + +#endif /* TGSI_FROM_MESA_H */ diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 6de6174..eb44fc5 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -410,101 +410,25 @@ st_translate_vertex_program(struct st_context *st, */ for (attr = 0; attr < VARYING_SLOT_MAX; attr++) { if ((stvp->Base.info.outputs_written & BITFIELD64_BIT(attr)) == 0) { stvp->result_to_output[attr] = ~0; } else { unsigned slot = num_outputs++; stvp->result_to_output[attr] = slot; - switch (attr) { - case VARYING_SLOT_POS: - output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_COL0: - output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_COL1: - output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; - output_semantic_index[slot] = 1; - break; - case VARYING_SLOT_BFC0: - output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_BFC1: - output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; - output_semantic_index[slot] = 1; - break; - case VARYING_SLOT_FOGC: - output_semantic_name[slot] = TGSI_SEMANTIC_FOG; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_PSIZ: - output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_CLIP_DIST0: - output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_CLIP_DIST1: - output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; - output_semantic_index[slot] = 1; - break; - case VARYING_SLOT_CULL_DIST0: - case VARYING_SLOT_CULL_DIST1: - /* these should have been lowered by GLSL */ - assert(0); - break; - case VARYING_SLOT_EDGE: - assert(0); - break; - case VARYING_SLOT_CLIP_VERTEX: - output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_LAYER: - output_semantic_name[slot] = TGSI_SEMANTIC_LAYER; - output_semantic_index[slot] = 0; - break; - case VARYING_SLOT_VIEWPORT: - output_semantic_name[slot] = TGSI_SEMANTIC_VIEWPORT_INDEX; - output_semantic_index[slot] = 0; - break; - - case VARYING_SLOT_TEX0: - case VARYING_SLOT_TEX1: - case VARYING_SLOT_TEX2: - case VARYING_SLOT_TEX3: - case VARYING_SLOT_TEX4: - case VARYING_SLOT_TEX5: - case VARYING_SLOT_TEX6: - case VARYING_SLOT_TEX7: - if (st->needs_texcoord_semantic) { - output_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD; - output_semantic_index[slot] = attr - VARYING_SLOT_TEX0; - break; - } - /* fall through */ - case VARYING_SLOT_VAR0: - default: - assert(attr >= VARYING_SLOT_VAR0 || - (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); - output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; - output_semantic_index[slot] = - st_get_generic_varying_index(st, attr); - break; - } + unsigned semantic_name, semantic_index; + tgsi_get_gl_varying_semantic(attr, st->needs_texcoord_semantic, + &semantic_name, &semantic_index); + output_semantic_name[slot] = semantic_name; + output_semantic_index[slot] = semantic_index; } } /* similar hack to above, presetup potentially unused edgeflag output */ stvp->result_to_output[VARYING_SLOT_EDGE] = num_outputs; output_semantic_name[num_outputs] = TGSI_SEMANTIC_EDGEFLAG; output_semantic_index[num_outputs] = 0; /* ARB_vp: */ if (!stvp->glsl_to_tgsi && !stvp->shader_program) { _mesa_remove_output_reads(&stvp->Base, PROGRAM_OUTPUT); diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 3f0cf49..8e9f4c5 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -31,25 +31,25 @@ */ #ifndef ST_PROGRAM_H #define ST_PROGRAM_H #include "main/mtypes.h" #include "main/atifragshader.h" #include "program/program.h" #include "pipe/p_state.h" +#include "tgsi/tgsi_from_mesa.h" #include "st_context.h" #include "st_texture.h" #include "st_glsl_to_tgsi.h" - #ifdef __cplusplus extern "C" { #endif #define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xff struct st_external_sampler_key { GLuint lower_nv12; /**< bitmask of 2 plane YUV samplers */ GLuint lower_iyuv; /**< bitmask of 3 plane YUV samplers */ @@ -351,37 +351,22 @@ st_reference_compprog(struct st_context *st, (struct gl_program **) ptr, (struct gl_program *) prog); } /** * This defines mapping from Mesa VARYING_SLOTs to TGSI GENERIC slots. */ static inline unsigned st_get_generic_varying_index(struct st_context *st, GLuint attr) { - if (attr >= VARYING_SLOT_VAR0) { - if (st->needs_texcoord_semantic) - return attr - VARYING_SLOT_VAR0; - else - return 9 + (attr - VARYING_SLOT_VAR0); - } - if (attr == VARYING_SLOT_PNTC) { - assert(!st->needs_texcoord_semantic); - return 8; - } - if (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) { - assert(!st->needs_texcoord_semantic); - return attr - VARYING_SLOT_TEX0; - } - - assert(0); - return 0; + return tgsi_get_generic_gl_varying_index((gl_varying_slot)attr, + st->needs_texcoord_semantic); } extern void st_set_prog_affected_state_flags(struct gl_program *prog); extern struct st_vp_variant * st_get_vp_variant(struct st_context *st, struct st_vertex_program *stvp, const struct st_vp_variant_key *key); -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev