1/************************************************************************** 2 * 3 * Copyright 2008-2010 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 "pipe/p_compiler.h" 30#include "util/u_memory.h" 31#include "util/u_string.h" 32#include "util/format/u_format.h" 33#include "tgsi/tgsi_dump.h" 34 35#include <inttypes.h> 36 37#include "u_dump.h" 38 39 40/* 41 * Dump primitives 42 */ 43 44static inline void 45util_stream_writef(FILE *stream, const char *format, ...) 46{ 47 static char buf[1024]; 48 unsigned len; 49 va_list ap; 50 va_start(ap, format); 51 len = vsnprintf(buf, sizeof(buf), format, ap); 52 va_end(ap); 53 fwrite(buf, len, 1, stream); 54} 55 56static void 57util_dump_bool(FILE *stream, int value) 58{ 59 util_stream_writef(stream, "%c", value ? '1' : '0'); 60} 61 62static void 63util_dump_int(FILE *stream, long long int value) 64{ 65 util_stream_writef(stream, "%lli", value); 66} 67 68static void 69util_dump_uint(FILE *stream, long long unsigned value) 70{ 71 util_stream_writef(stream, "%llu", value); 72} 73 74static void 75util_dump_float(FILE *stream, double value) 76{ 77 util_stream_writef(stream, "%g", value); 78} 79 80void 81util_dump_ns(FILE *f, uint64_t time) 82{ 83 uint64_t secs = time / (1000*1000*1000); 84 unsigned usecs = (time % (1000*1000*1000)) / 1000; 85 fprintf(f, "%"PRIu64".%06us", secs, usecs); 86} 87 88static void 89util_dump_string(FILE *stream, const char *str) 90{ 91 fputs("\"", stream); 92 fputs(str, stream); 93 fputs("\"", stream); 94} 95 96static void 97util_dump_enum(FILE *stream, const char *value) 98{ 99 fputs(value, stream); 100} 101 102static void 103util_dump_array_begin(FILE *stream) 104{ 105 fputs("{", stream); 106} 107 108static void 109util_dump_array_end(FILE *stream) 110{ 111 fputs("}", stream); 112} 113 114static void 115util_dump_elem_begin(UNUSED FILE *stream) 116{ 117} 118 119static void 120util_dump_elem_end(FILE *stream) 121{ 122 fputs(", ", stream); 123} 124 125static void 126util_dump_struct_begin(FILE *stream, UNUSED const char *name) 127{ 128 fputs("{", stream); 129} 130 131static void 132util_dump_struct_end(FILE *stream) 133{ 134 fputs("}", stream); 135} 136 137static void 138util_dump_member_begin(FILE *stream, const char *name) 139{ 140 util_stream_writef(stream, "%s = ", name); 141} 142 143static void 144util_dump_member_end(FILE *stream) 145{ 146 fputs(", ", stream); 147} 148 149static void 150util_dump_null(FILE *stream) 151{ 152 fputs("NULL", stream); 153} 154 155void 156util_dump_ptr(FILE *stream, const void *value) 157{ 158 if(value) 159 util_stream_writef(stream, "%p", value); 160 else 161 util_dump_null(stream); 162} 163 164 165/* 166 * Code saving macros. 167 */ 168 169#define util_dump_arg(_stream, _type, _arg) \ 170 do { \ 171 util_dump_arg_begin(_stream, #_arg); \ 172 util_dump_##_type(_stream, _arg); \ 173 util_dump_arg_end(_stream); \ 174 } while(0) 175 176#define util_dump_ret(_stream, _type, _arg) \ 177 do { \ 178 util_dump_ret_begin(_stream); \ 179 util_dump_##_type(_stream, _arg); \ 180 util_dump_ret_end(_stream); \ 181 } while(0) 182 183#define util_dump_array(_stream, _type, _obj, _size) \ 184 do { \ 185 size_t idx; \ 186 util_dump_array_begin(_stream); \ 187 for(idx = 0; idx < (_size); ++idx) { \ 188 util_dump_elem_begin(_stream); \ 189 util_dump_##_type(_stream, (_obj)[idx]); \ 190 util_dump_elem_end(_stream); \ 191 } \ 192 util_dump_array_end(_stream); \ 193 } while(0) 194 195#define util_dump_struct_array(_stream, _type, _obj, _size) \ 196 do { \ 197 size_t idx; \ 198 util_dump_array_begin(_stream); \ 199 for(idx = 0; idx < (_size); ++idx) { \ 200 util_dump_elem_begin(_stream); \ 201 util_dump_##_type(_stream, &(_obj)[idx]); \ 202 util_dump_elem_end(_stream); \ 203 } \ 204 util_dump_array_end(_stream); \ 205 } while(0) 206 207#define util_dump_member(_stream, _type, _obj, _member) \ 208 do { \ 209 util_dump_member_begin(_stream, #_member); \ 210 util_dump_##_type(_stream, (_obj)->_member); \ 211 util_dump_member_end(_stream); \ 212 } while(0) 213 214#define util_dump_arg_array(_stream, _type, _arg, _size) \ 215 do { \ 216 util_dump_arg_begin(_stream, #_arg); \ 217 util_dump_array(_stream, _type, _arg, _size); \ 218 util_dump_arg_end(_stream); \ 219 } while(0) 220 221#define util_dump_member_array(_stream, _type, _obj, _member) \ 222 do { \ 223 util_dump_member_begin(_stream, #_member); \ 224 util_dump_array(_stream, _type, (_obj)->_member, sizeof((_obj)->_member)/sizeof((_obj)->_member[0])); \ 225 util_dump_member_end(_stream); \ 226 } while(0) 227 228 229 230/* 231 * Wrappers for enum -> string dumpers. 232 */ 233 234 235static void 236util_dump_format(FILE *stream, enum pipe_format format) 237{ 238 util_dump_enum(stream, util_format_name(format)); 239} 240 241 242static void 243util_dump_enum_blend_factor(FILE *stream, unsigned value) 244{ 245 util_dump_enum(stream, util_str_blend_factor(value, TRUE)); 246} 247 248static void 249util_dump_enum_blend_func(FILE *stream, unsigned value) 250{ 251 util_dump_enum(stream, util_str_blend_func(value, TRUE)); 252} 253 254static void 255util_dump_enum_func(FILE *stream, unsigned value) 256{ 257 util_dump_enum(stream, util_str_func(value, TRUE)); 258} 259 260static void 261util_dump_enum_prim_mode(FILE *stream, unsigned value) 262{ 263 util_dump_enum(stream, util_str_prim_mode(value, TRUE)); 264} 265 266static void 267util_dump_enum_tex_target(FILE *stream, unsigned value) 268{ 269 util_dump_enum(stream, util_str_tex_target(value, TRUE)); 270} 271 272static void 273util_dump_enum_tex_filter(FILE *stream, unsigned value) 274{ 275 util_dump_enum(stream, util_str_tex_filter(value, TRUE)); 276} 277 278static void 279util_dump_enum_tex_mipfilter(FILE *stream, unsigned value) 280{ 281 util_dump_enum(stream, util_str_tex_mipfilter(value, TRUE)); 282} 283 284static void 285util_dump_enum_tex_wrap(FILE *stream, unsigned value) 286{ 287 util_dump_enum(stream, util_str_tex_wrap(value, TRUE)); 288} 289 290static void 291util_dump_enum_stencil_op(FILE *stream, unsigned value) 292{ 293 util_dump_enum(stream, util_str_stencil_op(value, TRUE)); 294} 295 296 297/* 298 * Public functions 299 */ 300 301 302void 303util_dump_resource(FILE *stream, const struct pipe_resource *state) 304{ 305 if (!state) { 306 util_dump_null(stream); 307 return; 308 } 309 310 util_dump_struct_begin(stream, "pipe_resource"); 311 312 util_dump_member(stream, enum_tex_target, state, target); 313 util_dump_member(stream, format, state, format); 314 315 util_dump_member(stream, uint, state, width0); 316 util_dump_member(stream, uint, state, height0); 317 util_dump_member(stream, uint, state, depth0); 318 util_dump_member(stream, uint, state, array_size); 319 320 util_dump_member(stream, uint, state, last_level); 321 util_dump_member(stream, uint, state, nr_samples); 322 util_dump_member(stream, uint, state, nr_storage_samples); 323 util_dump_member(stream, uint, state, usage); 324 util_dump_member(stream, uint, state, bind); 325 util_dump_member(stream, uint, state, flags); 326 327 util_dump_struct_end(stream); 328} 329 330 331void 332util_dump_rasterizer_state(FILE *stream, const struct pipe_rasterizer_state *state) 333{ 334 if (!state) { 335 util_dump_null(stream); 336 return; 337 } 338 339 util_dump_struct_begin(stream, "pipe_rasterizer_state"); 340 341 util_dump_member(stream, bool, state, flatshade); 342 util_dump_member(stream, bool, state, light_twoside); 343 util_dump_member(stream, bool, state, clamp_vertex_color); 344 util_dump_member(stream, bool, state, clamp_fragment_color); 345 util_dump_member(stream, uint, state, front_ccw); 346 util_dump_member(stream, uint, state, cull_face); 347 util_dump_member(stream, uint, state, fill_front); 348 util_dump_member(stream, uint, state, fill_back); 349 util_dump_member(stream, bool, state, offset_point); 350 util_dump_member(stream, bool, state, offset_line); 351 util_dump_member(stream, bool, state, offset_tri); 352 util_dump_member(stream, bool, state, scissor); 353 util_dump_member(stream, bool, state, poly_smooth); 354 util_dump_member(stream, bool, state, poly_stipple_enable); 355 util_dump_member(stream, bool, state, point_smooth); 356 util_dump_member(stream, uint, state, sprite_coord_enable); 357 util_dump_member(stream, bool, state, sprite_coord_mode); 358 util_dump_member(stream, bool, state, point_quad_rasterization); 359 util_dump_member(stream, bool, state, point_tri_clip); 360 util_dump_member(stream, bool, state, point_size_per_vertex); 361 util_dump_member(stream, bool, state, multisample); 362 util_dump_member(stream, bool, state, line_smooth); 363 util_dump_member(stream, bool, state, line_stipple_enable); 364 util_dump_member(stream, uint, state, line_stipple_factor); 365 util_dump_member(stream, uint, state, line_stipple_pattern); 366 util_dump_member(stream, bool, state, line_last_pixel); 367 util_dump_member(stream, bool, state, flatshade_first); 368 util_dump_member(stream, bool, state, half_pixel_center); 369 util_dump_member(stream, bool, state, bottom_edge_rule); 370 util_dump_member(stream, bool, state, rasterizer_discard); 371 util_dump_member(stream, bool, state, depth_clip_near); 372 util_dump_member(stream, bool, state, depth_clip_far); 373 util_dump_member(stream, bool, state, clip_halfz); 374 util_dump_member(stream, uint, state, clip_plane_enable); 375 376 util_dump_member(stream, float, state, line_width); 377 util_dump_member(stream, float, state, point_size); 378 util_dump_member(stream, float, state, offset_units); 379 util_dump_member(stream, float, state, offset_scale); 380 util_dump_member(stream, float, state, offset_clamp); 381 382 util_dump_struct_end(stream); 383} 384 385 386void 387util_dump_poly_stipple(FILE *stream, const struct pipe_poly_stipple *state) 388{ 389 if (!state) { 390 util_dump_null(stream); 391 return; 392 } 393 394 util_dump_struct_begin(stream, "pipe_poly_stipple"); 395 396 util_dump_member_begin(stream, "stipple"); 397 util_dump_member_array(stream, uint, state, stipple); 398 util_dump_member_end(stream); 399 400 util_dump_struct_end(stream); 401} 402 403 404void 405util_dump_viewport_state(FILE *stream, const struct pipe_viewport_state *state) 406{ 407 if (!state) { 408 util_dump_null(stream); 409 return; 410 } 411 412 util_dump_struct_begin(stream, "pipe_viewport_state"); 413 414 util_dump_member_array(stream, float, state, scale); 415 util_dump_member_array(stream, float, state, translate); 416 417 util_dump_struct_end(stream); 418} 419 420 421void 422util_dump_scissor_state(FILE *stream, const struct pipe_scissor_state *state) 423{ 424 if (!state) { 425 util_dump_null(stream); 426 return; 427 } 428 429 util_dump_struct_begin(stream, "pipe_scissor_state"); 430 431 util_dump_member(stream, uint, state, minx); 432 util_dump_member(stream, uint, state, miny); 433 util_dump_member(stream, uint, state, maxx); 434 util_dump_member(stream, uint, state, maxy); 435 436 util_dump_struct_end(stream); 437} 438 439 440void 441util_dump_clip_state(FILE *stream, const struct pipe_clip_state *state) 442{ 443 unsigned i; 444 445 if (!state) { 446 util_dump_null(stream); 447 return; 448 } 449 450 util_dump_struct_begin(stream, "pipe_clip_state"); 451 452 util_dump_member_begin(stream, "ucp"); 453 util_dump_array_begin(stream); 454 for(i = 0; i < PIPE_MAX_CLIP_PLANES; ++i) { 455 util_dump_elem_begin(stream); 456 util_dump_array(stream, float, state->ucp[i], 4); 457 util_dump_elem_end(stream); 458 } 459 util_dump_array_end(stream); 460 util_dump_member_end(stream); 461 462 util_dump_struct_end(stream); 463} 464 465 466void 467util_dump_shader_state(FILE *stream, const struct pipe_shader_state *state) 468{ 469 unsigned i; 470 471 if (!state) { 472 util_dump_null(stream); 473 return; 474 } 475 476 util_dump_struct_begin(stream, "pipe_shader_state"); 477 478 if (state->type == PIPE_SHADER_IR_TGSI) { 479 util_dump_member_begin(stream, "tokens"); 480 fprintf(stream, "\"\n"); 481 tgsi_dump_to_file(state->tokens, 0, stream); 482 fprintf(stream, "\""); 483 util_dump_member_end(stream); 484 } 485 486 if (state->stream_output.num_outputs) { 487 util_dump_member_begin(stream, "stream_output"); 488 util_dump_struct_begin(stream, "pipe_stream_output_info"); 489 util_dump_member(stream, uint, &state->stream_output, num_outputs); 490 util_dump_array(stream, uint, state->stream_output.stride, 491 ARRAY_SIZE(state->stream_output.stride)); 492 util_dump_array_begin(stream); 493 for(i = 0; i < state->stream_output.num_outputs; ++i) { 494 util_dump_elem_begin(stream); 495 util_dump_struct_begin(stream, ""); /* anonymous */ 496 util_dump_member(stream, uint, &state->stream_output.output[i], register_index); 497 util_dump_member(stream, uint, &state->stream_output.output[i], start_component); 498 util_dump_member(stream, uint, &state->stream_output.output[i], num_components); 499 util_dump_member(stream, uint, &state->stream_output.output[i], output_buffer); 500 util_dump_struct_end(stream); 501 util_dump_elem_end(stream); 502 } 503 util_dump_array_end(stream); 504 util_dump_struct_end(stream); 505 util_dump_member_end(stream); 506 } 507 508 util_dump_struct_end(stream); 509} 510 511 512void 513util_dump_depth_stencil_alpha_state(FILE *stream, const struct pipe_depth_stencil_alpha_state *state) 514{ 515 unsigned i; 516 517 if (!state) { 518 util_dump_null(stream); 519 return; 520 } 521 522 util_dump_struct_begin(stream, "pipe_depth_stencil_alpha_state"); 523 524 util_dump_member(stream, bool, state, depth_enabled); 525 if (state->depth_enabled) { 526 util_dump_member(stream, bool, state, depth_writemask); 527 util_dump_member(stream, enum_func, state, depth_func); 528 } 529 530 util_dump_member_begin(stream, "stencil"); 531 util_dump_array_begin(stream); 532 for(i = 0; i < ARRAY_SIZE(state->stencil); ++i) { 533 util_dump_elem_begin(stream); 534 util_dump_struct_begin(stream, "pipe_stencil_state"); 535 util_dump_member(stream, bool, &state->stencil[i], enabled); 536 if (state->stencil[i].enabled) { 537 util_dump_member(stream, enum_func, &state->stencil[i], func); 538 util_dump_member(stream, enum_stencil_op, 539 &state->stencil[i], fail_op); 540 util_dump_member(stream, enum_stencil_op, 541 &state->stencil[i], zpass_op); 542 util_dump_member(stream, enum_stencil_op, 543 &state->stencil[i], zfail_op); 544 util_dump_member(stream, uint, &state->stencil[i], valuemask); 545 util_dump_member(stream, uint, &state->stencil[i], writemask); 546 } 547 util_dump_struct_end(stream); 548 util_dump_elem_end(stream); 549 } 550 util_dump_array_end(stream); 551 util_dump_member_end(stream); 552 553 util_dump_member(stream, bool, state, alpha_enabled); 554 if (state->alpha_enabled) { 555 util_dump_member(stream, enum_func, state, alpha_func); 556 util_dump_member(stream, float, state, alpha_ref_value); 557 } 558 559 util_dump_struct_end(stream); 560} 561 562void 563util_dump_rt_blend_state(FILE *stream, const struct pipe_rt_blend_state *state) 564{ 565 util_dump_struct_begin(stream, "pipe_rt_blend_state"); 566 567 util_dump_member(stream, uint, state, blend_enable); 568 if (state->blend_enable) { 569 util_dump_member(stream, enum_blend_func, state, rgb_func); 570 util_dump_member(stream, enum_blend_factor, state, rgb_src_factor); 571 util_dump_member(stream, enum_blend_factor, state, rgb_dst_factor); 572 573 util_dump_member(stream, enum_blend_func, state, alpha_func); 574 util_dump_member(stream, enum_blend_factor, state, alpha_src_factor); 575 util_dump_member(stream, enum_blend_factor, state, alpha_dst_factor); 576 } 577 578 util_dump_member(stream, uint, state, colormask); 579 580 util_dump_struct_end(stream); 581} 582 583void 584util_dump_blend_state(FILE *stream, const struct pipe_blend_state *state) 585{ 586 unsigned valid_entries = 1; 587 588 if (!state) { 589 util_dump_null(stream); 590 return; 591 } 592 593 util_dump_struct_begin(stream, "pipe_blend_state"); 594 595 util_dump_member(stream, bool, state, dither); 596 util_dump_member(stream, bool, state, alpha_to_coverage); 597 util_dump_member(stream, bool, state, alpha_to_one); 598 util_dump_member(stream, uint, state, max_rt); 599 600 util_dump_member(stream, bool, state, logicop_enable); 601 if (state->logicop_enable) { 602 util_dump_member(stream, enum_func, state, logicop_func); 603 } 604 else { 605 util_dump_member(stream, bool, state, independent_blend_enable); 606 607 util_dump_member_begin(stream, "rt"); 608 if (state->independent_blend_enable) 609 valid_entries = state->max_rt + 1; 610 util_dump_struct_array(stream, rt_blend_state, state->rt, valid_entries); 611 util_dump_member_end(stream); 612 } 613 614 util_dump_struct_end(stream); 615} 616 617 618void 619util_dump_blend_color(FILE *stream, const struct pipe_blend_color *state) 620{ 621 if (!state) { 622 util_dump_null(stream); 623 return; 624 } 625 626 util_dump_struct_begin(stream, "pipe_blend_color"); 627 628 util_dump_member_array(stream, float, state, color); 629 630 util_dump_struct_end(stream); 631} 632 633void 634util_dump_stencil_ref(FILE *stream, const struct pipe_stencil_ref *state) 635{ 636 if (!state) { 637 util_dump_null(stream); 638 return; 639 } 640 641 util_dump_struct_begin(stream, "pipe_stencil_ref"); 642 643 util_dump_member_array(stream, uint, state, ref_value); 644 645 util_dump_struct_end(stream); 646} 647 648void 649util_dump_framebuffer_state(FILE *stream, const struct pipe_framebuffer_state *state) 650{ 651 util_dump_struct_begin(stream, "pipe_framebuffer_state"); 652 653 util_dump_member(stream, uint, state, width); 654 util_dump_member(stream, uint, state, height); 655 util_dump_member(stream, uint, state, samples); 656 util_dump_member(stream, uint, state, layers); 657 util_dump_member(stream, uint, state, nr_cbufs); 658 util_dump_member_array(stream, ptr, state, cbufs); 659 util_dump_member(stream, ptr, state, zsbuf); 660 661 util_dump_struct_end(stream); 662} 663 664 665void 666util_dump_sampler_state(FILE *stream, const struct pipe_sampler_state *state) 667{ 668 if (!state) { 669 util_dump_null(stream); 670 return; 671 } 672 673 util_dump_struct_begin(stream, "pipe_sampler_state"); 674 675 util_dump_member(stream, enum_tex_wrap, state, wrap_s); 676 util_dump_member(stream, enum_tex_wrap, state, wrap_t); 677 util_dump_member(stream, enum_tex_wrap, state, wrap_r); 678 util_dump_member(stream, enum_tex_filter, state, min_img_filter); 679 util_dump_member(stream, enum_tex_mipfilter, state, min_mip_filter); 680 util_dump_member(stream, enum_tex_filter, state, mag_img_filter); 681 util_dump_member(stream, uint, state, compare_mode); 682 util_dump_member(stream, enum_func, state, compare_func); 683 util_dump_member(stream, bool, state, normalized_coords); 684 util_dump_member(stream, uint, state, max_anisotropy); 685 util_dump_member(stream, bool, state, seamless_cube_map); 686 util_dump_member(stream, float, state, lod_bias); 687 util_dump_member(stream, float, state, min_lod); 688 util_dump_member(stream, float, state, max_lod); 689 util_dump_member_array(stream, float, state, border_color.f); 690 691 util_dump_struct_end(stream); 692} 693 694 695void 696util_dump_surface(FILE *stream, const struct pipe_surface *state) 697{ 698 if (!state) { 699 util_dump_null(stream); 700 return; 701 } 702 703 util_dump_struct_begin(stream, "pipe_surface"); 704 705 util_dump_member(stream, format, state, format); 706 util_dump_member(stream, uint, state, width); 707 util_dump_member(stream, uint, state, height); 708 709 util_dump_member(stream, ptr, state, texture); 710 util_dump_member(stream, uint, state, u.tex.level); 711 util_dump_member(stream, uint, state, u.tex.first_layer); 712 util_dump_member(stream, uint, state, u.tex.last_layer); 713 714 util_dump_struct_end(stream); 715} 716 717 718void 719util_dump_image_view(FILE *stream, const struct pipe_image_view *state) 720{ 721 if (!state) { 722 util_dump_null(stream); 723 return; 724 } 725 726 util_dump_struct_begin(stream, "pipe_image_view"); 727 728 util_dump_member(stream, ptr, state, resource); 729 util_dump_member(stream, format, state, format); 730 731 if (state->resource->target == PIPE_BUFFER) { 732 util_dump_member(stream, uint, state, u.buf.offset); 733 util_dump_member(stream, uint, state, u.buf.size); 734 } 735 else { 736 util_dump_member(stream, uint, state, u.tex.first_layer); 737 util_dump_member(stream, uint, state, u.tex.last_layer); 738 util_dump_member(stream, uint, state, u.tex.level); 739 } 740 741 util_dump_struct_end(stream); 742} 743 744 745void 746util_dump_shader_buffer(FILE *stream, const struct pipe_shader_buffer *state) 747{ 748 if (!state) { 749 util_dump_null(stream); 750 return; 751 } 752 753 util_dump_struct_begin(stream, "pipe_shader_buffer"); 754 755 util_dump_member(stream, ptr, state, buffer); 756 util_dump_member(stream, uint, state, buffer_offset); 757 util_dump_member(stream, uint, state, buffer_size); 758 759 util_dump_struct_end(stream); 760 761} 762 763 764void 765util_dump_sampler_view(FILE *stream, const struct pipe_sampler_view *state) 766{ 767 if (!state) { 768 util_dump_null(stream); 769 return; 770 } 771 772 util_dump_struct_begin(stream, "pipe_sampler_view"); 773 774 util_dump_member(stream, enum_tex_target, state, target); 775 util_dump_member(stream, format, state, format); 776 util_dump_member(stream, ptr, state, texture); 777 778 if (state->target == PIPE_BUFFER) { 779 util_dump_member(stream, uint, state, u.buf.offset); 780 util_dump_member(stream, uint, state, u.buf.size); 781 } 782 else { 783 util_dump_member(stream, uint, state, u.tex.first_layer); 784 util_dump_member(stream, uint, state, u.tex.last_layer); 785 util_dump_member(stream, uint, state, u.tex.first_level); 786 util_dump_member(stream, uint, state, u.tex.last_level); 787 } 788 789 util_dump_member(stream, uint, state, swizzle_r); 790 util_dump_member(stream, uint, state, swizzle_g); 791 util_dump_member(stream, uint, state, swizzle_b); 792 util_dump_member(stream, uint, state, swizzle_a); 793 794 util_dump_struct_end(stream); 795} 796 797 798void 799util_dump_transfer(FILE *stream, const struct pipe_transfer *state) 800{ 801 if (!state) { 802 util_dump_null(stream); 803 return; 804 } 805 806 util_dump_struct_begin(stream, "pipe_transfer"); 807 808 util_dump_member(stream, ptr, state, resource); 809 util_dump_member(stream, uint, state, level); 810 util_dump_member(stream, transfer_usage, state, usage); 811 util_dump_member_begin(stream, "box"); 812 util_dump_box(stream, &state->box); 813 util_dump_member_end(stream); 814 util_dump_member(stream, uint, state, stride); 815 util_dump_member(stream, uint, state, layer_stride); 816 817 util_dump_struct_end(stream); 818} 819 820 821void 822util_dump_constant_buffer(FILE *stream, 823 const struct pipe_constant_buffer *state) 824{ 825 if (!state) { 826 util_dump_null(stream); 827 return; 828 } 829 830 util_dump_struct_begin(stream, "pipe_constant_buffer"); 831 832 util_dump_member(stream, ptr, state, buffer); 833 util_dump_member(stream, uint, state, buffer_offset); 834 util_dump_member(stream, uint, state, buffer_size); 835 util_dump_member(stream, ptr, state, user_buffer); 836 837 util_dump_struct_end(stream); 838} 839 840 841void 842util_dump_vertex_buffer(FILE *stream, const struct pipe_vertex_buffer *state) 843{ 844 if (!state) { 845 util_dump_null(stream); 846 return; 847 } 848 849 util_dump_struct_begin(stream, "pipe_vertex_buffer"); 850 851 util_dump_member(stream, uint, state, stride); 852 util_dump_member(stream, bool, state, is_user_buffer); 853 util_dump_member(stream, uint, state, buffer_offset); 854 util_dump_member(stream, ptr, state, buffer.resource); 855 856 util_dump_struct_end(stream); 857} 858 859 860void 861util_dump_vertex_element(FILE *stream, const struct pipe_vertex_element *state) 862{ 863 if (!state) { 864 util_dump_null(stream); 865 return; 866 } 867 868 util_dump_struct_begin(stream, "pipe_vertex_element"); 869 870 util_dump_member(stream, uint, state, src_offset); 871 util_dump_member(stream, uint, state, instance_divisor); 872 util_dump_member(stream, uint, state, vertex_buffer_index); 873 util_dump_member(stream, format, state, src_format); 874 875 util_dump_struct_end(stream); 876} 877 878 879void 880util_dump_stream_output_target(FILE *stream, 881 const struct pipe_stream_output_target *state) 882{ 883 if (!state) { 884 util_dump_null(stream); 885 return; 886 } 887 888 util_dump_struct_begin(stream, "pipe_stream_output_target"); 889 890 util_dump_member(stream, ptr, state, buffer); 891 util_dump_member(stream, uint, state, buffer_offset); 892 util_dump_member(stream, uint, state, buffer_size); 893 894 util_dump_struct_end(stream); 895} 896 897 898void 899util_dump_draw_info(FILE *stream, const struct pipe_draw_info *state) 900{ 901 if (!state) { 902 util_dump_null(stream); 903 return; 904 } 905 906 util_dump_struct_begin(stream, "pipe_draw_info"); 907 908 util_dump_member(stream, uint, state, index_size); 909 util_dump_member(stream, uint, state, has_user_indices); 910 911 util_dump_member(stream, enum_prim_mode, state, mode); 912 913 util_dump_member(stream, uint, state, start_instance); 914 util_dump_member(stream, uint, state, instance_count); 915 916 util_dump_member(stream, uint, state, min_index); 917 util_dump_member(stream, uint, state, max_index); 918 919 util_dump_member(stream, bool, state, primitive_restart); 920 if (state->primitive_restart) 921 util_dump_member(stream, uint, state, restart_index); 922 923 if (state->index_size) { 924 if (state->has_user_indices) 925 util_dump_member(stream, ptr, state, index.user); 926 else 927 util_dump_member(stream, ptr, state, index.resource); 928 } 929 util_dump_struct_end(stream); 930} 931 932void 933util_dump_draw_start_count_bias(FILE *stream, const struct pipe_draw_start_count_bias *state) 934{ 935 util_dump_struct_begin(stream, "pipe_draw_start_count_bias"); 936 util_dump_member(stream, uint, state, start); 937 util_dump_member(stream, uint, state, count); 938 util_dump_member(stream, int, state, index_bias); 939 util_dump_struct_end(stream); 940} 941 942void 943util_dump_draw_indirect_info(FILE *stream, 944 const struct pipe_draw_indirect_info *state) 945{ 946 if (!state) { 947 util_dump_null(stream); 948 return; 949 } 950 951 util_dump_struct_begin(stream, "pipe_draw_indirect_info"); 952 util_dump_member(stream, uint, state, offset); 953 util_dump_member(stream, uint, state, stride); 954 util_dump_member(stream, uint, state, draw_count); 955 util_dump_member(stream, uint, state, indirect_draw_count_offset); 956 util_dump_member(stream, ptr, state, buffer); 957 util_dump_member(stream, ptr, state, indirect_draw_count); 958 util_dump_member(stream, ptr, state, count_from_stream_output); 959 util_dump_struct_end(stream); 960} 961 962void util_dump_grid_info(FILE *stream, const struct pipe_grid_info *state) 963{ 964 if (!state) { 965 util_dump_null(stream); 966 return; 967 } 968 969 util_dump_struct_begin(stream, "pipe_grid_info"); 970 971 util_dump_member(stream, uint, state, pc); 972 util_dump_member(stream, ptr, state, input); 973 util_dump_member(stream, uint, state, work_dim); 974 975 util_dump_member_begin(stream, "block"); 976 util_dump_array(stream, uint, state->block, ARRAY_SIZE(state->block)); 977 util_dump_member_end(stream); 978 979 util_dump_member_begin(stream, "grid"); 980 util_dump_array(stream, uint, state->grid, ARRAY_SIZE(state->grid)); 981 util_dump_member_end(stream); 982 983 util_dump_member(stream, ptr, state, indirect); 984 util_dump_member(stream, uint, state, indirect_offset); 985 986 util_dump_struct_end(stream); 987} 988 989void util_dump_box(FILE *stream, const struct pipe_box *box) 990{ 991 if (!box) { 992 util_dump_null(stream); 993 return; 994 } 995 996 util_dump_struct_begin(stream, "pipe_box"); 997 998 util_dump_member(stream, int, box, x); 999 util_dump_member(stream, int, box, y); 1000 util_dump_member(stream, int, box, z); 1001 util_dump_member(stream, int, box, width); 1002 util_dump_member(stream, int, box, height); 1003 util_dump_member(stream, int, box, depth); 1004 1005 util_dump_struct_end(stream); 1006} 1007 1008void util_dump_blit_info(FILE *stream, const struct pipe_blit_info *info) 1009{ 1010 char mask[7]; 1011 1012 if (!info) { 1013 util_dump_null(stream); 1014 return; 1015 } 1016 1017 util_dump_struct_begin(stream, "pipe_blit_info"); 1018 1019 util_dump_member_begin(stream, "dst"); 1020 util_dump_struct_begin(stream, "dst"); 1021 util_dump_member(stream, ptr, &info->dst, resource); 1022 util_dump_member(stream, uint, &info->dst, level); 1023 util_dump_member(stream, format, &info->dst, format); 1024 util_dump_member_begin(stream, "box"); 1025 util_dump_box(stream, &info->dst.box); 1026 util_dump_member_end(stream); 1027 util_dump_struct_end(stream); 1028 util_dump_member_end(stream); 1029 1030 util_dump_member_begin(stream, "src"); 1031 util_dump_struct_begin(stream, "src"); 1032 util_dump_member(stream, ptr, &info->src, resource); 1033 util_dump_member(stream, uint, &info->src, level); 1034 util_dump_member(stream, format, &info->src, format); 1035 util_dump_member_begin(stream, "box"); 1036 util_dump_box(stream, &info->src.box); 1037 util_dump_member_end(stream); 1038 util_dump_struct_end(stream); 1039 util_dump_member_end(stream); 1040 1041 mask[0] = (info->mask & PIPE_MASK_R) ? 'R' : '-'; 1042 mask[1] = (info->mask & PIPE_MASK_G) ? 'G' : '-'; 1043 mask[2] = (info->mask & PIPE_MASK_B) ? 'B' : '-'; 1044 mask[3] = (info->mask & PIPE_MASK_A) ? 'A' : '-'; 1045 mask[4] = (info->mask & PIPE_MASK_Z) ? 'Z' : '-'; 1046 mask[5] = (info->mask & PIPE_MASK_S) ? 'S' : '-'; 1047 mask[6] = 0; 1048 1049 util_dump_member_begin(stream, "mask"); 1050 util_dump_string(stream, mask); 1051 util_dump_member_end(stream); 1052 util_dump_member(stream, enum_tex_filter, info, filter); 1053 1054 util_dump_member(stream, bool, info, scissor_enable); 1055 util_dump_member_begin(stream, "scissor"); 1056 util_dump_scissor_state(stream, &info->scissor); 1057 util_dump_member_end(stream); 1058 1059 util_dump_member(stream, bool, info, render_condition_enable); 1060 1061 util_dump_struct_end(stream); 1062} 1063