From 497b95fdf641eb5e52de1a6a51d251ee2b3bdb2d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Wed, 17 May 2017 17:44:34 +0200 Subject: [PATCH] tgsi,st/mesa: move varying slot to semantic mapping into a helper for VS MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We will use this helper in radeonsi's NIR path. Reviewed-by: Samuel Pitoiset Reviewed-by: Marek Olšák --- 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 99ab0c00bb5..9ae8e6c8ca5 100644 --- a/src/gallium/auxiliary/Makefile.sources +++ b/src/gallium/auxiliary/Makefile.sources @@ -147,6 +147,8 @@ C_SOURCES := \ 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 \ 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 00000000000..44fae1c28e6 --- /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 00000000000..4c708f4e59f --- /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 + +#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 6de61741dcf..eb44fc57b57 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -417,87 +417,11 @@ st_translate_vertex_program(struct st_context *st, 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 */ diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 3f0cf49f025..8e9f4c5e826 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -38,11 +38,11 @@ #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 @@ -358,23 +358,8 @@ st_reference_compprog(struct st_context *st, 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 -- 2.30.2