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