util: Move os_misc to util
[mesa.git] / src / gallium / auxiliary / util / u_dump_defines.c
1 /**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28
29 #include "util/u_memory.h"
30 #include "util/u_debug.h"
31 #include "util/u_dump.h"
32 #include "util/u_math.h"
33
34
35 #if 0
36 static const char *
37 util_dump_strip_prefix(const char *name,
38 const char *prefix)
39 {
40 const char *stripped;
41 assert(name);
42 assert(prefix);
43 stripped = name;
44 while(*prefix) {
45 if(*stripped != *prefix)
46 return name;
47
48 ++stripped;
49 ++prefix;
50 }
51 return stripped;
52 }
53 #endif
54
55 static const char *
56 util_dump_enum_continuous(unsigned value,
57 unsigned num_names,
58 const char **names)
59 {
60 if (value >= num_names)
61 return UTIL_DUMP_INVALID_NAME;
62 return names[value];
63 }
64
65
66 #define DEFINE_UTIL_STR_CONTINUOUS(_name) \
67 const char * \
68 util_str_##_name(unsigned value, boolean shortened) \
69 { \
70 if(shortened) \
71 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_short_names), util_##_name##_short_names); \
72 else \
73 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_names), util_##_name##_names); \
74 }
75
76
77 /**
78 * Same as DEFINE_UTIL_STR_CONTINUOUS but with static assertions to detect
79 * failures to update lists.
80 */
81 #define DEFINE_UTIL_STR_CONTINUOUS_COUNT(_name, _count) \
82 const char * \
83 util_str_##_name(unsigned value, boolean shortened) \
84 { \
85 STATIC_ASSERT(ARRAY_SIZE(util_##_name##_names) == _count); \
86 STATIC_ASSERT(ARRAY_SIZE(util_##_name##_short_names) == _count); \
87 if(shortened) \
88 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_short_names), util_##_name##_short_names); \
89 else \
90 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_names), util_##_name##_names); \
91 }
92
93 static void
94 util_dump_flags_continuous(FILE *stream, unsigned value, unsigned num_names,
95 const char * const *names)
96 {
97 unsigned unknown = 0;
98 bool first = true;
99
100 while (value) {
101 int i = u_bit_scan(&value);
102 if (i >= (int)num_names || !names[i])
103 unknown |= 1u << i;
104 if (!first)
105 fputs("|", stream);
106 fputs(names[i], stream);
107 first = false;
108 }
109
110 if (unknown) {
111 if (!first)
112 fputs("|", stream);
113 fprintf(stream, "%x", unknown);
114 first = false;
115 }
116
117 if (first)
118 fputs("0", stream);
119 }
120
121 #define DEFINE_UTIL_DUMP_FLAGS_CONTINUOUS(_name) \
122 void \
123 util_dump_##_name(FILE *stream, unsigned value) \
124 { \
125 util_dump_flags_continuous(stream, value, ARRAY_SIZE(util_##_name##_names), \
126 util_##_name##_names); \
127 }
128
129 static const char *
130 util_blend_factor_names[] = {
131 UTIL_DUMP_INVALID_NAME, /* 0x0 */
132 "PIPE_BLENDFACTOR_ONE",
133 "PIPE_BLENDFACTOR_SRC_COLOR",
134 "PIPE_BLENDFACTOR_SRC_ALPHA",
135 "PIPE_BLENDFACTOR_DST_ALPHA",
136 "PIPE_BLENDFACTOR_DST_COLOR",
137 "PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE",
138 "PIPE_BLENDFACTOR_CONST_COLOR",
139 "PIPE_BLENDFACTOR_CONST_ALPHA",
140 "PIPE_BLENDFACTOR_SRC1_COLOR",
141 "PIPE_BLENDFACTOR_SRC1_ALPHA",
142 UTIL_DUMP_INVALID_NAME, /* 0x0b */
143 UTIL_DUMP_INVALID_NAME, /* 0x0c */
144 UTIL_DUMP_INVALID_NAME, /* 0x0d */
145 UTIL_DUMP_INVALID_NAME, /* 0x0e */
146 UTIL_DUMP_INVALID_NAME, /* 0x0f */
147 UTIL_DUMP_INVALID_NAME, /* 0x10 */
148 "PIPE_BLENDFACTOR_ZERO",
149 "PIPE_BLENDFACTOR_INV_SRC_COLOR",
150 "PIPE_BLENDFACTOR_INV_SRC_ALPHA",
151 "PIPE_BLENDFACTOR_INV_DST_ALPHA",
152 "PIPE_BLENDFACTOR_INV_DST_COLOR",
153 UTIL_DUMP_INVALID_NAME, /* 0x16 */
154 "PIPE_BLENDFACTOR_INV_CONST_COLOR",
155 "PIPE_BLENDFACTOR_INV_CONST_ALPHA",
156 "PIPE_BLENDFACTOR_INV_SRC1_COLOR",
157 "PIPE_BLENDFACTOR_INV_SRC1_ALPHA"
158 };
159
160 static const char *
161 util_blend_factor_short_names[] = {
162 UTIL_DUMP_INVALID_NAME, /* 0x0 */
163 "one",
164 "src_color",
165 "src_alpha",
166 "dst_alpha",
167 "dst_color",
168 "src_alpha_saturate",
169 "const_color",
170 "const_alpha",
171 "src1_color",
172 "src1_alpha",
173 UTIL_DUMP_INVALID_NAME, /* 0x0b */
174 UTIL_DUMP_INVALID_NAME, /* 0x0c */
175 UTIL_DUMP_INVALID_NAME, /* 0x0d */
176 UTIL_DUMP_INVALID_NAME, /* 0x0e */
177 UTIL_DUMP_INVALID_NAME, /* 0x0f */
178 UTIL_DUMP_INVALID_NAME, /* 0x10 */
179 "zero",
180 "inv_src_color",
181 "inv_src_alpha",
182 "inv_dst_alpha",
183 "inv_dst_color",
184 UTIL_DUMP_INVALID_NAME, /* 0x16 */
185 "inv_const_color",
186 "inv_const_alpha",
187 "inv_src1_color",
188 "inv_src1_alpha"
189 };
190
191 DEFINE_UTIL_STR_CONTINUOUS(blend_factor)
192
193
194 static const char *
195 util_blend_func_names[] = {
196 "PIPE_BLEND_ADD",
197 "PIPE_BLEND_SUBTRACT",
198 "PIPE_BLEND_REVERSE_SUBTRACT",
199 "PIPE_BLEND_MIN",
200 "PIPE_BLEND_MAX"
201 };
202
203 static const char *
204 util_blend_func_short_names[] = {
205 "add",
206 "sub",
207 "rev_sub",
208 "min",
209 "max"
210 };
211
212 DEFINE_UTIL_STR_CONTINUOUS(blend_func)
213
214
215 static const char *
216 util_logicop_names[] = {
217 "PIPE_LOGICOP_CLEAR",
218 "PIPE_LOGICOP_NOR",
219 "PIPE_LOGICOP_AND_INVERTED",
220 "PIPE_LOGICOP_COPY_INVERTED",
221 "PIPE_LOGICOP_AND_REVERSE",
222 "PIPE_LOGICOP_INVERT",
223 "PIPE_LOGICOP_XOR",
224 "PIPE_LOGICOP_NAND",
225 "PIPE_LOGICOP_AND",
226 "PIPE_LOGICOP_EQUIV",
227 "PIPE_LOGICOP_NOOP",
228 "PIPE_LOGICOP_OR_INVERTED",
229 "PIPE_LOGICOP_COPY",
230 "PIPE_LOGICOP_OR_REVERSE",
231 "PIPE_LOGICOP_OR",
232 "PIPE_LOGICOP_SET"
233 };
234
235 static const char *
236 util_logicop_short_names[] = {
237 "clear",
238 "nor",
239 "and_inverted",
240 "copy_inverted",
241 "and_reverse",
242 "invert",
243 "xor",
244 "nand",
245 "and",
246 "equiv",
247 "noop",
248 "or_inverted",
249 "copy",
250 "or_reverse",
251 "or",
252 "set"
253 };
254
255 DEFINE_UTIL_STR_CONTINUOUS(logicop)
256
257
258 static const char *
259 util_func_names[] = {
260 "PIPE_FUNC_NEVER",
261 "PIPE_FUNC_LESS",
262 "PIPE_FUNC_EQUAL",
263 "PIPE_FUNC_LEQUAL",
264 "PIPE_FUNC_GREATER",
265 "PIPE_FUNC_NOTEQUAL",
266 "PIPE_FUNC_GEQUAL",
267 "PIPE_FUNC_ALWAYS"
268 };
269
270 static const char *
271 util_func_short_names[] = {
272 "never",
273 "less",
274 "equal",
275 "less_equal",
276 "greater",
277 "not_equal",
278 "greater_equal",
279 "always"
280 };
281
282 DEFINE_UTIL_STR_CONTINUOUS(func)
283
284
285 static const char *
286 util_stencil_op_names[] = {
287 "PIPE_STENCIL_OP_KEEP",
288 "PIPE_STENCIL_OP_ZERO",
289 "PIPE_STENCIL_OP_REPLACE",
290 "PIPE_STENCIL_OP_INCR",
291 "PIPE_STENCIL_OP_DECR",
292 "PIPE_STENCIL_OP_INCR_WRAP",
293 "PIPE_STENCIL_OP_DECR_WRAP",
294 "PIPE_STENCIL_OP_INVERT"
295 };
296
297 static const char *
298 util_stencil_op_short_names[] = {
299 "keep",
300 "zero",
301 "replace",
302 "incr",
303 "decr",
304 "incr_wrap",
305 "decr_wrap",
306 "invert"
307 };
308
309 DEFINE_UTIL_STR_CONTINUOUS(stencil_op)
310
311
312 static const char *
313 util_tex_target_names[] = {
314 "PIPE_BUFFER",
315 "PIPE_TEXTURE_1D",
316 "PIPE_TEXTURE_2D",
317 "PIPE_TEXTURE_3D",
318 "PIPE_TEXTURE_CUBE",
319 "PIPE_TEXTURE_RECT",
320 "PIPE_TEXTURE_1D_ARRAY",
321 "PIPE_TEXTURE_2D_ARRAY",
322 "PIPE_TEXTURE_CUBE_ARRAY",
323 };
324
325 static const char *
326 util_tex_target_short_names[] = {
327 "buffer",
328 "1d",
329 "2d",
330 "3d",
331 "cube",
332 "rect",
333 "1d_array",
334 "2d_array",
335 "cube_array",
336 };
337
338 DEFINE_UTIL_STR_CONTINUOUS_COUNT(tex_target, PIPE_MAX_TEXTURE_TYPES)
339
340
341 static const char *
342 util_tex_wrap_names[] = {
343 "PIPE_TEX_WRAP_REPEAT",
344 "PIPE_TEX_WRAP_CLAMP",
345 "PIPE_TEX_WRAP_CLAMP_TO_EDGE",
346 "PIPE_TEX_WRAP_CLAMP_TO_BORDER",
347 "PIPE_TEX_WRAP_MIRROR_REPEAT",
348 "PIPE_TEX_WRAP_MIRROR_CLAMP",
349 "PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE",
350 "PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER"
351 };
352
353 static const char *
354 util_tex_wrap_short_names[] = {
355 "repeat",
356 "clamp",
357 "clamp_to_edge",
358 "clamp_to_border",
359 "mirror_repeat",
360 "mirror_clamp",
361 "mirror_clamp_to_edge",
362 "mirror_clamp_to_border"
363 };
364
365 DEFINE_UTIL_STR_CONTINUOUS(tex_wrap)
366
367
368 static const char *
369 util_tex_mipfilter_names[] = {
370 "PIPE_TEX_MIPFILTER_NEAREST",
371 "PIPE_TEX_MIPFILTER_LINEAR",
372 "PIPE_TEX_MIPFILTER_NONE"
373 };
374
375 static const char *
376 util_tex_mipfilter_short_names[] = {
377 "nearest",
378 "linear",
379 "none"
380 };
381
382 DEFINE_UTIL_STR_CONTINUOUS(tex_mipfilter)
383
384
385 static const char *
386 util_tex_filter_names[] = {
387 "PIPE_TEX_FILTER_NEAREST",
388 "PIPE_TEX_FILTER_LINEAR"
389 };
390
391 static const char *
392 util_tex_filter_short_names[] = {
393 "nearest",
394 "linear"
395 };
396
397 DEFINE_UTIL_STR_CONTINUOUS(tex_filter)
398
399
400 static const char *
401 util_query_type_names[] = {
402 "PIPE_QUERY_OCCLUSION_COUNTER",
403 "PIPE_QUERY_OCCLUSION_PREDICATE",
404 "PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE",
405 "PIPE_QUERY_TIMESTAMP",
406 "PIPE_QUERY_TIMESTAMP_DISJOINT",
407 "PIPE_QUERY_TIME_ELAPSED",
408 "PIPE_QUERY_PRIMITIVES_GENERATED",
409 "PIPE_QUERY_PRIMITIVES_EMITTED",
410 "PIPE_QUERY_SO_STATISTICS",
411 "PIPE_QUERY_SO_OVERFLOW_PREDICATE",
412 "PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE",
413 "PIPE_QUERY_GPU_FINISHED",
414 "PIPE_QUERY_PIPELINE_STATISTICS",
415 };
416
417 static const char *
418 util_query_type_short_names[] = {
419 "occlusion_counter",
420 "occlusion_predicate",
421 "timestamp",
422 "timestamp_disjoint",
423 "time_elapsed",
424 "primitives_generated",
425 "primitives_emitted",
426 "so_statistics",
427 "so_overflow_predicate",
428 "gpu_finished",
429 "pipeline_statistics",
430 };
431
432 DEFINE_UTIL_STR_CONTINUOUS(query_type)
433
434
435 static const char *
436 util_query_value_type_names[] = {
437 "PIPE_QUERY_TYPE_I32",
438 "PIPE_QUERY_TYPE_U32",
439 "PIPE_QUERY_TYPE_I64",
440 "PIPE_QUERY_TYPE_U64",
441 };
442
443 static const char *
444 util_query_value_type_short_names[] = {
445 "i32",
446 "u32",
447 "i64",
448 "u64",
449 };
450
451 DEFINE_UTIL_STR_CONTINUOUS(query_value_type)
452
453
454 static const char *
455 util_prim_mode_names[] = {
456 "PIPE_PRIM_POINTS",
457 "PIPE_PRIM_LINES",
458 "PIPE_PRIM_LINE_LOOP",
459 "PIPE_PRIM_LINE_STRIP",
460 "PIPE_PRIM_TRIANGLES",
461 "PIPE_PRIM_TRIANGLE_STRIP",
462 "PIPE_PRIM_TRIANGLE_FAN",
463 "PIPE_PRIM_QUADS",
464 "PIPE_PRIM_QUAD_STRIP",
465 "PIPE_PRIM_POLYGON",
466 "PIPE_PRIM_LINES_ADJACENCY",
467 "PIPE_PRIM_LINE_STRIP_ADJACENCY",
468 "PIPE_PRIM_TRIANGLES_ADJACENCY",
469 "PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY",
470 "PIPE_PRIM_PATCHES",
471 };
472
473 static const char *
474 util_prim_mode_short_names[] = {
475 "points",
476 "lines",
477 "line_loop",
478 "line_strip",
479 "triangles",
480 "triangle_strip",
481 "triangle_fan",
482 "quads",
483 "quad_strip",
484 "polygon",
485 "lines_adjacency",
486 "line_strip_adjacency",
487 "triangles_adjacency",
488 "triangle_strip_adjacency",
489 "patches",
490 };
491
492 DEFINE_UTIL_STR_CONTINUOUS(prim_mode)
493
494 void
495 util_dump_query_type(FILE *stream, unsigned value)
496 {
497 if (value >= PIPE_QUERY_DRIVER_SPECIFIC)
498 fprintf(stream, "PIPE_QUERY_DRIVER_SPECIFIC + %i",
499 value - PIPE_QUERY_DRIVER_SPECIFIC);
500 else
501 fprintf(stream, "%s", util_str_query_type(value, false));
502 }
503
504 void
505 util_dump_query_value_type(FILE *stream, unsigned value)
506 {
507 fprintf(stream, "%s", util_str_query_value_type(value, false));
508 }
509
510
511 static const char * const
512 util_transfer_usage_names[] = {
513 "PIPE_TRANSFER_READ",
514 "PIPE_TRANSFER_WRITE",
515 "PIPE_TRANSFER_MAP_DIRECTLY",
516 "PIPE_TRANSFER_DISCARD_RANGE",
517 "PIPE_TRANSFER_DONTBLOCK",
518 "PIPE_TRANSFER_UNSYNCHRONIZED",
519 "PIPE_TRANSFER_FLUSH_EXPLICIT",
520 "PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE",
521 "PIPE_TRANSFER_PERSISTENT",
522 "PIPE_TRANSFER_COHERENT",
523 };
524
525 DEFINE_UTIL_DUMP_FLAGS_CONTINUOUS(transfer_usage)