Home | History | Annotate | Download | only in util
      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)
    526