1/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright © 2015 Red Hat
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23 * IN THE SOFTWARE.
24 *
25 * Authors:
26 *    Rob Clark <robclark@freedesktop.org>
27 */
28
29#include "shader_enums.h"
30#include "util/macros.h"
31#include "mesa/main/config.h"
32
33#define ENUM(x) [x] = #x
34#define NAME(val) ((((val) < ARRAY_SIZE(names)) && names[(val)]) ? names[(val)] : "UNKNOWN")
35
36const char *
37gl_shader_stage_name(gl_shader_stage stage)
38{
39   static const char *names[] = {
40      ENUM(MESA_SHADER_VERTEX),
41      ENUM(MESA_SHADER_TESS_CTRL),
42      ENUM(MESA_SHADER_TESS_EVAL),
43      ENUM(MESA_SHADER_GEOMETRY),
44      ENUM(MESA_SHADER_FRAGMENT),
45      ENUM(MESA_SHADER_COMPUTE),
46      ENUM(MESA_SHADER_TASK),
47      ENUM(MESA_SHADER_MESH),
48      ENUM(MESA_SHADER_RAYGEN),
49      ENUM(MESA_SHADER_ANY_HIT),
50      ENUM(MESA_SHADER_CLOSEST_HIT),
51      ENUM(MESA_SHADER_MISS),
52      ENUM(MESA_SHADER_INTERSECTION),
53      ENUM(MESA_SHADER_CALLABLE),
54      ENUM(MESA_SHADER_KERNEL),
55   };
56   STATIC_ASSERT(ARRAY_SIZE(names) == MESA_ALL_SHADER_STAGES);
57   return NAME(stage);
58}
59
60/**
61 * Translate a gl_shader_stage to a short shader stage name for debug
62 * printouts and error messages.
63 */
64const char *
65_mesa_shader_stage_to_string(unsigned stage)
66{
67   switch (stage) {
68   case MESA_SHADER_VERTEX:   return "vertex";
69   case MESA_SHADER_FRAGMENT: return "fragment";
70   case MESA_SHADER_GEOMETRY: return "geometry";
71   case MESA_SHADER_COMPUTE:  return "compute";
72   case MESA_SHADER_KERNEL:   return "kernel";
73   case MESA_SHADER_TESS_CTRL: return "tessellation control";
74   case MESA_SHADER_TESS_EVAL: return "tessellation evaluation";
75   case MESA_SHADER_TASK:         return "task";
76   case MESA_SHADER_MESH:         return "mesh";
77   case MESA_SHADER_RAYGEN:       return "raygen";
78   case MESA_SHADER_ANY_HIT:      return "any hit";
79   case MESA_SHADER_CLOSEST_HIT:  return "closest hit";
80   case MESA_SHADER_MISS:         return "miss";
81   case MESA_SHADER_INTERSECTION: return "intersection";
82   case MESA_SHADER_CALLABLE:     return "callable";
83   }
84
85   unreachable("Unknown shader stage.");
86}
87
88/**
89 * Translate a gl_shader_stage to a shader stage abbreviation (VS, GS, FS)
90 * for debug printouts and error messages.
91 */
92const char *
93_mesa_shader_stage_to_abbrev(unsigned stage)
94{
95   switch (stage) {
96   case MESA_SHADER_VERTEX:   return "VS";
97   case MESA_SHADER_FRAGMENT: return "FS";
98   case MESA_SHADER_GEOMETRY: return "GS";
99   case MESA_SHADER_COMPUTE:  return "CS";
100   case MESA_SHADER_KERNEL:   return "CL";
101   case MESA_SHADER_TESS_CTRL: return "TCS";
102   case MESA_SHADER_TESS_EVAL: return "TES";
103   case MESA_SHADER_TASK:         return "TASK";
104   case MESA_SHADER_MESH:         return "MESH";
105   case MESA_SHADER_RAYGEN:       return "RGEN";
106   case MESA_SHADER_ANY_HIT:      return "RAHIT";
107   case MESA_SHADER_CLOSEST_HIT:  return "RCHIT";
108   case MESA_SHADER_MISS:         return "RMISS";
109   case MESA_SHADER_INTERSECTION: return "RINT";
110   case MESA_SHADER_CALLABLE:     return "RCALL";
111   }
112
113   unreachable("Unknown shader stage.");
114}
115
116const char *
117gl_vert_attrib_name(gl_vert_attrib attrib)
118{
119   static const char *names[] = {
120      ENUM(VERT_ATTRIB_POS),
121      ENUM(VERT_ATTRIB_NORMAL),
122      ENUM(VERT_ATTRIB_COLOR0),
123      ENUM(VERT_ATTRIB_COLOR1),
124      ENUM(VERT_ATTRIB_FOG),
125      ENUM(VERT_ATTRIB_COLOR_INDEX),
126      ENUM(VERT_ATTRIB_TEX0),
127      ENUM(VERT_ATTRIB_TEX1),
128      ENUM(VERT_ATTRIB_TEX2),
129      ENUM(VERT_ATTRIB_TEX3),
130      ENUM(VERT_ATTRIB_TEX4),
131      ENUM(VERT_ATTRIB_TEX5),
132      ENUM(VERT_ATTRIB_TEX6),
133      ENUM(VERT_ATTRIB_TEX7),
134      ENUM(VERT_ATTRIB_POINT_SIZE),
135      ENUM(VERT_ATTRIB_GENERIC0),
136      ENUM(VERT_ATTRIB_GENERIC1),
137      ENUM(VERT_ATTRIB_GENERIC2),
138      ENUM(VERT_ATTRIB_GENERIC3),
139      ENUM(VERT_ATTRIB_GENERIC4),
140      ENUM(VERT_ATTRIB_GENERIC5),
141      ENUM(VERT_ATTRIB_GENERIC6),
142      ENUM(VERT_ATTRIB_GENERIC7),
143      ENUM(VERT_ATTRIB_GENERIC8),
144      ENUM(VERT_ATTRIB_GENERIC9),
145      ENUM(VERT_ATTRIB_GENERIC10),
146      ENUM(VERT_ATTRIB_GENERIC11),
147      ENUM(VERT_ATTRIB_GENERIC12),
148      ENUM(VERT_ATTRIB_GENERIC13),
149      ENUM(VERT_ATTRIB_GENERIC14),
150      ENUM(VERT_ATTRIB_GENERIC15),
151      ENUM(VERT_ATTRIB_EDGEFLAG),
152   };
153   STATIC_ASSERT(ARRAY_SIZE(names) == VERT_ATTRIB_MAX);
154   return NAME(attrib);
155}
156
157const char *
158gl_varying_slot_name_for_stage(gl_varying_slot slot, gl_shader_stage stage)
159{
160   if (stage != MESA_SHADER_FRAGMENT && slot == VARYING_SLOT_PRIMITIVE_SHADING_RATE)
161      return "VARYING_SLOT_PRIMITIVE_SHADING_RATE";
162
163   switch (stage) {
164   case MESA_SHADER_MESH:
165      switch (slot) {
166      case VARYING_SLOT_PRIMITIVE_COUNT: return "VARYING_SLOT_PRIMITIVE_COUNT";
167      case VARYING_SLOT_PRIMITIVE_INDICES: return "VARYING_SLOT_PRIMITIVE_INDICES";
168      case VARYING_SLOT_CULL_PRIMITIVE: return "VARYING_SLOT_CULL_PRIMITIVE";
169      default:
170         /* Not an overlapping value. */
171         break;
172      }
173      break;
174
175   case MESA_SHADER_TASK:
176      switch (slot) {
177      case VARYING_SLOT_TASK_COUNT: return "VARYING_SLOT_TASK_COUNT";
178      default:
179         /* Not an overlapping value. */
180         break;
181      }
182      break;
183
184   default:
185      break;
186   }
187
188   static const char *names[] = {
189      ENUM(VARYING_SLOT_POS),
190      ENUM(VARYING_SLOT_COL0),
191      ENUM(VARYING_SLOT_COL1),
192      ENUM(VARYING_SLOT_FOGC),
193      ENUM(VARYING_SLOT_TEX0),
194      ENUM(VARYING_SLOT_TEX1),
195      ENUM(VARYING_SLOT_TEX2),
196      ENUM(VARYING_SLOT_TEX3),
197      ENUM(VARYING_SLOT_TEX4),
198      ENUM(VARYING_SLOT_TEX5),
199      ENUM(VARYING_SLOT_TEX6),
200      ENUM(VARYING_SLOT_TEX7),
201      ENUM(VARYING_SLOT_PSIZ),
202      ENUM(VARYING_SLOT_BFC0),
203      ENUM(VARYING_SLOT_BFC1),
204      ENUM(VARYING_SLOT_EDGE),
205      ENUM(VARYING_SLOT_CLIP_VERTEX),
206      ENUM(VARYING_SLOT_CLIP_DIST0),
207      ENUM(VARYING_SLOT_CLIP_DIST1),
208      ENUM(VARYING_SLOT_CULL_DIST0),
209      ENUM(VARYING_SLOT_CULL_DIST1),
210      ENUM(VARYING_SLOT_PRIMITIVE_ID),
211      ENUM(VARYING_SLOT_LAYER),
212      ENUM(VARYING_SLOT_VIEWPORT),
213      ENUM(VARYING_SLOT_FACE),
214      ENUM(VARYING_SLOT_PNTC),
215      ENUM(VARYING_SLOT_TESS_LEVEL_OUTER),
216      ENUM(VARYING_SLOT_TESS_LEVEL_INNER),
217      ENUM(VARYING_SLOT_BOUNDING_BOX0),
218      ENUM(VARYING_SLOT_BOUNDING_BOX1),
219      ENUM(VARYING_SLOT_VIEW_INDEX),
220      ENUM(VARYING_SLOT_VIEWPORT_MASK),
221      ENUM(VARYING_SLOT_VAR0),
222      ENUM(VARYING_SLOT_VAR1),
223      ENUM(VARYING_SLOT_VAR2),
224      ENUM(VARYING_SLOT_VAR3),
225      ENUM(VARYING_SLOT_VAR4),
226      ENUM(VARYING_SLOT_VAR5),
227      ENUM(VARYING_SLOT_VAR6),
228      ENUM(VARYING_SLOT_VAR7),
229      ENUM(VARYING_SLOT_VAR8),
230      ENUM(VARYING_SLOT_VAR9),
231      ENUM(VARYING_SLOT_VAR10),
232      ENUM(VARYING_SLOT_VAR11),
233      ENUM(VARYING_SLOT_VAR12),
234      ENUM(VARYING_SLOT_VAR13),
235      ENUM(VARYING_SLOT_VAR14),
236      ENUM(VARYING_SLOT_VAR15),
237      ENUM(VARYING_SLOT_VAR16),
238      ENUM(VARYING_SLOT_VAR17),
239      ENUM(VARYING_SLOT_VAR18),
240      ENUM(VARYING_SLOT_VAR19),
241      ENUM(VARYING_SLOT_VAR20),
242      ENUM(VARYING_SLOT_VAR21),
243      ENUM(VARYING_SLOT_VAR22),
244      ENUM(VARYING_SLOT_VAR23),
245      ENUM(VARYING_SLOT_VAR24),
246      ENUM(VARYING_SLOT_VAR25),
247      ENUM(VARYING_SLOT_VAR26),
248      ENUM(VARYING_SLOT_VAR27),
249      ENUM(VARYING_SLOT_VAR28),
250      ENUM(VARYING_SLOT_VAR29),
251      ENUM(VARYING_SLOT_VAR30),
252      ENUM(VARYING_SLOT_VAR31),
253   };
254   STATIC_ASSERT(ARRAY_SIZE(names) == VARYING_SLOT_MAX);
255   return NAME(slot);
256}
257
258const char *
259gl_system_value_name(gl_system_value sysval)
260{
261   static const char *names[] = {
262     ENUM(SYSTEM_VALUE_SUBGROUP_SIZE),
263     ENUM(SYSTEM_VALUE_SUBGROUP_INVOCATION),
264     ENUM(SYSTEM_VALUE_SUBGROUP_EQ_MASK),
265     ENUM(SYSTEM_VALUE_SUBGROUP_GE_MASK),
266     ENUM(SYSTEM_VALUE_SUBGROUP_GT_MASK),
267     ENUM(SYSTEM_VALUE_SUBGROUP_LE_MASK),
268     ENUM(SYSTEM_VALUE_SUBGROUP_LT_MASK),
269     ENUM(SYSTEM_VALUE_NUM_SUBGROUPS),
270     ENUM(SYSTEM_VALUE_SUBGROUP_ID),
271     ENUM(SYSTEM_VALUE_VERTEX_ID),
272     ENUM(SYSTEM_VALUE_INSTANCE_ID),
273     ENUM(SYSTEM_VALUE_INSTANCE_INDEX),
274     ENUM(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE),
275     ENUM(SYSTEM_VALUE_BASE_VERTEX),
276     ENUM(SYSTEM_VALUE_FIRST_VERTEX),
277     ENUM(SYSTEM_VALUE_IS_INDEXED_DRAW),
278     ENUM(SYSTEM_VALUE_BASE_INSTANCE),
279     ENUM(SYSTEM_VALUE_DRAW_ID),
280     ENUM(SYSTEM_VALUE_INVOCATION_ID),
281     ENUM(SYSTEM_VALUE_FRAG_COORD),
282     ENUM(SYSTEM_VALUE_POINT_COORD),
283     ENUM(SYSTEM_VALUE_LINE_COORD),
284     ENUM(SYSTEM_VALUE_FRONT_FACE),
285     ENUM(SYSTEM_VALUE_SAMPLE_ID),
286     ENUM(SYSTEM_VALUE_SAMPLE_POS),
287     ENUM(SYSTEM_VALUE_SAMPLE_MASK_IN),
288     ENUM(SYSTEM_VALUE_HELPER_INVOCATION),
289     ENUM(SYSTEM_VALUE_COLOR0),
290     ENUM(SYSTEM_VALUE_COLOR1),
291     ENUM(SYSTEM_VALUE_TESS_COORD),
292     ENUM(SYSTEM_VALUE_VERTICES_IN),
293     ENUM(SYSTEM_VALUE_PRIMITIVE_ID),
294     ENUM(SYSTEM_VALUE_TESS_LEVEL_OUTER),
295     ENUM(SYSTEM_VALUE_TESS_LEVEL_INNER),
296     ENUM(SYSTEM_VALUE_TESS_LEVEL_OUTER_DEFAULT),
297     ENUM(SYSTEM_VALUE_TESS_LEVEL_INNER_DEFAULT),
298     ENUM(SYSTEM_VALUE_LOCAL_INVOCATION_ID),
299     ENUM(SYSTEM_VALUE_LOCAL_INVOCATION_INDEX),
300     ENUM(SYSTEM_VALUE_GLOBAL_INVOCATION_ID),
301     ENUM(SYSTEM_VALUE_BASE_GLOBAL_INVOCATION_ID),
302     ENUM(SYSTEM_VALUE_GLOBAL_INVOCATION_INDEX),
303     ENUM(SYSTEM_VALUE_WORKGROUP_ID),
304     ENUM(SYSTEM_VALUE_NUM_WORKGROUPS),
305     ENUM(SYSTEM_VALUE_WORKGROUP_SIZE),
306     ENUM(SYSTEM_VALUE_GLOBAL_GROUP_SIZE),
307     ENUM(SYSTEM_VALUE_USER_DATA_AMD),
308     ENUM(SYSTEM_VALUE_WORK_DIM),
309     ENUM(SYSTEM_VALUE_DEVICE_INDEX),
310     ENUM(SYSTEM_VALUE_VIEW_INDEX),
311     ENUM(SYSTEM_VALUE_VERTEX_CNT),
312     ENUM(SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL),
313     ENUM(SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE),
314     ENUM(SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID),
315     ENUM(SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTER_RHW),
316     ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL),
317     ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID),
318     ENUM(SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE),
319     ENUM(SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL),
320     ENUM(SYSTEM_VALUE_RAY_LAUNCH_ID),
321     ENUM(SYSTEM_VALUE_RAY_LAUNCH_SIZE),
322     ENUM(SYSTEM_VALUE_RAY_LAUNCH_SIZE_ADDR_AMD),
323     ENUM(SYSTEM_VALUE_RAY_WORLD_ORIGIN),
324     ENUM(SYSTEM_VALUE_RAY_WORLD_DIRECTION),
325     ENUM(SYSTEM_VALUE_RAY_OBJECT_ORIGIN),
326     ENUM(SYSTEM_VALUE_RAY_OBJECT_DIRECTION),
327     ENUM(SYSTEM_VALUE_RAY_T_MIN),
328     ENUM(SYSTEM_VALUE_RAY_T_MAX),
329     ENUM(SYSTEM_VALUE_RAY_OBJECT_TO_WORLD),
330     ENUM(SYSTEM_VALUE_RAY_WORLD_TO_OBJECT),
331     ENUM(SYSTEM_VALUE_RAY_HIT_KIND),
332     ENUM(SYSTEM_VALUE_RAY_FLAGS),
333     ENUM(SYSTEM_VALUE_RAY_GEOMETRY_INDEX),
334     ENUM(SYSTEM_VALUE_CULL_MASK),
335     ENUM(SYSTEM_VALUE_MESH_VIEW_COUNT),
336     ENUM(SYSTEM_VALUE_MESH_VIEW_INDICES),
337     ENUM(SYSTEM_VALUE_GS_HEADER_IR3),
338     ENUM(SYSTEM_VALUE_TCS_HEADER_IR3),
339     ENUM(SYSTEM_VALUE_REL_PATCH_ID_IR3),
340     ENUM(SYSTEM_VALUE_FRAG_SHADING_RATE),
341   };
342   STATIC_ASSERT(ARRAY_SIZE(names) == SYSTEM_VALUE_MAX);
343   return NAME(sysval);
344}
345
346const char *
347glsl_interp_mode_name(enum glsl_interp_mode qual)
348{
349   static const char *names[] = {
350      ENUM(INTERP_MODE_NONE),
351      ENUM(INTERP_MODE_SMOOTH),
352      ENUM(INTERP_MODE_FLAT),
353      ENUM(INTERP_MODE_NOPERSPECTIVE),
354      ENUM(INTERP_MODE_EXPLICIT),
355      ENUM(INTERP_MODE_COLOR),
356   };
357   STATIC_ASSERT(ARRAY_SIZE(names) == INTERP_MODE_COUNT);
358   return NAME(qual);
359}
360
361const char *
362gl_frag_result_name(gl_frag_result result)
363{
364   static const char *names[] = {
365      ENUM(FRAG_RESULT_DEPTH),
366      ENUM(FRAG_RESULT_STENCIL),
367      ENUM(FRAG_RESULT_COLOR),
368      ENUM(FRAG_RESULT_SAMPLE_MASK),
369      ENUM(FRAG_RESULT_DATA0),
370      ENUM(FRAG_RESULT_DATA1),
371      ENUM(FRAG_RESULT_DATA2),
372      ENUM(FRAG_RESULT_DATA3),
373      ENUM(FRAG_RESULT_DATA4),
374      ENUM(FRAG_RESULT_DATA5),
375      ENUM(FRAG_RESULT_DATA6),
376      ENUM(FRAG_RESULT_DATA7),
377   };
378   STATIC_ASSERT(ARRAY_SIZE(names) == FRAG_RESULT_MAX);
379   return NAME(result);
380}
381
382unsigned
383num_mesh_vertices_per_primitive(unsigned prim)
384{
385   switch (prim) {
386      case SHADER_PRIM_POINTS:
387         return 1;
388      case SHADER_PRIM_LINES:
389         return 2;
390      case SHADER_PRIM_TRIANGLES:
391         return 3;
392      default:
393         unreachable("invalid mesh shader primitive type");
394   }
395}
396