Path: blob/21.2-virgl/src/gallium/auxiliary/tgsi/tgsi_from_mesa.c
4565 views
/*1* Copyright 2017 Advanced Micro Devices, Inc.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* on the rights to use, copy, modify, merge, publish, distribute, sub7* license, and/or sell copies of the Software, and to permit persons to whom8* the Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL17* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,18* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20* USE OR OTHER DEALINGS IN THE SOFTWARE.21*/2223#include "tgsi/tgsi_from_mesa.h"2425#include "pipe/p_compiler.h"2627#include "util/compiler.h"2829/**30* Determine the semantic index that is used when the given varying is mapped31* to TGSI_SEMANTIC_GENERIC.32*/33unsigned34tgsi_get_generic_gl_varying_index(gl_varying_slot attr,35bool needs_texcoord_semantic)36{37if (attr >= VARYING_SLOT_VAR0) {38if (needs_texcoord_semantic)39return attr - VARYING_SLOT_VAR0;40else41return 9 + (attr - VARYING_SLOT_VAR0);42}43if (attr == VARYING_SLOT_PNTC) {44assert(!needs_texcoord_semantic);45return 8;46}47if (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) {48assert(!needs_texcoord_semantic);49return attr - VARYING_SLOT_TEX0;50}5152assert(0);53return 0;54}5556/**57* Determine the semantic name and index used for the given varying.58*/59void60tgsi_get_gl_varying_semantic(gl_varying_slot attr,61bool needs_texcoord_semantic,62unsigned *semantic_name,63unsigned *semantic_index)64{65switch (attr) {66case VARYING_SLOT_PRIMITIVE_ID:67*semantic_name = TGSI_SEMANTIC_PRIMID;68*semantic_index = 0;69break;70case VARYING_SLOT_POS:71*semantic_name = TGSI_SEMANTIC_POSITION;72*semantic_index = 0;73break;74case VARYING_SLOT_COL0:75*semantic_name = TGSI_SEMANTIC_COLOR;76*semantic_index = 0;77break;78case VARYING_SLOT_COL1:79*semantic_name = TGSI_SEMANTIC_COLOR;80*semantic_index = 1;81break;82case VARYING_SLOT_BFC0:83*semantic_name = TGSI_SEMANTIC_BCOLOR;84*semantic_index = 0;85break;86case VARYING_SLOT_BFC1:87*semantic_name = TGSI_SEMANTIC_BCOLOR;88*semantic_index = 1;89break;90case VARYING_SLOT_FOGC:91*semantic_name = TGSI_SEMANTIC_FOG;92*semantic_index = 0;93break;94case VARYING_SLOT_PSIZ:95*semantic_name = TGSI_SEMANTIC_PSIZE;96*semantic_index = 0;97break;98case VARYING_SLOT_CLIP_DIST0:99*semantic_name = TGSI_SEMANTIC_CLIPDIST;100*semantic_index = 0;101break;102case VARYING_SLOT_CLIP_DIST1:103*semantic_name = TGSI_SEMANTIC_CLIPDIST;104*semantic_index = 1;105break;106case VARYING_SLOT_CULL_DIST0:107case VARYING_SLOT_CULL_DIST1:108/* these should have been lowered by GLSL */109assert(0);110break;111case VARYING_SLOT_EDGE:112*semantic_name = TGSI_SEMANTIC_EDGEFLAG;113*semantic_index = 0;114break;115case VARYING_SLOT_CLIP_VERTEX:116*semantic_name = TGSI_SEMANTIC_CLIPVERTEX;117*semantic_index = 0;118break;119case VARYING_SLOT_LAYER:120*semantic_name = TGSI_SEMANTIC_LAYER;121*semantic_index = 0;122break;123case VARYING_SLOT_VIEWPORT:124*semantic_name = TGSI_SEMANTIC_VIEWPORT_INDEX;125*semantic_index = 0;126break;127case VARYING_SLOT_FACE:128*semantic_name = TGSI_SEMANTIC_FACE;129*semantic_index = 0;130break;131case VARYING_SLOT_PNTC:132*semantic_name = TGSI_SEMANTIC_PCOORD;133*semantic_index = 0;134break;135case VARYING_SLOT_TESS_LEVEL_OUTER:136*semantic_name = TGSI_SEMANTIC_TESSOUTER;137*semantic_index = 0;138break;139case VARYING_SLOT_TESS_LEVEL_INNER:140*semantic_name = TGSI_SEMANTIC_TESSINNER;141*semantic_index = 0;142break;143case VARYING_SLOT_VIEWPORT_MASK:144*semantic_name = TGSI_SEMANTIC_VIEWPORT_MASK;145*semantic_index = 0;146break;147148case VARYING_SLOT_TEX0:149case VARYING_SLOT_TEX1:150case VARYING_SLOT_TEX2:151case VARYING_SLOT_TEX3:152case VARYING_SLOT_TEX4:153case VARYING_SLOT_TEX5:154case VARYING_SLOT_TEX6:155case VARYING_SLOT_TEX7:156if (needs_texcoord_semantic) {157*semantic_name = TGSI_SEMANTIC_TEXCOORD;158*semantic_index = attr - VARYING_SLOT_TEX0;159break;160}161FALLTHROUGH;162case VARYING_SLOT_VAR0:163default:164assert(attr >= VARYING_SLOT_VAR0 ||165(attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7));166if (attr >= VARYING_SLOT_PATCH0) {167*semantic_name = TGSI_SEMANTIC_PATCH;168*semantic_index = attr - VARYING_SLOT_PATCH0;169} else {170*semantic_name = TGSI_SEMANTIC_GENERIC;171*semantic_index =172tgsi_get_generic_gl_varying_index(attr, needs_texcoord_semantic);173}174break;175}176}177178/**179* Determine the semantic name and index used for the given fragment shader180* result.181*/182void183tgsi_get_gl_frag_result_semantic(gl_frag_result frag_result,184unsigned *semantic_name,185unsigned *semantic_index)186{187if (frag_result >= FRAG_RESULT_DATA0) {188*semantic_name = TGSI_SEMANTIC_COLOR;189*semantic_index = frag_result - FRAG_RESULT_DATA0;190return;191}192193*semantic_index = 0;194195switch (frag_result) {196case FRAG_RESULT_DEPTH:197*semantic_name = TGSI_SEMANTIC_POSITION;198break;199case FRAG_RESULT_STENCIL:200*semantic_name = TGSI_SEMANTIC_STENCIL;201break;202case FRAG_RESULT_COLOR:203*semantic_name = TGSI_SEMANTIC_COLOR;204break;205case FRAG_RESULT_SAMPLE_MASK:206*semantic_name = TGSI_SEMANTIC_SAMPLEMASK;207break;208default:209assert(false);210}211}212213/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */214enum tgsi_semantic215tgsi_get_sysval_semantic(unsigned sysval)216{217switch (sysval) {218/* Vertex shader */219case SYSTEM_VALUE_VERTEX_ID:220return TGSI_SEMANTIC_VERTEXID;221case SYSTEM_VALUE_INSTANCE_ID:222return TGSI_SEMANTIC_INSTANCEID;223case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:224return TGSI_SEMANTIC_VERTEXID_NOBASE;225case SYSTEM_VALUE_BASE_VERTEX:226return TGSI_SEMANTIC_BASEVERTEX;227case SYSTEM_VALUE_BASE_INSTANCE:228return TGSI_SEMANTIC_BASEINSTANCE;229case SYSTEM_VALUE_DRAW_ID:230return TGSI_SEMANTIC_DRAWID;231232/* Geometry shader */233case SYSTEM_VALUE_INVOCATION_ID:234return TGSI_SEMANTIC_INVOCATIONID;235236/* Fragment shader */237case SYSTEM_VALUE_FRAG_COORD:238return TGSI_SEMANTIC_POSITION;239case SYSTEM_VALUE_POINT_COORD:240return TGSI_SEMANTIC_PCOORD;241case SYSTEM_VALUE_FRONT_FACE:242return TGSI_SEMANTIC_FACE;243case SYSTEM_VALUE_SAMPLE_ID:244return TGSI_SEMANTIC_SAMPLEID;245case SYSTEM_VALUE_SAMPLE_POS:246return TGSI_SEMANTIC_SAMPLEPOS;247case SYSTEM_VALUE_SAMPLE_MASK_IN:248return TGSI_SEMANTIC_SAMPLEMASK;249case SYSTEM_VALUE_HELPER_INVOCATION:250return TGSI_SEMANTIC_HELPER_INVOCATION;251252/* Tessellation shader */253case SYSTEM_VALUE_TESS_COORD:254return TGSI_SEMANTIC_TESSCOORD;255case SYSTEM_VALUE_VERTICES_IN:256return TGSI_SEMANTIC_VERTICESIN;257case SYSTEM_VALUE_PRIMITIVE_ID:258return TGSI_SEMANTIC_PRIMID;259case SYSTEM_VALUE_TESS_LEVEL_OUTER:260return TGSI_SEMANTIC_TESSOUTER;261case SYSTEM_VALUE_TESS_LEVEL_INNER:262return TGSI_SEMANTIC_TESSINNER;263264/* Compute shader */265case SYSTEM_VALUE_LOCAL_INVOCATION_ID:266return TGSI_SEMANTIC_THREAD_ID;267case SYSTEM_VALUE_WORKGROUP_ID:268return TGSI_SEMANTIC_BLOCK_ID;269case SYSTEM_VALUE_NUM_WORKGROUPS:270return TGSI_SEMANTIC_GRID_SIZE;271case SYSTEM_VALUE_WORKGROUP_SIZE:272return TGSI_SEMANTIC_BLOCK_SIZE;273274/* ARB_shader_ballot */275case SYSTEM_VALUE_SUBGROUP_SIZE:276return TGSI_SEMANTIC_SUBGROUP_SIZE;277case SYSTEM_VALUE_SUBGROUP_INVOCATION:278return TGSI_SEMANTIC_SUBGROUP_INVOCATION;279case SYSTEM_VALUE_SUBGROUP_EQ_MASK:280return TGSI_SEMANTIC_SUBGROUP_EQ_MASK;281case SYSTEM_VALUE_SUBGROUP_GE_MASK:282return TGSI_SEMANTIC_SUBGROUP_GE_MASK;283case SYSTEM_VALUE_SUBGROUP_GT_MASK:284return TGSI_SEMANTIC_SUBGROUP_GT_MASK;285case SYSTEM_VALUE_SUBGROUP_LE_MASK:286return TGSI_SEMANTIC_SUBGROUP_LE_MASK;287case SYSTEM_VALUE_SUBGROUP_LT_MASK:288return TGSI_SEMANTIC_SUBGROUP_LT_MASK;289290default:291unreachable("Unexpected system value to TGSI");292}293}294295enum tgsi_interpolate_mode296tgsi_get_interp_mode(enum glsl_interp_mode mode, bool color)297{298switch (mode) {299case INTERP_MODE_NONE:300return color ? TGSI_INTERPOLATE_COLOR : TGSI_INTERPOLATE_PERSPECTIVE;301case INTERP_MODE_FLAT:302return TGSI_INTERPOLATE_CONSTANT;303case INTERP_MODE_NOPERSPECTIVE:304return TGSI_INTERPOLATE_LINEAR;305case INTERP_MODE_SMOOTH:306return TGSI_INTERPOLATE_PERSPECTIVE;307default:308unreachable("unknown interpolation mode");309}310}311312313