1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
29 #include "util/u_memory.h"
30 #include "util/u_debug.h"
31 #include "util/u_dump.h"
32 #include "util/u_math.h"
37 util_dump_strip_prefix(const char *name
,
45 if(*stripped
!= *prefix
)
56 util_dump_enum_continuous(unsigned value
,
60 if (value
>= num_names
)
61 return UTIL_DUMP_INVALID_NAME
;
66 #define DEFINE_UTIL_STR_CONTINUOUS(_name) \
68 util_str_##_name(unsigned value, boolean shortened) \
71 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_short_names), util_##_name##_short_names); \
73 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_names), util_##_name##_names); \
78 * Same as DEFINE_UTIL_STR_CONTINUOUS but with static assertions to detect
79 * failures to update lists.
81 #define DEFINE_UTIL_STR_CONTINUOUS_COUNT(_name, _count) \
83 util_str_##_name(unsigned value, boolean shortened) \
85 STATIC_ASSERT(ARRAY_SIZE(util_##_name##_names) == _count); \
86 STATIC_ASSERT(ARRAY_SIZE(util_##_name##_short_names) == _count); \
88 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_short_names), util_##_name##_short_names); \
90 return util_dump_enum_continuous(value, ARRAY_SIZE(util_##_name##_names), util_##_name##_names); \
94 util_dump_flags_continuous(FILE *stream
, unsigned value
, unsigned num_names
,
95 const char * const *names
)
101 int i
= u_bit_scan(&value
);
102 if (i
>= (int)num_names
|| !names
[i
])
106 fputs(names
[i
], stream
);
113 fprintf(stream
, "%x", unknown
);
121 #define DEFINE_UTIL_DUMP_FLAGS_CONTINUOUS(_name) \
123 util_dump_##_name(FILE *stream, unsigned value) \
125 util_dump_flags_continuous(stream, value, ARRAY_SIZE(util_##_name##_names), \
126 util_##_name##_names); \
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"
161 util_blend_factor_short_names
[] = {
162 UTIL_DUMP_INVALID_NAME
, /* 0x0 */
168 "src_alpha_saturate",
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 */
184 UTIL_DUMP_INVALID_NAME
, /* 0x16 */
191 DEFINE_UTIL_STR_CONTINUOUS(blend_factor
)
195 util_blend_func_names
[] = {
197 "PIPE_BLEND_SUBTRACT",
198 "PIPE_BLEND_REVERSE_SUBTRACT",
204 util_blend_func_short_names
[] = {
212 DEFINE_UTIL_STR_CONTINUOUS(blend_func
)
216 util_logicop_names
[] = {
217 "PIPE_LOGICOP_CLEAR",
219 "PIPE_LOGICOP_AND_INVERTED",
220 "PIPE_LOGICOP_COPY_INVERTED",
221 "PIPE_LOGICOP_AND_REVERSE",
222 "PIPE_LOGICOP_INVERT",
226 "PIPE_LOGICOP_EQUIV",
228 "PIPE_LOGICOP_OR_INVERTED",
230 "PIPE_LOGICOP_OR_REVERSE",
236 util_logicop_short_names
[] = {
255 DEFINE_UTIL_STR_CONTINUOUS(logicop
)
259 util_func_names
[] = {
265 "PIPE_FUNC_NOTEQUAL",
271 util_func_short_names
[] = {
282 DEFINE_UTIL_STR_CONTINUOUS(func
)
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"
298 util_stencil_op_short_names
[] = {
309 DEFINE_UTIL_STR_CONTINUOUS(stencil_op
)
313 util_tex_target_names
[] = {
320 "PIPE_TEXTURE_1D_ARRAY",
321 "PIPE_TEXTURE_2D_ARRAY",
322 "PIPE_TEXTURE_CUBE_ARRAY",
326 util_tex_target_short_names
[] = {
338 DEFINE_UTIL_STR_CONTINUOUS_COUNT(tex_target
, PIPE_MAX_TEXTURE_TYPES
)
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"
354 util_tex_wrap_short_names
[] = {
361 "mirror_clamp_to_edge",
362 "mirror_clamp_to_border"
365 DEFINE_UTIL_STR_CONTINUOUS(tex_wrap
)
369 util_tex_mipfilter_names
[] = {
370 "PIPE_TEX_MIPFILTER_NEAREST",
371 "PIPE_TEX_MIPFILTER_LINEAR",
372 "PIPE_TEX_MIPFILTER_NONE"
376 util_tex_mipfilter_short_names
[] = {
382 DEFINE_UTIL_STR_CONTINUOUS(tex_mipfilter
)
386 util_tex_filter_names
[] = {
387 "PIPE_TEX_FILTER_NEAREST",
388 "PIPE_TEX_FILTER_LINEAR"
392 util_tex_filter_short_names
[] = {
397 DEFINE_UTIL_STR_CONTINUOUS(tex_filter
)
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",
418 util_query_type_short_names
[] = {
420 "occlusion_predicate",
421 "occlusion_predicate_conservative",
423 "timestamp_disjoint",
425 "primitives_generated",
426 "primitives_emitted",
428 "so_overflow_predicate",
429 "so_overflow_any_predicate",
431 "pipeline_statistics",
434 DEFINE_UTIL_STR_CONTINUOUS(query_type
)
438 util_query_value_type_names
[] = {
439 "PIPE_QUERY_TYPE_I32",
440 "PIPE_QUERY_TYPE_U32",
441 "PIPE_QUERY_TYPE_I64",
442 "PIPE_QUERY_TYPE_U64",
446 util_query_value_type_short_names
[] = {
453 DEFINE_UTIL_STR_CONTINUOUS(query_value_type
)
457 util_prim_mode_names
[] = {
460 "PIPE_PRIM_LINE_LOOP",
461 "PIPE_PRIM_LINE_STRIP",
462 "PIPE_PRIM_TRIANGLES",
463 "PIPE_PRIM_TRIANGLE_STRIP",
464 "PIPE_PRIM_TRIANGLE_FAN",
466 "PIPE_PRIM_QUAD_STRIP",
468 "PIPE_PRIM_LINES_ADJACENCY",
469 "PIPE_PRIM_LINE_STRIP_ADJACENCY",
470 "PIPE_PRIM_TRIANGLES_ADJACENCY",
471 "PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY",
476 util_prim_mode_short_names
[] = {
488 "line_strip_adjacency",
489 "triangles_adjacency",
490 "triangle_strip_adjacency",
494 DEFINE_UTIL_STR_CONTINUOUS(prim_mode
)
497 util_dump_query_type(FILE *stream
, unsigned value
)
499 if (value
>= PIPE_QUERY_DRIVER_SPECIFIC
)
500 fprintf(stream
, "PIPE_QUERY_DRIVER_SPECIFIC + %i",
501 value
- PIPE_QUERY_DRIVER_SPECIFIC
);
503 fprintf(stream
, "%s", util_str_query_type(value
, false));
507 util_dump_query_value_type(FILE *stream
, unsigned value
)
509 fprintf(stream
, "%s", util_str_query_value_type(value
, false));
513 static const char * const
514 util_transfer_usage_names
[] = {
515 "PIPE_TRANSFER_READ",
516 "PIPE_TRANSFER_WRITE",
517 "PIPE_TRANSFER_MAP_DIRECTLY",
518 "PIPE_TRANSFER_DISCARD_RANGE",
519 "PIPE_TRANSFER_DONTBLOCK",
520 "PIPE_TRANSFER_UNSYNCHRONIZED",
521 "PIPE_TRANSFER_FLUSH_EXPLICIT",
522 "PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE",
523 "PIPE_TRANSFER_PERSISTENT",
524 "PIPE_TRANSFER_COHERENT",
527 DEFINE_UTIL_DUMP_FLAGS_CONTINUOUS(transfer_usage
)