1 /************************************************************************** 2 * 3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 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 TUNGSTEN GRAPHICS 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 #include "util/u_inlines.h" 29 #include "util/u_memory.h" 30 #include "util/u_simple_list.h" 31 32 #include "pipe/p_format.h" 33 #include "pipe/p_screen.h" 34 35 #include "tr_dump.h" 36 #include "tr_dump_state.h" 37 #include "tr_public.h" 38 #include "tr_screen.h" 39 #include "tr_texture.h" 40 #include "tr_context.h" 41 42 43 44 45 46 static INLINE struct pipe_resource * 47 trace_resource_unwrap(struct trace_context *tr_ctx, 48 struct pipe_resource *resource) 49 { 50 struct trace_resource *tr_res; 51 52 if(!resource) 53 return NULL; 54 55 tr_res = trace_resource(resource); 56 57 assert(tr_res->resource); 58 return tr_res->resource; 59 } 60 61 62 static INLINE struct pipe_surface * 63 trace_surface_unwrap(struct trace_context *tr_ctx, 64 struct pipe_surface *surface) 65 { 66 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); 67 struct trace_surface *tr_surf; 68 69 if(!surface) 70 return NULL; 71 72 assert(surface->texture); 73 if(!surface->texture) 74 return surface; 75 76 tr_surf = trace_surface(surface); 77 78 assert(tr_surf->surface); 79 assert(tr_surf->surface->texture->screen == tr_scr->screen); 80 (void) tr_scr; 81 return tr_surf->surface; 82 } 83 84 85 static INLINE void 86 trace_context_draw_vbo(struct pipe_context *_pipe, 87 const struct pipe_draw_info *info) 88 { 89 struct trace_context *tr_ctx = trace_context(_pipe); 90 struct pipe_context *pipe = tr_ctx->pipe; 91 92 trace_dump_call_begin("pipe_context", "draw_vbo"); 93 94 trace_dump_arg(ptr, pipe); 95 trace_dump_arg(draw_info, info); 96 97 pipe->draw_vbo(pipe, info); 98 99 trace_dump_call_end(); 100 } 101 102 103 static INLINE struct pipe_query * 104 trace_context_create_query(struct pipe_context *_pipe, 105 unsigned query_type) 106 { 107 struct trace_context *tr_ctx = trace_context(_pipe); 108 struct pipe_context *pipe = tr_ctx->pipe; 109 struct pipe_query *result; 110 111 trace_dump_call_begin("pipe_context", "create_query"); 112 113 trace_dump_arg(ptr, pipe); 114 trace_dump_arg(uint, query_type); 115 116 result = pipe->create_query(pipe, query_type); 117 118 trace_dump_ret(ptr, result); 119 120 trace_dump_call_end(); 121 122 return result; 123 } 124 125 126 static INLINE void 127 trace_context_destroy_query(struct pipe_context *_pipe, 128 struct pipe_query *query) 129 { 130 struct trace_context *tr_ctx = trace_context(_pipe); 131 struct pipe_context *pipe = tr_ctx->pipe; 132 133 trace_dump_call_begin("pipe_context", "destroy_query"); 134 135 trace_dump_arg(ptr, pipe); 136 trace_dump_arg(ptr, query); 137 138 pipe->destroy_query(pipe, query); 139 140 trace_dump_call_end(); 141 } 142 143 144 static INLINE void 145 trace_context_begin_query(struct pipe_context *_pipe, 146 struct pipe_query *query) 147 { 148 struct trace_context *tr_ctx = trace_context(_pipe); 149 struct pipe_context *pipe = tr_ctx->pipe; 150 151 trace_dump_call_begin("pipe_context", "begin_query"); 152 153 trace_dump_arg(ptr, pipe); 154 trace_dump_arg(ptr, query); 155 156 pipe->begin_query(pipe, query); 157 158 trace_dump_call_end(); 159 } 160 161 162 static INLINE void 163 trace_context_end_query(struct pipe_context *_pipe, 164 struct pipe_query *query) 165 { 166 struct trace_context *tr_ctx = trace_context(_pipe); 167 struct pipe_context *pipe = tr_ctx->pipe; 168 169 trace_dump_call_begin("pipe_context", "end_query"); 170 171 trace_dump_arg(ptr, pipe); 172 trace_dump_arg(ptr, query); 173 174 pipe->end_query(pipe, query); 175 176 trace_dump_call_end(); 177 } 178 179 180 static INLINE boolean 181 trace_context_get_query_result(struct pipe_context *_pipe, 182 struct pipe_query *query, 183 boolean wait, 184 union pipe_query_result *presult) 185 { 186 struct trace_context *tr_ctx = trace_context(_pipe); 187 struct pipe_context *pipe = tr_ctx->pipe; 188 uint64_t result; 189 boolean _result; 190 191 trace_dump_call_begin("pipe_context", "get_query_result"); 192 193 trace_dump_arg(ptr, pipe); 194 195 _result = pipe->get_query_result(pipe, query, wait, presult); 196 /* XXX this depends on the query type */ 197 result = *((uint64_t*)presult); 198 199 trace_dump_arg(uint, result); 200 trace_dump_ret(bool, _result); 201 202 trace_dump_call_end(); 203 204 return _result; 205 } 206 207 208 static INLINE void * 209 trace_context_create_blend_state(struct pipe_context *_pipe, 210 const struct pipe_blend_state *state) 211 { 212 struct trace_context *tr_ctx = trace_context(_pipe); 213 struct pipe_context *pipe = tr_ctx->pipe; 214 void * result; 215 216 trace_dump_call_begin("pipe_context", "create_blend_state"); 217 218 trace_dump_arg(ptr, pipe); 219 trace_dump_arg(blend_state, state); 220 221 result = pipe->create_blend_state(pipe, state); 222 223 trace_dump_ret(ptr, result); 224 225 trace_dump_call_end(); 226 227 return result; 228 } 229 230 231 static INLINE void 232 trace_context_bind_blend_state(struct pipe_context *_pipe, 233 void *state) 234 { 235 struct trace_context *tr_ctx = trace_context(_pipe); 236 struct pipe_context *pipe = tr_ctx->pipe; 237 238 trace_dump_call_begin("pipe_context", "bind_blend_state"); 239 240 trace_dump_arg(ptr, pipe); 241 trace_dump_arg(ptr, state); 242 243 pipe->bind_blend_state(pipe, state); 244 245 trace_dump_call_end(); 246 } 247 248 249 static INLINE void 250 trace_context_delete_blend_state(struct pipe_context *_pipe, 251 void *state) 252 { 253 struct trace_context *tr_ctx = trace_context(_pipe); 254 struct pipe_context *pipe = tr_ctx->pipe; 255 256 trace_dump_call_begin("pipe_context", "delete_blend_state"); 257 258 trace_dump_arg(ptr, pipe); 259 trace_dump_arg(ptr, state); 260 261 pipe->delete_blend_state(pipe, state); 262 263 trace_dump_call_end(); 264 } 265 266 267 static INLINE void * 268 trace_context_create_sampler_state(struct pipe_context *_pipe, 269 const struct pipe_sampler_state *state) 270 { 271 struct trace_context *tr_ctx = trace_context(_pipe); 272 struct pipe_context *pipe = tr_ctx->pipe; 273 void * result; 274 275 trace_dump_call_begin("pipe_context", "create_sampler_state"); 276 277 trace_dump_arg(ptr, pipe); 278 trace_dump_arg(sampler_state, state); 279 280 result = pipe->create_sampler_state(pipe, state); 281 282 trace_dump_ret(ptr, result); 283 284 trace_dump_call_end(); 285 286 return result; 287 } 288 289 290 static INLINE void 291 trace_context_bind_sampler_states(struct pipe_context *_pipe, 292 unsigned shader, 293 unsigned start, 294 unsigned num_states, 295 void **states) 296 { 297 struct trace_context *tr_ctx = trace_context(_pipe); 298 struct pipe_context *pipe = tr_ctx->pipe; 299 300 /* remove this when we have pipe->bind_sampler_states(..., start, ...) */ 301 assert(start == 0); 302 303 switch (shader) { 304 case PIPE_SHADER_VERTEX: 305 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states"); 306 break; 307 case PIPE_SHADER_GEOMETRY: 308 trace_dump_call_begin("pipe_context", "bind_geometry_sampler_states"); 309 break; 310 case PIPE_SHADER_FRAGMENT: 311 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states"); 312 break; 313 default: 314 debug_error("Unexpected shader in trace_context_bind_sampler_states()"); 315 } 316 317 trace_dump_arg(ptr, pipe); 318 trace_dump_arg(uint, num_states); 319 trace_dump_arg_array(ptr, states, num_states); 320 321 switch (shader) { 322 case PIPE_SHADER_VERTEX: 323 pipe->bind_vertex_sampler_states(pipe, num_states, states); 324 break; 325 case PIPE_SHADER_GEOMETRY: 326 pipe->bind_geometry_sampler_states(pipe, num_states, states); 327 break; 328 case PIPE_SHADER_FRAGMENT: 329 pipe->bind_fragment_sampler_states(pipe, num_states, states); 330 break; 331 default: 332 debug_error("Unexpected shader in trace_context_bind_sampler_states()"); 333 } 334 335 trace_dump_call_end(); 336 } 337 338 339 static INLINE void 340 trace_context_bind_fragment_sampler_states(struct pipe_context *_pipe, 341 unsigned num, 342 void **states) 343 { 344 trace_context_bind_sampler_states(_pipe, PIPE_SHADER_FRAGMENT, 345 0, num, states); 346 } 347 348 349 static INLINE void 350 trace_context_bind_vertex_sampler_states(struct pipe_context *_pipe, 351 unsigned num, 352 void **states) 353 { 354 trace_context_bind_sampler_states(_pipe, PIPE_SHADER_VERTEX, 355 0, num, states); 356 } 357 358 359 static INLINE void 360 trace_context_delete_sampler_state(struct pipe_context *_pipe, 361 void *state) 362 { 363 struct trace_context *tr_ctx = trace_context(_pipe); 364 struct pipe_context *pipe = tr_ctx->pipe; 365 366 trace_dump_call_begin("pipe_context", "delete_sampler_state"); 367 368 trace_dump_arg(ptr, pipe); 369 trace_dump_arg(ptr, state); 370 371 pipe->delete_sampler_state(pipe, state); 372 373 trace_dump_call_end(); 374 } 375 376 377 static INLINE void * 378 trace_context_create_rasterizer_state(struct pipe_context *_pipe, 379 const struct pipe_rasterizer_state *state) 380 { 381 struct trace_context *tr_ctx = trace_context(_pipe); 382 struct pipe_context *pipe = tr_ctx->pipe; 383 void * result; 384 385 trace_dump_call_begin("pipe_context", "create_rasterizer_state"); 386 387 trace_dump_arg(ptr, pipe); 388 trace_dump_arg(rasterizer_state, state); 389 390 result = pipe->create_rasterizer_state(pipe, state); 391 392 trace_dump_ret(ptr, result); 393 394 trace_dump_call_end(); 395 396 return result; 397 } 398 399 400 static INLINE void 401 trace_context_bind_rasterizer_state(struct pipe_context *_pipe, 402 void *state) 403 { 404 struct trace_context *tr_ctx = trace_context(_pipe); 405 struct pipe_context *pipe = tr_ctx->pipe; 406 407 trace_dump_call_begin("pipe_context", "bind_rasterizer_state"); 408 409 trace_dump_arg(ptr, pipe); 410 trace_dump_arg(ptr, state); 411 412 pipe->bind_rasterizer_state(pipe, state); 413 414 trace_dump_call_end(); 415 } 416 417 418 static INLINE void 419 trace_context_delete_rasterizer_state(struct pipe_context *_pipe, 420 void *state) 421 { 422 struct trace_context *tr_ctx = trace_context(_pipe); 423 struct pipe_context *pipe = tr_ctx->pipe; 424 425 trace_dump_call_begin("pipe_context", "delete_rasterizer_state"); 426 427 trace_dump_arg(ptr, pipe); 428 trace_dump_arg(ptr, state); 429 430 pipe->delete_rasterizer_state(pipe, state); 431 432 trace_dump_call_end(); 433 } 434 435 436 static INLINE void * 437 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe, 438 const struct pipe_depth_stencil_alpha_state *state) 439 { 440 struct trace_context *tr_ctx = trace_context(_pipe); 441 struct pipe_context *pipe = tr_ctx->pipe; 442 void * result; 443 444 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state"); 445 446 result = pipe->create_depth_stencil_alpha_state(pipe, state); 447 448 trace_dump_arg(ptr, pipe); 449 trace_dump_arg(depth_stencil_alpha_state, state); 450 451 trace_dump_ret(ptr, result); 452 453 trace_dump_call_end(); 454 455 return result; 456 } 457 458 459 static INLINE void 460 trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe, 461 void *state) 462 { 463 struct trace_context *tr_ctx = trace_context(_pipe); 464 struct pipe_context *pipe = tr_ctx->pipe; 465 466 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state"); 467 468 trace_dump_arg(ptr, pipe); 469 trace_dump_arg(ptr, state); 470 471 pipe->bind_depth_stencil_alpha_state(pipe, state); 472 473 trace_dump_call_end(); 474 } 475 476 477 static INLINE void 478 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, 479 void *state) 480 { 481 struct trace_context *tr_ctx = trace_context(_pipe); 482 struct pipe_context *pipe = tr_ctx->pipe; 483 484 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state"); 485 486 trace_dump_arg(ptr, pipe); 487 trace_dump_arg(ptr, state); 488 489 pipe->delete_depth_stencil_alpha_state(pipe, state); 490 491 trace_dump_call_end(); 492 } 493 494 495 static INLINE void * 496 trace_context_create_fs_state(struct pipe_context *_pipe, 497 const struct pipe_shader_state *state) 498 { 499 struct trace_context *tr_ctx = trace_context(_pipe); 500 struct pipe_context *pipe = tr_ctx->pipe; 501 void * result; 502 503 trace_dump_call_begin("pipe_context", "create_fs_state"); 504 505 trace_dump_arg(ptr, pipe); 506 trace_dump_arg(shader_state, state); 507 508 result = pipe->create_fs_state(pipe, state); 509 510 trace_dump_ret(ptr, result); 511 512 trace_dump_call_end(); 513 514 return result; 515 } 516 517 518 static INLINE void 519 trace_context_bind_fs_state(struct pipe_context *_pipe, 520 void *state) 521 { 522 struct trace_context *tr_ctx = trace_context(_pipe); 523 struct pipe_context *pipe = tr_ctx->pipe; 524 525 trace_dump_call_begin("pipe_context", "bind_fs_state"); 526 527 trace_dump_arg(ptr, pipe); 528 trace_dump_arg(ptr, state); 529 530 pipe->bind_fs_state(pipe, state); 531 532 trace_dump_call_end(); 533 } 534 535 536 static INLINE void 537 trace_context_delete_fs_state(struct pipe_context *_pipe, 538 void *state) 539 { 540 struct trace_context *tr_ctx = trace_context(_pipe); 541 struct pipe_context *pipe = tr_ctx->pipe; 542 543 trace_dump_call_begin("pipe_context", "delete_fs_state"); 544 545 trace_dump_arg(ptr, pipe); 546 trace_dump_arg(ptr, state); 547 548 pipe->delete_fs_state(pipe, state); 549 550 trace_dump_call_end(); 551 } 552 553 554 static INLINE void * 555 trace_context_create_vs_state(struct pipe_context *_pipe, 556 const struct pipe_shader_state *state) 557 { 558 struct trace_context *tr_ctx = trace_context(_pipe); 559 struct pipe_context *pipe = tr_ctx->pipe; 560 void * result; 561 562 trace_dump_call_begin("pipe_context", "create_vs_state"); 563 564 trace_dump_arg(ptr, pipe); 565 trace_dump_arg(shader_state, state); 566 567 result = pipe->create_vs_state(pipe, state); 568 569 trace_dump_ret(ptr, result); 570 571 trace_dump_call_end(); 572 573 return result; 574 } 575 576 577 static INLINE void 578 trace_context_bind_vs_state(struct pipe_context *_pipe, 579 void *state) 580 { 581 struct trace_context *tr_ctx = trace_context(_pipe); 582 struct pipe_context *pipe = tr_ctx->pipe; 583 584 trace_dump_call_begin("pipe_context", "bind_vs_state"); 585 586 trace_dump_arg(ptr, pipe); 587 trace_dump_arg(ptr, state); 588 589 pipe->bind_vs_state(pipe, state); 590 591 trace_dump_call_end(); 592 } 593 594 595 static INLINE void 596 trace_context_delete_vs_state(struct pipe_context *_pipe, 597 void *state) 598 { 599 struct trace_context *tr_ctx = trace_context(_pipe); 600 struct pipe_context *pipe = tr_ctx->pipe; 601 602 trace_dump_call_begin("pipe_context", "delete_vs_state"); 603 604 trace_dump_arg(ptr, pipe); 605 trace_dump_arg(ptr, state); 606 607 pipe->delete_vs_state(pipe, state); 608 609 trace_dump_call_end(); 610 } 611 612 613 static INLINE void * 614 trace_context_create_vertex_elements_state(struct pipe_context *_pipe, 615 unsigned num_elements, 616 const struct pipe_vertex_element *elements) 617 { 618 struct trace_context *tr_ctx = trace_context(_pipe); 619 struct pipe_context *pipe = tr_ctx->pipe; 620 void * result; 621 622 trace_dump_call_begin("pipe_context", "create_vertex_elements_state"); 623 624 trace_dump_arg(ptr, pipe); 625 trace_dump_arg(uint, num_elements); 626 627 trace_dump_arg_begin("elements"); 628 trace_dump_struct_array(vertex_element, elements, num_elements); 629 trace_dump_arg_end(); 630 631 result = pipe->create_vertex_elements_state(pipe, num_elements, elements); 632 633 trace_dump_ret(ptr, result); 634 635 trace_dump_call_end(); 636 637 return result; 638 } 639 640 641 static INLINE void 642 trace_context_bind_vertex_elements_state(struct pipe_context *_pipe, 643 void *state) 644 { 645 struct trace_context *tr_ctx = trace_context(_pipe); 646 struct pipe_context *pipe = tr_ctx->pipe; 647 648 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state"); 649 650 trace_dump_arg(ptr, pipe); 651 trace_dump_arg(ptr, state); 652 653 pipe->bind_vertex_elements_state(pipe, state); 654 655 trace_dump_call_end(); 656 } 657 658 659 static INLINE void 660 trace_context_delete_vertex_elements_state(struct pipe_context *_pipe, 661 void *state) 662 { 663 struct trace_context *tr_ctx = trace_context(_pipe); 664 struct pipe_context *pipe = tr_ctx->pipe; 665 666 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state"); 667 668 trace_dump_arg(ptr, pipe); 669 trace_dump_arg(ptr, state); 670 671 pipe->delete_vertex_elements_state(pipe, state); 672 673 trace_dump_call_end(); 674 } 675 676 677 static INLINE void 678 trace_context_set_blend_color(struct pipe_context *_pipe, 679 const struct pipe_blend_color *state) 680 { 681 struct trace_context *tr_ctx = trace_context(_pipe); 682 struct pipe_context *pipe = tr_ctx->pipe; 683 684 trace_dump_call_begin("pipe_context", "set_blend_color"); 685 686 trace_dump_arg(ptr, pipe); 687 trace_dump_arg(blend_color, state); 688 689 pipe->set_blend_color(pipe, state); 690 691 trace_dump_call_end(); 692 } 693 694 695 static INLINE void 696 trace_context_set_stencil_ref(struct pipe_context *_pipe, 697 const struct pipe_stencil_ref *state) 698 { 699 struct trace_context *tr_ctx = trace_context(_pipe); 700 struct pipe_context *pipe = tr_ctx->pipe; 701 702 trace_dump_call_begin("pipe_context", "set_stencil_ref"); 703 704 trace_dump_arg(ptr, pipe); 705 trace_dump_arg(stencil_ref, state); 706 707 pipe->set_stencil_ref(pipe, state); 708 709 trace_dump_call_end(); 710 } 711 712 713 static INLINE void 714 trace_context_set_clip_state(struct pipe_context *_pipe, 715 const struct pipe_clip_state *state) 716 { 717 struct trace_context *tr_ctx = trace_context(_pipe); 718 struct pipe_context *pipe = tr_ctx->pipe; 719 720 trace_dump_call_begin("pipe_context", "set_clip_state"); 721 722 trace_dump_arg(ptr, pipe); 723 trace_dump_arg(clip_state, state); 724 725 pipe->set_clip_state(pipe, state); 726 727 trace_dump_call_end(); 728 } 729 730 static INLINE void 731 trace_context_set_sample_mask(struct pipe_context *_pipe, 732 unsigned sample_mask) 733 { 734 struct trace_context *tr_ctx = trace_context(_pipe); 735 struct pipe_context *pipe = tr_ctx->pipe; 736 737 trace_dump_call_begin("pipe_context", "set_sample_mask"); 738 739 trace_dump_arg(ptr, pipe); 740 trace_dump_arg(uint, sample_mask); 741 742 pipe->set_sample_mask(pipe, sample_mask); 743 744 trace_dump_call_end(); 745 } 746 747 static INLINE void 748 trace_context_set_constant_buffer(struct pipe_context *_pipe, 749 uint shader, uint index, 750 struct pipe_constant_buffer *constant_buffer) 751 { 752 struct trace_context *tr_ctx = trace_context(_pipe); 753 struct pipe_context *pipe = tr_ctx->pipe; 754 struct pipe_constant_buffer cb; 755 756 if (constant_buffer) { 757 cb = *constant_buffer; 758 cb.buffer = trace_resource_unwrap(tr_ctx, constant_buffer->buffer); 759 } 760 761 trace_dump_call_begin("pipe_context", "set_constant_buffer"); 762 763 trace_dump_arg(ptr, pipe); 764 trace_dump_arg(uint, shader); 765 trace_dump_arg(uint, index); 766 if (constant_buffer) { 767 trace_dump_struct_begin("pipe_constant_buffer"); 768 trace_dump_member(ptr, constant_buffer, buffer); 769 trace_dump_member(uint, constant_buffer, buffer_offset); 770 trace_dump_member(uint, constant_buffer, buffer_size); 771 trace_dump_struct_end(); 772 } else { 773 trace_dump_arg(ptr, constant_buffer); 774 } 775 776 pipe->set_constant_buffer(pipe, shader, index, 777 constant_buffer ? &cb : NULL); 778 779 trace_dump_call_end(); 780 } 781 782 783 static INLINE void 784 trace_context_set_framebuffer_state(struct pipe_context *_pipe, 785 const struct pipe_framebuffer_state *state) 786 { 787 struct trace_context *tr_ctx = trace_context(_pipe); 788 struct pipe_context *pipe = tr_ctx->pipe; 789 struct pipe_framebuffer_state unwrapped_state; 790 unsigned i; 791 792 793 /* Unwrap the input state */ 794 memcpy(&unwrapped_state, state, sizeof(unwrapped_state)); 795 for(i = 0; i < state->nr_cbufs; ++i) 796 unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]); 797 for(i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i) 798 unwrapped_state.cbufs[i] = NULL; 799 unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf); 800 state = &unwrapped_state; 801 802 trace_dump_call_begin("pipe_context", "set_framebuffer_state"); 803 804 trace_dump_arg(ptr, pipe); 805 trace_dump_arg(framebuffer_state, state); 806 807 pipe->set_framebuffer_state(pipe, state); 808 809 trace_dump_call_end(); 810 } 811 812 813 static INLINE void 814 trace_context_set_polygon_stipple(struct pipe_context *_pipe, 815 const struct pipe_poly_stipple *state) 816 { 817 struct trace_context *tr_ctx = trace_context(_pipe); 818 struct pipe_context *pipe = tr_ctx->pipe; 819 820 trace_dump_call_begin("pipe_context", "set_polygon_stipple"); 821 822 trace_dump_arg(ptr, pipe); 823 trace_dump_arg(poly_stipple, state); 824 825 pipe->set_polygon_stipple(pipe, state); 826 827 trace_dump_call_end(); 828 } 829 830 831 static INLINE void 832 trace_context_set_scissor_state(struct pipe_context *_pipe, 833 const struct pipe_scissor_state *state) 834 { 835 struct trace_context *tr_ctx = trace_context(_pipe); 836 struct pipe_context *pipe = tr_ctx->pipe; 837 838 trace_dump_call_begin("pipe_context", "set_scissor_state"); 839 840 trace_dump_arg(ptr, pipe); 841 trace_dump_arg(scissor_state, state); 842 843 pipe->set_scissor_state(pipe, state); 844 845 trace_dump_call_end(); 846 } 847 848 849 static INLINE void 850 trace_context_set_viewport_state(struct pipe_context *_pipe, 851 const struct pipe_viewport_state *state) 852 { 853 struct trace_context *tr_ctx = trace_context(_pipe); 854 struct pipe_context *pipe = tr_ctx->pipe; 855 856 trace_dump_call_begin("pipe_context", "set_viewport_state"); 857 858 trace_dump_arg(ptr, pipe); 859 trace_dump_arg(viewport_state, state); 860 861 pipe->set_viewport_state(pipe, state); 862 863 trace_dump_call_end(); 864 } 865 866 867 static struct pipe_sampler_view * 868 trace_context_create_sampler_view(struct pipe_context *_pipe, 869 struct pipe_resource *_resource, 870 const struct pipe_sampler_view *templ) 871 { 872 struct trace_context *tr_ctx = trace_context(_pipe); 873 struct trace_resource *tr_res = trace_resource(_resource); 874 struct pipe_context *pipe = tr_ctx->pipe; 875 struct pipe_resource *resource = tr_res->resource; 876 struct pipe_sampler_view *result; 877 struct trace_sampler_view *tr_view; 878 879 trace_dump_call_begin("pipe_context", "create_sampler_view"); 880 881 trace_dump_arg(ptr, pipe); 882 trace_dump_arg(ptr, resource); 883 884 trace_dump_arg_begin("templ"); 885 trace_dump_sampler_view_template(templ, resource->target); 886 trace_dump_arg_end(); 887 888 result = pipe->create_sampler_view(pipe, resource, templ); 889 890 trace_dump_ret(ptr, result); 891 892 trace_dump_call_end(); 893 894 /* 895 * Wrap pipe_sampler_view 896 */ 897 tr_view = CALLOC_STRUCT(trace_sampler_view); 898 tr_view->base = *templ; 899 tr_view->base.reference.count = 1; 900 tr_view->base.texture = NULL; 901 pipe_resource_reference(&tr_view->base.texture, _resource); 902 tr_view->base.context = _pipe; 903 tr_view->sampler_view = result; 904 result = &tr_view->base; 905 906 return result; 907 } 908 909 910 static void 911 trace_context_sampler_view_destroy(struct pipe_context *_pipe, 912 struct pipe_sampler_view *_view) 913 { 914 struct trace_context *tr_ctx = trace_context(_pipe); 915 struct trace_sampler_view *tr_view = trace_sampler_view(_view); 916 struct pipe_context *pipe = tr_ctx->pipe; 917 struct pipe_sampler_view *view = tr_view->sampler_view; 918 919 trace_dump_call_begin("pipe_context", "sampler_view_destroy"); 920 921 trace_dump_arg(ptr, pipe); 922 trace_dump_arg(ptr, view); 923 924 pipe_sampler_view_reference(&tr_view->sampler_view, NULL); 925 926 trace_dump_call_end(); 927 928 pipe_resource_reference(&_view->texture, NULL); 929 FREE(_view); 930 } 931 932 /******************************************************************** 933 * surface 934 */ 935 936 937 static struct pipe_surface * 938 trace_context_create_surface(struct pipe_context *_pipe, 939 struct pipe_resource *_resource, 940 const struct pipe_surface *surf_tmpl) 941 { 942 struct trace_context *tr_ctx = trace_context(_pipe); 943 struct trace_resource *tr_res = trace_resource(_resource); 944 struct pipe_context *pipe = tr_ctx->pipe; 945 struct pipe_resource *resource = tr_res->resource; 946 struct pipe_surface *result = NULL; 947 948 trace_dump_call_begin("pipe_context", "create_surface"); 949 950 trace_dump_arg(ptr, pipe); 951 trace_dump_arg(ptr, resource); 952 953 trace_dump_arg_begin("surf_tmpl"); 954 trace_dump_surface_template(surf_tmpl, resource->target); 955 trace_dump_arg_end(); 956 957 958 result = pipe->create_surface(pipe, resource, surf_tmpl); 959 960 trace_dump_ret(ptr, result); 961 962 trace_dump_call_end(); 963 964 result = trace_surf_create(tr_res, result); 965 966 return result; 967 } 968 969 970 static void 971 trace_context_surface_destroy(struct pipe_context *_pipe, 972 struct pipe_surface *_surface) 973 { 974 struct trace_context *tr_ctx = trace_context(_pipe); 975 struct pipe_context *pipe = tr_ctx->pipe; 976 struct trace_surface *tr_surf = trace_surface(_surface); 977 struct pipe_surface *surface = tr_surf->surface; 978 979 trace_dump_call_begin("pipe_context", "surface_destroy"); 980 981 trace_dump_arg(ptr, pipe); 982 trace_dump_arg(ptr, surface); 983 984 trace_dump_call_end(); 985 986 trace_surf_destroy(tr_surf); 987 } 988 989 990 static INLINE void 991 trace_context_set_sampler_views(struct pipe_context *_pipe, 992 unsigned shader, 993 unsigned start, 994 unsigned num, 995 struct pipe_sampler_view **views) 996 { 997 struct trace_context *tr_ctx = trace_context(_pipe); 998 struct trace_sampler_view *tr_view; 999 struct pipe_context *pipe = tr_ctx->pipe; 1000 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS]; 1001 unsigned i; 1002 1003 /* remove this when we have pipe->set_sampler_views(..., start, ...) */ 1004 assert(start == 0); 1005 1006 for(i = 0; i < num; ++i) { 1007 tr_view = trace_sampler_view(views[i]); 1008 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL; 1009 } 1010 views = unwrapped_views; 1011 1012 switch (shader) { 1013 case PIPE_SHADER_VERTEX: 1014 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views"); 1015 break; 1016 case PIPE_SHADER_GEOMETRY: 1017 trace_dump_call_begin("pipe_context", "set_geometry_sampler_views"); 1018 break; 1019 case PIPE_SHADER_FRAGMENT: 1020 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views"); 1021 break; 1022 default: 1023 debug_error("Unexpected shader in trace_context_set_sampler_views()"); 1024 } 1025 1026 trace_dump_arg(ptr, pipe); 1027 /*trace_dump_arg(uint, shader);*/ 1028 trace_dump_arg(uint, num); 1029 trace_dump_arg_array(ptr, views, num); 1030 1031 switch (shader) { 1032 case PIPE_SHADER_VERTEX: 1033 pipe->set_vertex_sampler_views(pipe, num, views); 1034 break; 1035 case PIPE_SHADER_GEOMETRY: 1036 pipe->set_geometry_sampler_views(pipe, num, views); 1037 break; 1038 case PIPE_SHADER_FRAGMENT: 1039 pipe->set_fragment_sampler_views(pipe, num, views); 1040 break; 1041 default: 1042 debug_error("Unexpected shader in trace_context_set_sampler_views()"); 1043 } 1044 1045 trace_dump_call_end(); 1046 } 1047 1048 1049 static INLINE void 1050 trace_context_set_fragment_sampler_views(struct pipe_context *_pipe, 1051 unsigned num, 1052 struct pipe_sampler_view **views) 1053 { 1054 trace_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, views); 1055 } 1056 1057 1058 static INLINE void 1059 trace_context_set_vertex_sampler_views(struct pipe_context *_pipe, 1060 unsigned num, 1061 struct pipe_sampler_view **views) 1062 { 1063 trace_context_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, views); 1064 } 1065 1066 1067 static INLINE void 1068 trace_context_set_vertex_buffers(struct pipe_context *_pipe, 1069 unsigned num_buffers, 1070 const struct pipe_vertex_buffer *buffers) 1071 { 1072 struct trace_context *tr_ctx = trace_context(_pipe); 1073 struct pipe_context *pipe = tr_ctx->pipe; 1074 unsigned i; 1075 1076 trace_dump_call_begin("pipe_context", "set_vertex_buffers"); 1077 1078 trace_dump_arg(ptr, pipe); 1079 trace_dump_arg(uint, num_buffers); 1080 1081 trace_dump_arg_begin("buffers"); 1082 trace_dump_struct_array(vertex_buffer, buffers, num_buffers); 1083 trace_dump_arg_end(); 1084 1085 if (num_buffers) { 1086 struct pipe_vertex_buffer *_buffers = MALLOC(num_buffers * sizeof(*_buffers)); 1087 memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers)); 1088 for (i = 0; i < num_buffers; i++) 1089 _buffers[i].buffer = trace_resource_unwrap(tr_ctx, buffers[i].buffer); 1090 pipe->set_vertex_buffers(pipe, num_buffers, _buffers); 1091 FREE(_buffers); 1092 } else { 1093 pipe->set_vertex_buffers(pipe, num_buffers, NULL); 1094 } 1095 1096 trace_dump_call_end(); 1097 } 1098 1099 1100 static INLINE void 1101 trace_context_set_index_buffer(struct pipe_context *_pipe, 1102 const struct pipe_index_buffer *ib) 1103 { 1104 struct trace_context *tr_ctx = trace_context(_pipe); 1105 struct pipe_context *pipe = tr_ctx->pipe; 1106 1107 trace_dump_call_begin("pipe_context", "set_index_buffer"); 1108 1109 trace_dump_arg(ptr, pipe); 1110 trace_dump_arg(index_buffer, ib); 1111 1112 if (ib) { 1113 struct pipe_index_buffer _ib; 1114 _ib = *ib; 1115 _ib.buffer = trace_resource_unwrap(tr_ctx, ib->buffer); 1116 pipe->set_index_buffer(pipe, &_ib); 1117 } else { 1118 pipe->set_index_buffer(pipe, NULL); 1119 } 1120 1121 trace_dump_call_end(); 1122 } 1123 1124 1125 static INLINE struct pipe_stream_output_target * 1126 trace_context_create_stream_output_target(struct pipe_context *_pipe, 1127 struct pipe_resource *res, 1128 unsigned buffer_offset, 1129 unsigned buffer_size) 1130 { 1131 struct trace_context *tr_ctx = trace_context(_pipe); 1132 struct pipe_context *pipe = tr_ctx->pipe; 1133 struct pipe_stream_output_target *result; 1134 1135 res = trace_resource_unwrap(tr_ctx, res); 1136 1137 trace_dump_call_begin("pipe_context", "create_stream_output_target"); 1138 1139 trace_dump_arg(ptr, pipe); 1140 trace_dump_arg(ptr, res); 1141 trace_dump_arg(uint, buffer_offset); 1142 trace_dump_arg(uint, buffer_size); 1143 1144 result = pipe->create_stream_output_target(pipe, 1145 res, buffer_offset, buffer_size); 1146 1147 trace_dump_call_end(); 1148 1149 return result; 1150 } 1151 1152 1153 static INLINE void 1154 trace_context_stream_output_target_destroy( 1155 struct pipe_context *_pipe, 1156 struct pipe_stream_output_target *target) 1157 { 1158 struct trace_context *tr_ctx = trace_context(_pipe); 1159 struct pipe_context *pipe = tr_ctx->pipe; 1160 1161 trace_dump_call_begin("pipe_context", "stream_output_target_destroy"); 1162 1163 trace_dump_arg(ptr, pipe); 1164 trace_dump_arg(ptr, target); 1165 1166 pipe->stream_output_target_destroy(pipe, target); 1167 1168 trace_dump_call_end(); 1169 } 1170 1171 1172 static INLINE void 1173 trace_context_set_stream_output_targets(struct pipe_context *_pipe, 1174 unsigned num_targets, 1175 struct pipe_stream_output_target **tgs, 1176 unsigned append_bitmask) 1177 { 1178 struct trace_context *tr_ctx = trace_context(_pipe); 1179 struct pipe_context *pipe = tr_ctx->pipe; 1180 1181 trace_dump_call_begin("pipe_context", "set_stream_output_targets"); 1182 1183 trace_dump_arg(ptr, pipe); 1184 trace_dump_arg(uint, num_targets); 1185 trace_dump_arg_array(ptr, tgs, num_targets); 1186 trace_dump_arg(uint, append_bitmask); 1187 1188 pipe->set_stream_output_targets(pipe, num_targets, tgs, append_bitmask); 1189 1190 trace_dump_call_end(); 1191 } 1192 1193 1194 static INLINE void 1195 trace_context_resource_copy_region(struct pipe_context *_pipe, 1196 struct pipe_resource *dst, 1197 unsigned dst_level, 1198 unsigned dstx, unsigned dsty, unsigned dstz, 1199 struct pipe_resource *src, 1200 unsigned src_level, 1201 const struct pipe_box *src_box) 1202 { 1203 struct trace_context *tr_ctx = trace_context(_pipe); 1204 struct pipe_context *pipe = tr_ctx->pipe; 1205 1206 dst = trace_resource_unwrap(tr_ctx, dst); 1207 src = trace_resource_unwrap(tr_ctx, src); 1208 1209 trace_dump_call_begin("pipe_context", "resource_copy_region"); 1210 1211 trace_dump_arg(ptr, pipe); 1212 trace_dump_arg(ptr, dst); 1213 trace_dump_arg(uint, dst_level); 1214 trace_dump_arg(uint, dstx); 1215 trace_dump_arg(uint, dsty); 1216 trace_dump_arg(uint, dstz); 1217 trace_dump_arg(ptr, src); 1218 trace_dump_arg(uint, src_level); 1219 trace_dump_arg(box, src_box); 1220 1221 pipe->resource_copy_region(pipe, 1222 dst, dst_level, dstx, dsty, dstz, 1223 src, src_level, src_box); 1224 1225 trace_dump_call_end(); 1226 } 1227 1228 1229 static INLINE void 1230 trace_context_clear(struct pipe_context *_pipe, 1231 unsigned buffers, 1232 const union pipe_color_union *color, 1233 double depth, 1234 unsigned stencil) 1235 { 1236 struct trace_context *tr_ctx = trace_context(_pipe); 1237 struct pipe_context *pipe = tr_ctx->pipe; 1238 1239 trace_dump_call_begin("pipe_context", "clear"); 1240 1241 trace_dump_arg(ptr, pipe); 1242 trace_dump_arg(uint, buffers); 1243 trace_dump_arg_begin("color"); 1244 if (color) 1245 trace_dump_array(float, color->f, 4); 1246 else 1247 trace_dump_null(); 1248 trace_dump_arg_end(); 1249 trace_dump_arg(float, depth); 1250 trace_dump_arg(uint, stencil); 1251 1252 pipe->clear(pipe, buffers, color, depth, stencil); 1253 1254 trace_dump_call_end(); 1255 } 1256 1257 1258 static INLINE void 1259 trace_context_clear_render_target(struct pipe_context *_pipe, 1260 struct pipe_surface *dst, 1261 const union pipe_color_union *color, 1262 unsigned dstx, unsigned dsty, 1263 unsigned width, unsigned height) 1264 { 1265 struct trace_context *tr_ctx = trace_context(_pipe); 1266 struct pipe_context *pipe = tr_ctx->pipe; 1267 1268 dst = trace_surface_unwrap(tr_ctx, dst); 1269 1270 trace_dump_call_begin("pipe_context", "clear_render_target"); 1271 1272 trace_dump_arg(ptr, pipe); 1273 trace_dump_arg(ptr, dst); 1274 trace_dump_arg_array(float, color->f, 4); 1275 trace_dump_arg(uint, dstx); 1276 trace_dump_arg(uint, dsty); 1277 trace_dump_arg(uint, width); 1278 trace_dump_arg(uint, height); 1279 1280 pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height); 1281 1282 trace_dump_call_end(); 1283 } 1284 1285 static INLINE void 1286 trace_context_clear_depth_stencil(struct pipe_context *_pipe, 1287 struct pipe_surface *dst, 1288 unsigned clear_flags, 1289 double depth, 1290 unsigned stencil, 1291 unsigned dstx, unsigned dsty, 1292 unsigned width, unsigned height) 1293 { 1294 struct trace_context *tr_ctx = trace_context(_pipe); 1295 struct pipe_context *pipe = tr_ctx->pipe; 1296 1297 dst = trace_surface_unwrap(tr_ctx, dst); 1298 1299 trace_dump_call_begin("pipe_context", "clear_depth_stencil"); 1300 1301 trace_dump_arg(ptr, pipe); 1302 trace_dump_arg(ptr, dst); 1303 trace_dump_arg(uint, clear_flags); 1304 trace_dump_arg(float, depth); 1305 trace_dump_arg(uint, stencil); 1306 trace_dump_arg(uint, dstx); 1307 trace_dump_arg(uint, dsty); 1308 trace_dump_arg(uint, width); 1309 trace_dump_arg(uint, height); 1310 1311 pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil, 1312 dstx, dsty, width, height); 1313 1314 trace_dump_call_end(); 1315 } 1316 1317 static INLINE void 1318 trace_context_flush(struct pipe_context *_pipe, 1319 struct pipe_fence_handle **fence) 1320 { 1321 struct trace_context *tr_ctx = trace_context(_pipe); 1322 struct pipe_context *pipe = tr_ctx->pipe; 1323 1324 trace_dump_call_begin("pipe_context", "flush"); 1325 1326 trace_dump_arg(ptr, pipe); 1327 1328 pipe->flush(pipe, fence); 1329 1330 if(fence) 1331 trace_dump_ret(ptr, *fence); 1332 1333 trace_dump_call_end(); 1334 } 1335 1336 1337 static INLINE void 1338 trace_context_destroy(struct pipe_context *_pipe) 1339 { 1340 struct trace_context *tr_ctx = trace_context(_pipe); 1341 struct pipe_context *pipe = tr_ctx->pipe; 1342 1343 trace_dump_call_begin("pipe_context", "destroy"); 1344 trace_dump_arg(ptr, pipe); 1345 trace_dump_call_end(); 1346 1347 pipe->destroy(pipe); 1348 1349 FREE(tr_ctx); 1350 } 1351 1352 1353 /******************************************************************** 1354 * transfer 1355 */ 1356 1357 1358 static struct pipe_transfer * 1359 trace_context_get_transfer(struct pipe_context *_context, 1360 struct pipe_resource *_resource, 1361 unsigned level, 1362 unsigned usage, 1363 const struct pipe_box *box) 1364 { 1365 struct trace_context *tr_context = trace_context(_context); 1366 struct trace_resource *tr_res = trace_resource(_resource); 1367 struct pipe_context *context = tr_context->pipe; 1368 struct pipe_resource *texture = tr_res->resource; 1369 struct pipe_transfer *result = NULL; 1370 1371 assert(texture->screen == context->screen); 1372 1373 /* 1374 * Map and transfers can't be serialized so we convert all write transfers 1375 * to transfer_inline_write and ignore read transfers. 1376 */ 1377 1378 result = context->get_transfer(context, texture, level, usage, box); 1379 1380 if (result) 1381 result = trace_transfer_create(tr_context, tr_res, result); 1382 1383 return result; 1384 } 1385 1386 1387 static void 1388 trace_context_transfer_destroy(struct pipe_context *_context, 1389 struct pipe_transfer *_transfer) 1390 { 1391 struct trace_context *tr_context = trace_context(_context); 1392 struct trace_transfer *tr_trans = trace_transfer(_transfer); 1393 1394 trace_transfer_destroy(tr_context, tr_trans); 1395 } 1396 1397 1398 static void * 1399 trace_context_transfer_map(struct pipe_context *_context, 1400 struct pipe_transfer *_transfer) 1401 { 1402 struct trace_context *tr_context = trace_context(_context); 1403 struct trace_transfer *tr_trans = trace_transfer(_transfer); 1404 struct pipe_context *context = tr_context->pipe; 1405 struct pipe_transfer *transfer = tr_trans->transfer; 1406 void *map; 1407 1408 map = context->transfer_map(context, transfer); 1409 if(map) { 1410 if(transfer->usage & PIPE_TRANSFER_WRITE) { 1411 assert(!tr_trans->map); 1412 tr_trans->map = map; 1413 } 1414 } 1415 1416 return map; 1417 } 1418 1419 1420 static void 1421 trace_context_transfer_flush_region( struct pipe_context *_context, 1422 struct pipe_transfer *_transfer, 1423 const struct pipe_box *box) 1424 { 1425 struct trace_context *tr_context = trace_context(_context); 1426 struct trace_transfer *tr_transfer = trace_transfer(_transfer); 1427 struct pipe_context *context = tr_context->pipe; 1428 struct pipe_transfer *transfer = tr_transfer->transfer; 1429 1430 context->transfer_flush_region(context, 1431 transfer, 1432 box); 1433 } 1434 1435 static void 1436 trace_context_transfer_unmap(struct pipe_context *_context, 1437 struct pipe_transfer *_transfer) 1438 { 1439 struct trace_context *tr_ctx = trace_context(_context); 1440 struct trace_transfer *tr_trans = trace_transfer(_transfer); 1441 struct pipe_context *context = tr_ctx->pipe; 1442 struct pipe_transfer *transfer = tr_trans->transfer; 1443 1444 if(tr_trans->map) { 1445 /* 1446 * Fake a transfer_inline_write 1447 */ 1448 1449 struct pipe_resource *resource = transfer->resource; 1450 unsigned level = transfer->level; 1451 unsigned usage = transfer->usage; 1452 const struct pipe_box *box = &transfer->box; 1453 unsigned stride = transfer->stride; 1454 unsigned layer_stride = transfer->layer_stride; 1455 1456 trace_dump_call_begin("pipe_context", "transfer_inline_write"); 1457 1458 trace_dump_arg(ptr, context); 1459 trace_dump_arg(ptr, resource); 1460 trace_dump_arg(uint, level); 1461 trace_dump_arg(uint, usage); 1462 trace_dump_arg(box, box); 1463 1464 trace_dump_arg_begin("data"); 1465 trace_dump_box_bytes(tr_trans->map, 1466 resource->format, 1467 box, 1468 stride, 1469 layer_stride); 1470 trace_dump_arg_end(); 1471 1472 trace_dump_arg(uint, stride); 1473 trace_dump_arg(uint, layer_stride); 1474 1475 trace_dump_call_end(); 1476 1477 tr_trans->map = NULL; 1478 } 1479 1480 context->transfer_unmap(context, transfer); 1481 } 1482 1483 1484 static void 1485 trace_context_transfer_inline_write(struct pipe_context *_context, 1486 struct pipe_resource *_resource, 1487 unsigned level, 1488 unsigned usage, 1489 const struct pipe_box *box, 1490 const void *data, 1491 unsigned stride, 1492 unsigned layer_stride) 1493 { 1494 struct trace_context *tr_context = trace_context(_context); 1495 struct trace_resource *tr_res = trace_resource(_resource); 1496 struct pipe_context *context = tr_context->pipe; 1497 struct pipe_resource *resource = tr_res->resource; 1498 1499 assert(resource->screen == context->screen); 1500 1501 trace_dump_call_begin("pipe_context", "transfer_inline_write"); 1502 1503 trace_dump_arg(ptr, context); 1504 trace_dump_arg(ptr, resource); 1505 trace_dump_arg(uint, level); 1506 trace_dump_arg(uint, usage); 1507 trace_dump_arg(box, box); 1508 1509 trace_dump_arg_begin("data"); 1510 trace_dump_box_bytes(data, 1511 resource->format, 1512 box, 1513 stride, 1514 layer_stride); 1515 trace_dump_arg_end(); 1516 1517 trace_dump_arg(uint, stride); 1518 trace_dump_arg(uint, layer_stride); 1519 1520 trace_dump_call_end(); 1521 1522 context->transfer_inline_write(context, resource, 1523 level, usage, box, data, stride, layer_stride); 1524 } 1525 1526 1527 static void trace_context_render_condition(struct pipe_context *_context, 1528 struct pipe_query *query, 1529 uint mode) 1530 { 1531 struct trace_context *tr_context = trace_context(_context); 1532 struct pipe_context *context = tr_context->pipe; 1533 1534 trace_dump_call_begin("pipe_context", "render_condition"); 1535 1536 trace_dump_arg(ptr, context); 1537 trace_dump_arg(ptr, query); 1538 trace_dump_arg(uint, mode); 1539 1540 trace_dump_call_end(); 1541 1542 context->render_condition(context, query, mode); 1543 } 1544 1545 1546 static void trace_context_texture_barrier(struct pipe_context *_context) 1547 { 1548 struct trace_context *tr_context = trace_context(_context); 1549 struct pipe_context *context = tr_context->pipe; 1550 1551 trace_dump_call_begin("pipe_context", "texture_barrier"); 1552 1553 trace_dump_arg(ptr, context); 1554 1555 trace_dump_call_end(); 1556 1557 context->texture_barrier(context); 1558 } 1559 1560 1561 static const struct debug_named_value rbug_blocker_flags[] = { 1562 {"before", 1, NULL}, 1563 {"after", 2, NULL}, 1564 DEBUG_NAMED_VALUE_END 1565 }; 1566 1567 struct pipe_context * 1568 trace_context_create(struct trace_screen *tr_scr, 1569 struct pipe_context *pipe) 1570 { 1571 struct trace_context *tr_ctx; 1572 1573 if(!pipe) 1574 goto error1; 1575 1576 if(!trace_enabled()) 1577 goto error1; 1578 1579 tr_ctx = CALLOC_STRUCT(trace_context); 1580 if(!tr_ctx) 1581 goto error1; 1582 1583 tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */ 1584 tr_ctx->base.screen = &tr_scr->base; 1585 1586 tr_ctx->base.destroy = trace_context_destroy; 1587 1588 #define TR_CTX_INIT(_member) \ 1589 tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL 1590 1591 TR_CTX_INIT(draw_vbo); 1592 TR_CTX_INIT(create_query); 1593 TR_CTX_INIT(destroy_query); 1594 TR_CTX_INIT(begin_query); 1595 TR_CTX_INIT(end_query); 1596 TR_CTX_INIT(get_query_result); 1597 TR_CTX_INIT(create_blend_state); 1598 TR_CTX_INIT(bind_blend_state); 1599 TR_CTX_INIT(delete_blend_state); 1600 TR_CTX_INIT(create_sampler_state); 1601 TR_CTX_INIT(bind_fragment_sampler_states); 1602 TR_CTX_INIT(bind_vertex_sampler_states); 1603 TR_CTX_INIT(delete_sampler_state); 1604 TR_CTX_INIT(create_rasterizer_state); 1605 TR_CTX_INIT(bind_rasterizer_state); 1606 TR_CTX_INIT(delete_rasterizer_state); 1607 TR_CTX_INIT(create_depth_stencil_alpha_state); 1608 TR_CTX_INIT(bind_depth_stencil_alpha_state); 1609 TR_CTX_INIT(delete_depth_stencil_alpha_state); 1610 TR_CTX_INIT(create_fs_state); 1611 TR_CTX_INIT(bind_fs_state); 1612 TR_CTX_INIT(delete_fs_state); 1613 TR_CTX_INIT(create_vs_state); 1614 TR_CTX_INIT(bind_vs_state); 1615 TR_CTX_INIT(delete_vs_state); 1616 TR_CTX_INIT(create_vertex_elements_state); 1617 TR_CTX_INIT(bind_vertex_elements_state); 1618 TR_CTX_INIT(delete_vertex_elements_state); 1619 TR_CTX_INIT(set_blend_color); 1620 TR_CTX_INIT(set_stencil_ref); 1621 TR_CTX_INIT(set_clip_state); 1622 TR_CTX_INIT(set_sample_mask); 1623 TR_CTX_INIT(set_constant_buffer); 1624 TR_CTX_INIT(set_framebuffer_state); 1625 TR_CTX_INIT(set_polygon_stipple); 1626 TR_CTX_INIT(set_scissor_state); 1627 TR_CTX_INIT(set_viewport_state); 1628 TR_CTX_INIT(set_fragment_sampler_views); 1629 TR_CTX_INIT(set_vertex_sampler_views); 1630 TR_CTX_INIT(create_sampler_view); 1631 TR_CTX_INIT(sampler_view_destroy); 1632 TR_CTX_INIT(create_surface); 1633 TR_CTX_INIT(surface_destroy); 1634 TR_CTX_INIT(set_vertex_buffers); 1635 TR_CTX_INIT(set_index_buffer); 1636 TR_CTX_INIT(create_stream_output_target); 1637 TR_CTX_INIT(stream_output_target_destroy); 1638 TR_CTX_INIT(set_stream_output_targets); 1639 TR_CTX_INIT(resource_copy_region); 1640 TR_CTX_INIT(clear); 1641 TR_CTX_INIT(clear_render_target); 1642 TR_CTX_INIT(clear_depth_stencil); 1643 TR_CTX_INIT(flush); 1644 TR_CTX_INIT(render_condition); 1645 TR_CTX_INIT(texture_barrier); 1646 1647 TR_CTX_INIT(get_transfer); 1648 TR_CTX_INIT(transfer_destroy); 1649 TR_CTX_INIT(transfer_map); 1650 TR_CTX_INIT(transfer_unmap); 1651 TR_CTX_INIT(transfer_flush_region); 1652 TR_CTX_INIT(transfer_inline_write); 1653 1654 #undef TR_CTX_INIT 1655 1656 tr_ctx->pipe = pipe; 1657 1658 return &tr_ctx->base; 1659 1660 error1: 1661 return pipe; 1662 } 1663