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