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