tr_context.c revision 3ce4375912c8ea488460e593e07c5bb15b92dca9
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_screen.h" 33 34#include "tr_dump.h" 35#include "tr_dump_state.h" 36#include "tr_state.h" 37#include "tr_buffer.h" 38#include "tr_screen.h" 39#include "tr_texture.h" 40 41 42static INLINE struct pipe_buffer * 43trace_buffer_unwrap(struct trace_context *tr_ctx, 44 struct pipe_buffer *buffer) 45{ 46 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); 47 struct trace_buffer *tr_buf; 48 49 if(!buffer) 50 return NULL; 51 52 tr_buf = trace_buffer(buffer); 53 54 assert(tr_buf->buffer); 55 assert(tr_buf->buffer->screen == tr_scr->screen); 56 (void) tr_scr; 57 return tr_buf->buffer; 58} 59 60 61static INLINE struct pipe_texture * 62trace_texture_unwrap(struct trace_context *tr_ctx, 63 struct pipe_texture *texture) 64{ 65 struct trace_texture *tr_tex; 66 67 if(!texture) 68 return NULL; 69 70 tr_tex = trace_texture(texture); 71 72 assert(tr_tex->texture); 73 return tr_tex->texture; 74} 75 76 77static INLINE struct pipe_surface * 78trace_surface_unwrap(struct trace_context *tr_ctx, 79 struct pipe_surface *surface) 80{ 81 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); 82 struct trace_surface *tr_surf; 83 84 if(!surface) 85 return NULL; 86 87 assert(surface->texture); 88 if(!surface->texture) 89 return surface; 90 91 tr_surf = trace_surface(surface); 92 93 assert(tr_surf->surface); 94 assert(tr_surf->surface->texture->screen == tr_scr->screen); 95 (void) tr_scr; 96 return tr_surf->surface; 97} 98 99 100static INLINE void 101trace_context_draw_block(struct trace_context *tr_ctx, int flag) 102{ 103 int k; 104 105 pipe_mutex_lock(tr_ctx->draw_mutex); 106 107 if (tr_ctx->draw_blocker & flag) { 108 tr_ctx->draw_blocked |= flag; 109 } else if ((tr_ctx->draw_rule.blocker & flag) && 110 (tr_ctx->draw_blocker & 4)) { 111 boolean block = FALSE; 112 debug_printf("%s (%p %p) (%p %p) (%p %u) (%p %u)\n", __FUNCTION__, 113 (void *) tr_ctx->draw_rule.fs, (void *) tr_ctx->curr.fs, 114 (void *) tr_ctx->draw_rule.vs, (void *) tr_ctx->curr.vs, 115 (void *) tr_ctx->draw_rule.surf, 0, 116 (void *) tr_ctx->draw_rule.sampler_view, 0); 117 if (tr_ctx->draw_rule.fs && 118 tr_ctx->draw_rule.fs == tr_ctx->curr.fs) 119 block = TRUE; 120 if (tr_ctx->draw_rule.vs && 121 tr_ctx->draw_rule.vs == tr_ctx->curr.vs) 122 block = TRUE; 123 if (tr_ctx->draw_rule.surf && 124 tr_ctx->draw_rule.surf == tr_ctx->curr.zsbuf) 125 block = TRUE; 126 if (tr_ctx->draw_rule.surf) 127 for (k = 0; k < tr_ctx->curr.nr_cbufs; k++) 128 if (tr_ctx->draw_rule.surf == tr_ctx->curr.cbufs[k]) 129 block = TRUE; 130 if (tr_ctx->draw_rule.sampler_view) { 131 for (k = 0; k < tr_ctx->curr.num_sampler_views; k++) 132 if (tr_ctx->draw_rule.sampler_view == tr_ctx->curr.sampler_views[k]) 133 block = TRUE; 134 for (k = 0; k < tr_ctx->curr.num_vert_sampler_views; k++) { 135 if (tr_ctx->draw_rule.sampler_view == tr_ctx->curr.vert_sampler_views[k]) { 136 block = TRUE; 137 } 138 } 139 } 140 141 if (block) 142 tr_ctx->draw_blocked |= (flag | 4); 143 } 144 145 if (tr_ctx->draw_blocked) 146 trace_rbug_notify_draw_blocked(tr_ctx); 147 148 /* wait for rbug to clear the blocked flag */ 149 while (tr_ctx->draw_blocked & flag) { 150 tr_ctx->draw_blocked |= flag; 151#ifdef PIPE_THREAD_HAVE_CONDVAR 152 pipe_condvar_wait(tr_ctx->draw_cond, tr_ctx->draw_mutex); 153#else 154 pipe_mutex_unlock(tr_ctx->draw_mutex); 155#ifdef PIPE_SUBSYSTEM_WINDOWS_USER 156 Sleep(1); 157#endif 158 pipe_mutex_lock(tr_ctx->draw_mutex); 159#endif 160 } 161 162 pipe_mutex_unlock(tr_ctx->draw_mutex); 163} 164 165static INLINE void 166trace_context_draw_arrays(struct pipe_context *_pipe, 167 unsigned mode, unsigned start, unsigned count) 168{ 169 struct trace_context *tr_ctx = trace_context(_pipe); 170 struct pipe_context *pipe = tr_ctx->pipe; 171 172 if (tr_ctx->curr.fs->disabled || tr_ctx->curr.vs->disabled) 173 return; 174 175 trace_context_draw_block(tr_ctx, 1); 176 177 trace_dump_call_begin("pipe_context", "draw_arrays"); 178 179 trace_dump_arg(ptr, pipe); 180 trace_dump_arg(uint, mode); 181 trace_dump_arg(uint, start); 182 trace_dump_arg(uint, count); 183 184 pipe->draw_arrays(pipe, mode, start, count); 185 186 trace_dump_call_end(); 187 188 trace_context_draw_block(tr_ctx, 2); 189} 190 191 192static INLINE void 193trace_context_draw_elements(struct pipe_context *_pipe, 194 struct pipe_buffer *_indexBuffer, 195 unsigned indexSize, 196 unsigned mode, unsigned start, unsigned count) 197{ 198 struct trace_context *tr_ctx = trace_context(_pipe); 199 struct trace_buffer *tr_buf = trace_buffer(_indexBuffer); 200 struct pipe_context *pipe = tr_ctx->pipe; 201 struct pipe_buffer *indexBuffer = tr_buf->buffer; 202 203 if (tr_ctx->curr.fs->disabled || tr_ctx->curr.vs->disabled) 204 return; 205 206 trace_context_draw_block(tr_ctx, 1); 207 208 trace_screen_user_buffer_update(_pipe->screen, indexBuffer); 209 210 trace_dump_call_begin("pipe_context", "draw_elements"); 211 212 trace_dump_arg(ptr, pipe); 213 trace_dump_arg(ptr, indexBuffer); 214 trace_dump_arg(uint, indexSize); 215 trace_dump_arg(uint, mode); 216 trace_dump_arg(uint, start); 217 trace_dump_arg(uint, count); 218 219 pipe->draw_elements(pipe, indexBuffer, indexSize, mode, start, count); 220 221 trace_dump_call_end(); 222 223 trace_context_draw_block(tr_ctx, 2); 224} 225 226 227static INLINE void 228trace_context_draw_range_elements(struct pipe_context *_pipe, 229 struct pipe_buffer *_indexBuffer, 230 unsigned indexSize, 231 unsigned minIndex, 232 unsigned maxIndex, 233 unsigned mode, 234 unsigned start, 235 unsigned count) 236{ 237 struct trace_context *tr_ctx = trace_context(_pipe); 238 struct trace_buffer *tr_buf = trace_buffer(_indexBuffer); 239 struct pipe_context *pipe = tr_ctx->pipe; 240 struct pipe_buffer *indexBuffer = tr_buf->buffer; 241 242 if (tr_ctx->curr.fs->disabled || tr_ctx->curr.vs->disabled) 243 return; 244 245 trace_context_draw_block(tr_ctx, 1); 246 247 trace_screen_user_buffer_update(_pipe->screen, indexBuffer); 248 249 trace_dump_call_begin("pipe_context", "draw_range_elements"); 250 251 trace_dump_arg(ptr, pipe); 252 trace_dump_arg(ptr, indexBuffer); 253 trace_dump_arg(uint, indexSize); 254 trace_dump_arg(uint, minIndex); 255 trace_dump_arg(uint, maxIndex); 256 trace_dump_arg(uint, mode); 257 trace_dump_arg(uint, start); 258 trace_dump_arg(uint, count); 259 260 pipe->draw_range_elements(pipe, 261 indexBuffer, 262 indexSize, minIndex, maxIndex, 263 mode, start, count); 264 265 trace_dump_call_end(); 266 267 trace_context_draw_block(tr_ctx, 2); 268} 269 270 271static INLINE struct pipe_query * 272trace_context_create_query(struct pipe_context *_pipe, 273 unsigned query_type) 274{ 275 struct trace_context *tr_ctx = trace_context(_pipe); 276 struct pipe_context *pipe = tr_ctx->pipe; 277 struct pipe_query *result; 278 279 trace_dump_call_begin("pipe_context", "create_query"); 280 281 trace_dump_arg(ptr, pipe); 282 trace_dump_arg(uint, query_type); 283 284 result = pipe->create_query(pipe, query_type); 285 286 trace_dump_ret(ptr, result); 287 288 trace_dump_call_end(); 289 290 return result; 291} 292 293 294static INLINE void 295trace_context_destroy_query(struct pipe_context *_pipe, 296 struct pipe_query *query) 297{ 298 struct trace_context *tr_ctx = trace_context(_pipe); 299 struct pipe_context *pipe = tr_ctx->pipe; 300 301 trace_dump_call_begin("pipe_context", "destroy_query"); 302 303 trace_dump_arg(ptr, pipe); 304 trace_dump_arg(ptr, query); 305 306 pipe->destroy_query(pipe, query); 307 308 trace_dump_call_end(); 309} 310 311 312static INLINE void 313trace_context_begin_query(struct pipe_context *_pipe, 314 struct pipe_query *query) 315{ 316 struct trace_context *tr_ctx = trace_context(_pipe); 317 struct pipe_context *pipe = tr_ctx->pipe; 318 319 trace_dump_call_begin("pipe_context", "begin_query"); 320 321 trace_dump_arg(ptr, pipe); 322 trace_dump_arg(ptr, query); 323 324 pipe->begin_query(pipe, query); 325 326 trace_dump_call_end(); 327} 328 329 330static INLINE void 331trace_context_end_query(struct pipe_context *_pipe, 332 struct pipe_query *query) 333{ 334 struct trace_context *tr_ctx = trace_context(_pipe); 335 struct pipe_context *pipe = tr_ctx->pipe; 336 337 trace_dump_call_begin("pipe_context", "end_query"); 338 339 trace_dump_arg(ptr, pipe); 340 trace_dump_arg(ptr, query); 341 342 pipe->end_query(pipe, query); 343 344 trace_dump_call_end(); 345} 346 347 348static INLINE boolean 349trace_context_get_query_result(struct pipe_context *_pipe, 350 struct pipe_query *query, 351 boolean wait, 352 uint64_t *presult) 353{ 354 struct trace_context *tr_ctx = trace_context(_pipe); 355 struct pipe_context *pipe = tr_ctx->pipe; 356 uint64_t result; 357 boolean _result; 358 359 trace_dump_call_begin("pipe_context", "get_query_result"); 360 361 trace_dump_arg(ptr, pipe); 362 363 _result = pipe->get_query_result(pipe, query, wait, presult); 364 result = *presult; 365 366 trace_dump_arg(uint, result); 367 trace_dump_ret(bool, _result); 368 369 trace_dump_call_end(); 370 371 return _result; 372} 373 374 375static INLINE void * 376trace_context_create_blend_state(struct pipe_context *_pipe, 377 const struct pipe_blend_state *state) 378{ 379 struct trace_context *tr_ctx = trace_context(_pipe); 380 struct pipe_context *pipe = tr_ctx->pipe; 381 void * result; 382 383 trace_dump_call_begin("pipe_context", "create_blend_state"); 384 385 trace_dump_arg(ptr, pipe); 386 trace_dump_arg(blend_state, state); 387 388 result = pipe->create_blend_state(pipe, state); 389 390 trace_dump_ret(ptr, result); 391 392 trace_dump_call_end(); 393 394 return result; 395} 396 397 398static INLINE void 399trace_context_bind_blend_state(struct pipe_context *_pipe, 400 void *state) 401{ 402 struct trace_context *tr_ctx = trace_context(_pipe); 403 struct pipe_context *pipe = tr_ctx->pipe; 404 405 trace_dump_call_begin("pipe_context", "bind_blend_state"); 406 407 trace_dump_arg(ptr, pipe); 408 trace_dump_arg(ptr, state); 409 410 pipe->bind_blend_state(pipe, state); 411 412 trace_dump_call_end(); 413} 414 415 416static INLINE void 417trace_context_delete_blend_state(struct pipe_context *_pipe, 418 void *state) 419{ 420 struct trace_context *tr_ctx = trace_context(_pipe); 421 struct pipe_context *pipe = tr_ctx->pipe; 422 423 trace_dump_call_begin("pipe_context", "delete_blend_state"); 424 425 trace_dump_arg(ptr, pipe); 426 trace_dump_arg(ptr, state); 427 428 pipe->delete_blend_state(pipe, state); 429 430 trace_dump_call_end(); 431} 432 433 434static INLINE void * 435trace_context_create_sampler_state(struct pipe_context *_pipe, 436 const struct pipe_sampler_state *state) 437{ 438 struct trace_context *tr_ctx = trace_context(_pipe); 439 struct pipe_context *pipe = tr_ctx->pipe; 440 void * result; 441 442 trace_dump_call_begin("pipe_context", "create_sampler_state"); 443 444 trace_dump_arg(ptr, pipe); 445 trace_dump_arg(sampler_state, state); 446 447 result = pipe->create_sampler_state(pipe, state); 448 449 trace_dump_ret(ptr, result); 450 451 trace_dump_call_end(); 452 453 return result; 454} 455 456 457static INLINE void 458trace_context_bind_fragment_sampler_states(struct pipe_context *_pipe, 459 unsigned num_states, 460 void **states) 461{ 462 struct trace_context *tr_ctx = trace_context(_pipe); 463 struct pipe_context *pipe = tr_ctx->pipe; 464 465 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states"); 466 467 trace_dump_arg(ptr, pipe); 468 trace_dump_arg(uint, num_states); 469 trace_dump_arg_array(ptr, states, num_states); 470 471 pipe->bind_fragment_sampler_states(pipe, num_states, states); 472 473 trace_dump_call_end(); 474} 475 476 477static INLINE void 478trace_context_bind_vertex_sampler_states(struct pipe_context *_pipe, 479 unsigned num_states, 480 void **states) 481{ 482 struct trace_context *tr_ctx = trace_context(_pipe); 483 struct pipe_context *pipe = tr_ctx->pipe; 484 485 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states"); 486 487 trace_dump_arg(ptr, pipe); 488 trace_dump_arg(uint, num_states); 489 trace_dump_arg_array(ptr, states, num_states); 490 491 pipe->bind_vertex_sampler_states(pipe, num_states, states); 492 493 trace_dump_call_end(); 494} 495 496 497static INLINE void 498trace_context_delete_sampler_state(struct pipe_context *_pipe, 499 void *state) 500{ 501 struct trace_context *tr_ctx = trace_context(_pipe); 502 struct pipe_context *pipe = tr_ctx->pipe; 503 504 trace_dump_call_begin("pipe_context", "delete_sampler_state"); 505 506 trace_dump_arg(ptr, pipe); 507 trace_dump_arg(ptr, state); 508 509 pipe->delete_sampler_state(pipe, state); 510 511 trace_dump_call_end(); 512} 513 514 515static INLINE void * 516trace_context_create_rasterizer_state(struct pipe_context *_pipe, 517 const struct pipe_rasterizer_state *state) 518{ 519 struct trace_context *tr_ctx = trace_context(_pipe); 520 struct pipe_context *pipe = tr_ctx->pipe; 521 void * result; 522 523 trace_dump_call_begin("pipe_context", "create_rasterizer_state"); 524 525 trace_dump_arg(ptr, pipe); 526 trace_dump_arg(rasterizer_state, state); 527 528 result = pipe->create_rasterizer_state(pipe, state); 529 530 trace_dump_ret(ptr, result); 531 532 trace_dump_call_end(); 533 534 return result; 535} 536 537 538static INLINE void 539trace_context_bind_rasterizer_state(struct pipe_context *_pipe, 540 void *state) 541{ 542 struct trace_context *tr_ctx = trace_context(_pipe); 543 struct pipe_context *pipe = tr_ctx->pipe; 544 545 trace_dump_call_begin("pipe_context", "bind_rasterizer_state"); 546 547 trace_dump_arg(ptr, pipe); 548 trace_dump_arg(ptr, state); 549 550 pipe->bind_rasterizer_state(pipe, state); 551 552 trace_dump_call_end(); 553} 554 555 556static INLINE void 557trace_context_delete_rasterizer_state(struct pipe_context *_pipe, 558 void *state) 559{ 560 struct trace_context *tr_ctx = trace_context(_pipe); 561 struct pipe_context *pipe = tr_ctx->pipe; 562 563 trace_dump_call_begin("pipe_context", "delete_rasterizer_state"); 564 565 trace_dump_arg(ptr, pipe); 566 trace_dump_arg(ptr, state); 567 568 pipe->delete_rasterizer_state(pipe, state); 569 570 trace_dump_call_end(); 571} 572 573 574static INLINE void * 575trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe, 576 const struct pipe_depth_stencil_alpha_state *state) 577{ 578 struct trace_context *tr_ctx = trace_context(_pipe); 579 struct pipe_context *pipe = tr_ctx->pipe; 580 void * result; 581 582 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state"); 583 584 result = pipe->create_depth_stencil_alpha_state(pipe, state); 585 586 trace_dump_arg(ptr, pipe); 587 trace_dump_arg(depth_stencil_alpha_state, state); 588 589 trace_dump_ret(ptr, result); 590 591 trace_dump_call_end(); 592 593 return result; 594} 595 596 597static INLINE void 598trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe, 599 void *state) 600{ 601 struct trace_context *tr_ctx = trace_context(_pipe); 602 struct pipe_context *pipe = tr_ctx->pipe; 603 604 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state"); 605 606 trace_dump_arg(ptr, pipe); 607 trace_dump_arg(ptr, state); 608 609 pipe->bind_depth_stencil_alpha_state(pipe, state); 610 611 trace_dump_call_end(); 612} 613 614 615static INLINE void 616trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, 617 void *state) 618{ 619 struct trace_context *tr_ctx = trace_context(_pipe); 620 struct pipe_context *pipe = tr_ctx->pipe; 621 622 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state"); 623 624 trace_dump_arg(ptr, pipe); 625 trace_dump_arg(ptr, state); 626 627 pipe->delete_depth_stencil_alpha_state(pipe, state); 628 629 trace_dump_call_end(); 630} 631 632 633static INLINE void * 634trace_context_create_fs_state(struct pipe_context *_pipe, 635 const struct pipe_shader_state *state) 636{ 637 struct trace_context *tr_ctx = trace_context(_pipe); 638 struct pipe_context *pipe = tr_ctx->pipe; 639 void * result; 640 641 trace_dump_call_begin("pipe_context", "create_fs_state"); 642 643 trace_dump_arg(ptr, pipe); 644 trace_dump_arg(shader_state, state); 645 646 result = pipe->create_fs_state(pipe, state); 647 648 trace_dump_ret(ptr, result); 649 650 trace_dump_call_end(); 651 652 result = trace_shader_create(tr_ctx, state, result, TRACE_SHADER_FRAGMENT); 653 654 return result; 655} 656 657 658static INLINE void 659trace_context_bind_fs_state(struct pipe_context *_pipe, 660 void *_state) 661{ 662 struct trace_context *tr_ctx = trace_context(_pipe); 663 struct trace_shader *tr_shdr = trace_shader(_state); 664 struct pipe_context *pipe = tr_ctx->pipe; 665 void *state = tr_shdr ? tr_shdr->state : NULL; 666 667 trace_dump_call_begin("pipe_context", "bind_fs_state"); 668 669 trace_dump_arg(ptr, pipe); 670 trace_dump_arg(ptr, state); 671 672 tr_ctx->curr.fs = tr_shdr; 673 674 if (tr_shdr && tr_shdr->replaced) 675 state = tr_shdr->replaced; 676 677 pipe->bind_fs_state(pipe, state); 678 679 trace_dump_call_end(); 680} 681 682 683static INLINE void 684trace_context_delete_fs_state(struct pipe_context *_pipe, 685 void *_state) 686{ 687 struct trace_context *tr_ctx = trace_context(_pipe); 688 struct trace_shader *tr_shdr = trace_shader(_state); 689 struct pipe_context *pipe = tr_ctx->pipe; 690 void *state = tr_shdr->state; 691 692 trace_dump_call_begin("pipe_context", "delete_fs_state"); 693 694 trace_dump_arg(ptr, pipe); 695 trace_dump_arg(ptr, state); 696 697 pipe->delete_fs_state(pipe, state); 698 699 trace_dump_call_end(); 700 701 trace_shader_destroy(tr_ctx, tr_shdr); 702} 703 704 705static INLINE void * 706trace_context_create_vs_state(struct pipe_context *_pipe, 707 const struct pipe_shader_state *state) 708{ 709 struct trace_context *tr_ctx = trace_context(_pipe); 710 struct pipe_context *pipe = tr_ctx->pipe; 711 void * result; 712 713 trace_dump_call_begin("pipe_context", "create_vs_state"); 714 715 trace_dump_arg(ptr, pipe); 716 trace_dump_arg(shader_state, state); 717 718 result = pipe->create_vs_state(pipe, state); 719 720 trace_dump_ret(ptr, result); 721 722 trace_dump_call_end(); 723 724 result = trace_shader_create(tr_ctx, state, result, TRACE_SHADER_VERTEX); 725 726 return result; 727} 728 729 730static INLINE void 731trace_context_bind_vs_state(struct pipe_context *_pipe, 732 void *_state) 733{ 734 struct trace_context *tr_ctx = trace_context(_pipe); 735 struct trace_shader *tr_shdr = trace_shader(_state); 736 struct pipe_context *pipe = tr_ctx->pipe; 737 void *state = tr_shdr ? tr_shdr->state : NULL; 738 739 trace_dump_call_begin("pipe_context", "bind_vs_state"); 740 741 trace_dump_arg(ptr, pipe); 742 trace_dump_arg(ptr, state); 743 744 tr_ctx->curr.vs = tr_shdr; 745 746 if (tr_shdr && tr_shdr->replaced) 747 state = tr_shdr->replaced; 748 749 pipe->bind_vs_state(pipe, state); 750 751 trace_dump_call_end(); 752} 753 754 755static INLINE void 756trace_context_delete_vs_state(struct pipe_context *_pipe, 757 void *_state) 758{ 759 struct trace_context *tr_ctx = trace_context(_pipe); 760 struct trace_shader *tr_shdr = trace_shader(_state); 761 struct pipe_context *pipe = tr_ctx->pipe; 762 void *state = tr_shdr->state; 763 764 trace_dump_call_begin("pipe_context", "delete_vs_state"); 765 766 trace_dump_arg(ptr, pipe); 767 trace_dump_arg(ptr, state); 768 769 pipe->delete_vs_state(pipe, state); 770 771 trace_dump_call_end(); 772 773 trace_shader_destroy(tr_ctx, tr_shdr); 774} 775 776 777static INLINE void * 778trace_context_create_vertex_elements_state(struct pipe_context *_pipe, 779 unsigned num_elements, 780 const struct pipe_vertex_element *elements) 781{ 782 struct trace_context *tr_ctx = trace_context(_pipe); 783 struct pipe_context *pipe = tr_ctx->pipe; 784 void * result; 785 786 trace_dump_call_begin("pipe_context", "create_vertex_elements_state"); 787 788 trace_dump_arg(ptr, pipe); 789 trace_dump_arg(uint, num_elements); 790 791 trace_dump_arg_begin("elements"); 792 trace_dump_struct_array(vertex_element, elements, num_elements); 793 trace_dump_arg_end(); 794 795 result = pipe->create_vertex_elements_state(pipe, num_elements, elements); 796 797 trace_dump_ret(ptr, result); 798 799 trace_dump_call_end(); 800 801 return result; 802} 803 804 805static INLINE void 806trace_context_bind_vertex_elements_state(struct pipe_context *_pipe, 807 void *state) 808{ 809 struct trace_context *tr_ctx = trace_context(_pipe); 810 struct pipe_context *pipe = tr_ctx->pipe; 811 812 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state"); 813 814 trace_dump_arg(ptr, pipe); 815 trace_dump_arg(ptr, state); 816 817 pipe->bind_vertex_elements_state(pipe, state); 818 819 trace_dump_call_end(); 820} 821 822 823static INLINE void 824trace_context_delete_vertex_elements_state(struct pipe_context *_pipe, 825 void *state) 826{ 827 struct trace_context *tr_ctx = trace_context(_pipe); 828 struct pipe_context *pipe = tr_ctx->pipe; 829 830 trace_dump_call_begin("pipe_context", "delete_verte_elements_state"); 831 832 trace_dump_arg(ptr, pipe); 833 trace_dump_arg(ptr, state); 834 835 pipe->delete_vertex_elements_state(pipe, state); 836 837 trace_dump_call_end(); 838} 839 840 841static INLINE void 842trace_context_set_blend_color(struct pipe_context *_pipe, 843 const struct pipe_blend_color *state) 844{ 845 struct trace_context *tr_ctx = trace_context(_pipe); 846 struct pipe_context *pipe = tr_ctx->pipe; 847 848 trace_dump_call_begin("pipe_context", "set_blend_color"); 849 850 trace_dump_arg(ptr, pipe); 851 trace_dump_arg(blend_color, state); 852 853 pipe->set_blend_color(pipe, state); 854 855 trace_dump_call_end(); 856} 857 858 859static INLINE void 860trace_context_set_stencil_ref(struct pipe_context *_pipe, 861 const struct pipe_stencil_ref *state) 862{ 863 struct trace_context *tr_ctx = trace_context(_pipe); 864 struct pipe_context *pipe = tr_ctx->pipe; 865 866 trace_dump_call_begin("pipe_context", "set_stencil_ref"); 867 868 trace_dump_arg(ptr, pipe); 869 trace_dump_arg(stencil_ref, state); 870 871 pipe->set_stencil_ref(pipe, state); 872 873 trace_dump_call_end(); 874} 875 876 877static INLINE void 878trace_context_set_clip_state(struct pipe_context *_pipe, 879 const struct pipe_clip_state *state) 880{ 881 struct trace_context *tr_ctx = trace_context(_pipe); 882 struct pipe_context *pipe = tr_ctx->pipe; 883 884 trace_dump_call_begin("pipe_context", "set_clip_state"); 885 886 trace_dump_arg(ptr, pipe); 887 trace_dump_arg(clip_state, state); 888 889 pipe->set_clip_state(pipe, state); 890 891 trace_dump_call_end(); 892} 893 894 895static INLINE void 896trace_context_set_constant_buffer(struct pipe_context *_pipe, 897 uint shader, uint index, 898 struct pipe_buffer *buffer) 899{ 900 struct trace_context *tr_ctx = trace_context(_pipe); 901 struct pipe_context *pipe = tr_ctx->pipe; 902 903 if (buffer) { 904 trace_screen_user_buffer_update(_pipe->screen, buffer); 905 buffer = trace_buffer_unwrap(tr_ctx, buffer); 906 } 907 908 trace_dump_call_begin("pipe_context", "set_constant_buffer"); 909 910 trace_dump_arg(ptr, pipe); 911 trace_dump_arg(uint, shader); 912 trace_dump_arg(uint, index); 913 trace_dump_arg(ptr, buffer); 914 915 pipe->set_constant_buffer(pipe, shader, index, buffer); 916 917 trace_dump_call_end(); 918} 919 920 921static INLINE void 922trace_context_set_framebuffer_state(struct pipe_context *_pipe, 923 const struct pipe_framebuffer_state *state) 924{ 925 struct trace_context *tr_ctx = trace_context(_pipe); 926 struct pipe_context *pipe = tr_ctx->pipe; 927 struct pipe_framebuffer_state unwrapped_state; 928 unsigned i; 929 930 { 931 tr_ctx->curr.nr_cbufs = state->nr_cbufs; 932 for (i = 0; i < state->nr_cbufs; i++) 933 if (state->cbufs[i]) 934 tr_ctx->curr.cbufs[i] = trace_texture(state->cbufs[i]->texture); 935 else 936 tr_ctx->curr.cbufs[i] = NULL; 937 if (state->zsbuf) 938 tr_ctx->curr.zsbuf = trace_texture(state->zsbuf->texture); 939 else 940 tr_ctx->curr.zsbuf = NULL; 941 } 942 943 /* Unwrap the input state */ 944 memcpy(&unwrapped_state, state, sizeof(unwrapped_state)); 945 for(i = 0; i < state->nr_cbufs; ++i) 946 unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]); 947 for(i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i) 948 unwrapped_state.cbufs[i] = NULL; 949 unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf); 950 state = &unwrapped_state; 951 952 trace_dump_call_begin("pipe_context", "set_framebuffer_state"); 953 954 trace_dump_arg(ptr, pipe); 955 trace_dump_arg(framebuffer_state, state); 956 957 pipe->set_framebuffer_state(pipe, state); 958 959 trace_dump_call_end(); 960} 961 962 963static INLINE void 964trace_context_set_polygon_stipple(struct pipe_context *_pipe, 965 const struct pipe_poly_stipple *state) 966{ 967 struct trace_context *tr_ctx = trace_context(_pipe); 968 struct pipe_context *pipe = tr_ctx->pipe; 969 970 trace_dump_call_begin("pipe_context", "set_polygon_stipple"); 971 972 trace_dump_arg(ptr, pipe); 973 trace_dump_arg(poly_stipple, state); 974 975 pipe->set_polygon_stipple(pipe, state); 976 977 trace_dump_call_end(); 978} 979 980 981static INLINE void 982trace_context_set_scissor_state(struct pipe_context *_pipe, 983 const struct pipe_scissor_state *state) 984{ 985 struct trace_context *tr_ctx = trace_context(_pipe); 986 struct pipe_context *pipe = tr_ctx->pipe; 987 988 trace_dump_call_begin("pipe_context", "set_scissor_state"); 989 990 trace_dump_arg(ptr, pipe); 991 trace_dump_arg(scissor_state, state); 992 993 pipe->set_scissor_state(pipe, state); 994 995 trace_dump_call_end(); 996} 997 998 999static INLINE void 1000trace_context_set_viewport_state(struct pipe_context *_pipe, 1001 const struct pipe_viewport_state *state) 1002{ 1003 struct trace_context *tr_ctx = trace_context(_pipe); 1004 struct pipe_context *pipe = tr_ctx->pipe; 1005 1006 trace_dump_call_begin("pipe_context", "set_viewport_state"); 1007 1008 trace_dump_arg(ptr, pipe); 1009 trace_dump_arg(viewport_state, state); 1010 1011 pipe->set_viewport_state(pipe, state); 1012 1013 trace_dump_call_end(); 1014} 1015 1016 1017static struct pipe_sampler_view * 1018trace_create_sampler_view(struct pipe_context *_pipe, 1019 struct pipe_texture *_texture, 1020 const struct pipe_sampler_view *templ) 1021{ 1022 struct trace_context *tr_ctx = trace_context(_pipe); 1023 struct trace_texture *tr_tex = trace_texture(_texture); 1024 struct pipe_context *pipe = tr_ctx->pipe; 1025 struct pipe_texture *texture = tr_tex->texture; 1026 struct trace_sampler_view *result = CALLOC_STRUCT(trace_sampler_view); 1027 1028 trace_dump_call_begin("pipe_context", "create_sampler_view"); 1029 1030 trace_dump_arg(ptr, pipe); 1031 trace_dump_arg(ptr, texture); 1032 trace_dump_arg(ptr, templ); 1033 1034 result->sampler_view = pipe->create_sampler_view(pipe, texture, templ); 1035 1036 result->base = *templ; 1037 result->base.reference.count = 1; 1038 result->base.texture = NULL; 1039 pipe_texture_reference(&result->base.texture, _texture); 1040 result->base.context = _pipe; 1041 1042 trace_dump_ret(ptr, result); 1043 1044 trace_dump_call_end(); 1045 1046 return &result->base; 1047} 1048 1049 1050static void 1051trace_sampler_view_destroy(struct pipe_context *_pipe, 1052 struct pipe_sampler_view *_view) 1053{ 1054 struct trace_context *tr_ctx = trace_context(_pipe); 1055 struct trace_sampler_view *tr_view = trace_sampler_view(_view); 1056 struct pipe_context *pipe = tr_ctx->pipe; 1057 struct pipe_sampler_view *view = tr_view->sampler_view; 1058 1059 trace_dump_call_begin("pipe_context", "sampler_view_destroy"); 1060 1061 trace_dump_arg(ptr, pipe); 1062 trace_dump_arg(ptr, view); 1063 1064 pipe->sampler_view_destroy(pipe, view); 1065 1066 trace_dump_call_end(); 1067 1068 pipe_texture_reference(&_view->texture, NULL); 1069 FREE(_view); 1070} 1071 1072 1073static INLINE void 1074trace_context_set_fragment_sampler_views(struct pipe_context *_pipe, 1075 unsigned num, 1076 struct pipe_sampler_view **views) 1077{ 1078 struct trace_context *tr_ctx = trace_context(_pipe); 1079 struct trace_sampler_view *tr_view; 1080 struct pipe_context *pipe = tr_ctx->pipe; 1081 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS]; 1082 unsigned i; 1083 1084 tr_ctx->curr.num_sampler_views = num; 1085 for(i = 0; i < num; ++i) { 1086 tr_view = trace_sampler_view(views[i]); 1087 tr_ctx->curr.sampler_views[i] = tr_view; 1088 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL; 1089 } 1090 views = unwrapped_views; 1091 1092 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views"); 1093 1094 trace_dump_arg(ptr, pipe); 1095 trace_dump_arg(uint, num); 1096 trace_dump_arg_array(ptr, views, num); 1097 1098 pipe->set_fragment_sampler_views(pipe, num, views); 1099 1100 trace_dump_call_end(); 1101} 1102 1103 1104static INLINE void 1105trace_context_set_vertex_sampler_views(struct pipe_context *_pipe, 1106 unsigned num, 1107 struct pipe_sampler_view **views) 1108{ 1109 struct trace_context *tr_ctx = trace_context(_pipe); 1110 struct trace_sampler_view *tr_view; 1111 struct pipe_context *pipe = tr_ctx->pipe; 1112 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS]; 1113 unsigned i; 1114 1115 tr_ctx->curr.num_vert_sampler_views = num; 1116 for(i = 0; i < num; ++i) { 1117 tr_view = trace_sampler_view(views[i]); 1118 tr_ctx->curr.vert_sampler_views[i] = tr_view; 1119 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL; 1120 } 1121 views = unwrapped_views; 1122 1123 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views"); 1124 1125 trace_dump_arg(ptr, pipe); 1126 trace_dump_arg(uint, num); 1127 trace_dump_arg_array(ptr, views, num); 1128 1129 pipe->set_vertex_sampler_views(pipe, num, views); 1130 1131 trace_dump_call_end(); 1132} 1133 1134 1135static INLINE void 1136trace_context_set_vertex_buffers(struct pipe_context *_pipe, 1137 unsigned num_buffers, 1138 const struct pipe_vertex_buffer *buffers) 1139{ 1140 struct trace_context *tr_ctx = trace_context(_pipe); 1141 struct pipe_context *pipe = tr_ctx->pipe; 1142 unsigned i; 1143 1144 for(i = 0; i < num_buffers; ++i) 1145 trace_screen_user_buffer_update(_pipe->screen, buffers[i].buffer); 1146 1147 trace_dump_call_begin("pipe_context", "set_vertex_buffers"); 1148 1149 trace_dump_arg(ptr, pipe); 1150 trace_dump_arg(uint, num_buffers); 1151 1152 trace_dump_arg_begin("buffers"); 1153 trace_dump_struct_array(vertex_buffer, buffers, num_buffers); 1154 trace_dump_arg_end(); 1155 1156 if (num_buffers) { 1157 struct pipe_vertex_buffer *_buffers = malloc(num_buffers * sizeof(*_buffers)); 1158 memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers)); 1159 for (i = 0; i < num_buffers; i++) 1160 _buffers[i].buffer = trace_buffer_unwrap(tr_ctx, buffers[i].buffer); 1161 pipe->set_vertex_buffers(pipe, num_buffers, _buffers); 1162 free(_buffers); 1163 } else { 1164 pipe->set_vertex_buffers(pipe, num_buffers, NULL); 1165 } 1166 1167 trace_dump_call_end(); 1168} 1169 1170 1171static INLINE void 1172trace_context_surface_copy(struct pipe_context *_pipe, 1173 struct pipe_surface *dest, 1174 unsigned destx, unsigned desty, 1175 struct pipe_surface *src, 1176 unsigned srcx, unsigned srcy, 1177 unsigned width, unsigned height) 1178{ 1179 struct trace_context *tr_ctx = trace_context(_pipe); 1180 struct pipe_context *pipe = tr_ctx->pipe; 1181 1182 dest = trace_surface_unwrap(tr_ctx, dest); 1183 src = trace_surface_unwrap(tr_ctx, src); 1184 1185 trace_dump_call_begin("pipe_context", "surface_copy"); 1186 1187 trace_dump_arg(ptr, pipe); 1188 trace_dump_arg(ptr, dest); 1189 trace_dump_arg(uint, destx); 1190 trace_dump_arg(uint, desty); 1191 trace_dump_arg(ptr, src); 1192 trace_dump_arg(uint, srcx); 1193 trace_dump_arg(uint, srcy); 1194 trace_dump_arg(uint, width); 1195 trace_dump_arg(uint, height); 1196 1197 pipe->surface_copy(pipe, 1198 dest, destx, desty, 1199 src, srcx, srcy, width, height); 1200 1201 trace_dump_call_end(); 1202} 1203 1204 1205static INLINE void 1206trace_context_surface_fill(struct pipe_context *_pipe, 1207 struct pipe_surface *dst, 1208 unsigned dstx, unsigned dsty, 1209 unsigned width, unsigned height, 1210 unsigned value) 1211{ 1212 struct trace_context *tr_ctx = trace_context(_pipe); 1213 struct pipe_context *pipe = tr_ctx->pipe; 1214 1215 dst = trace_surface_unwrap(tr_ctx, dst); 1216 1217 trace_dump_call_begin("pipe_context", "surface_fill"); 1218 1219 trace_dump_arg(ptr, pipe); 1220 trace_dump_arg(ptr, dst); 1221 trace_dump_arg(uint, dstx); 1222 trace_dump_arg(uint, dsty); 1223 trace_dump_arg(uint, width); 1224 trace_dump_arg(uint, height); 1225 1226 pipe->surface_fill(pipe, dst, dstx, dsty, width, height, value); 1227 1228 trace_dump_call_end(); 1229} 1230 1231 1232static INLINE void 1233trace_context_clear(struct pipe_context *_pipe, 1234 unsigned buffers, 1235 const float *rgba, 1236 double depth, 1237 unsigned stencil) 1238{ 1239 struct trace_context *tr_ctx = trace_context(_pipe); 1240 struct pipe_context *pipe = tr_ctx->pipe; 1241 1242 trace_dump_call_begin("pipe_context", "clear"); 1243 1244 trace_dump_arg(ptr, pipe); 1245 trace_dump_arg(uint, buffers); 1246 trace_dump_arg_array(float, rgba, 4); 1247 trace_dump_arg(float, depth); 1248 trace_dump_arg(uint, stencil); 1249 1250 pipe->clear(pipe, buffers, rgba, depth, stencil); 1251 1252 trace_dump_call_end(); 1253} 1254 1255 1256static INLINE void 1257trace_context_flush(struct pipe_context *_pipe, 1258 unsigned flags, 1259 struct pipe_fence_handle **fence) 1260{ 1261 struct trace_context *tr_ctx = trace_context(_pipe); 1262 struct pipe_context *pipe = tr_ctx->pipe; 1263 1264 trace_dump_call_begin("pipe_context", "flush"); 1265 1266 trace_dump_arg(ptr, pipe); 1267 trace_dump_arg(uint, flags); 1268 1269 pipe->flush(pipe, flags, fence); 1270 1271 if(fence) 1272 trace_dump_ret(ptr, *fence); 1273 1274 trace_dump_call_end(); 1275} 1276 1277 1278static INLINE void 1279trace_context_destroy(struct pipe_context *_pipe) 1280{ 1281 struct trace_screen *tr_scr = trace_screen(_pipe->screen); 1282 struct trace_context *tr_ctx = trace_context(_pipe); 1283 struct pipe_context *pipe = tr_ctx->pipe; 1284 1285 trace_dump_call_begin("pipe_context", "destroy"); 1286 trace_dump_arg(ptr, pipe); 1287 trace_dump_call_end(); 1288 1289 trace_screen_remove_from_list(tr_scr, contexts, tr_ctx); 1290 1291 pipe->destroy(pipe); 1292 1293 FREE(tr_ctx); 1294} 1295 1296static unsigned int 1297trace_is_texture_referenced( struct pipe_context *_pipe, 1298 struct pipe_texture *_texture, 1299 unsigned face, unsigned level) 1300{ 1301 struct trace_context *tr_ctx = trace_context(_pipe); 1302 struct trace_texture *tr_tex = trace_texture(_texture); 1303 struct pipe_context *pipe = tr_ctx->pipe; 1304 struct pipe_texture *texture = tr_tex->texture; 1305 unsigned int referenced; 1306 1307 trace_dump_call_begin("pipe_context", "is_texture_referenced"); 1308 trace_dump_arg(ptr, pipe); 1309 trace_dump_arg(ptr, texture); 1310 trace_dump_arg(uint, face); 1311 trace_dump_arg(uint, level); 1312 1313 referenced = pipe->is_texture_referenced(pipe, texture, face, level); 1314 1315 trace_dump_ret(uint, referenced); 1316 trace_dump_call_end(); 1317 1318 return referenced; 1319} 1320 1321static unsigned int 1322trace_is_buffer_referenced( struct pipe_context *_pipe, 1323 struct pipe_buffer *_buf) 1324{ 1325 struct trace_context *tr_ctx = trace_context(_pipe); 1326 struct trace_buffer *tr_buf = trace_buffer(_buf); 1327 struct pipe_context *pipe = tr_ctx->pipe; 1328 struct pipe_buffer *buf = tr_buf->buffer; 1329 unsigned int referenced; 1330 1331 trace_dump_call_begin("pipe_context", "is_buffer_referenced"); 1332 trace_dump_arg(ptr, pipe); 1333 trace_dump_arg(ptr, buf); 1334 1335 referenced = pipe->is_buffer_referenced(pipe, buf); 1336 1337 trace_dump_ret(uint, referenced); 1338 trace_dump_call_end(); 1339 1340 return referenced; 1341} 1342 1343static const struct debug_named_value rbug_blocker_flags[] = { 1344 {"before", 1}, 1345 {"after", 2}, 1346 {NULL, 0}, 1347}; 1348 1349struct pipe_context * 1350trace_context_create(struct trace_screen *tr_scr, 1351 struct pipe_context *pipe) 1352{ 1353 struct trace_context *tr_ctx; 1354 1355 if(!pipe) 1356 goto error1; 1357 1358 if(!trace_enabled()) 1359 goto error1; 1360 1361 tr_ctx = CALLOC_STRUCT(trace_context); 1362 if(!tr_ctx) 1363 goto error1; 1364 1365 tr_ctx->base.winsys = NULL; 1366 tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */ 1367 tr_ctx->base.screen = &tr_scr->base; 1368 tr_ctx->draw_blocker = debug_get_flags_option("RBUG_BLOCK", 1369 rbug_blocker_flags, 1370 0); 1371 pipe_mutex_init(tr_ctx->draw_mutex); 1372 pipe_condvar_init(tr_ctx->draw_cond); 1373 pipe_mutex_init(tr_ctx->list_mutex); 1374 make_empty_list(&tr_ctx->shaders); 1375 1376 tr_ctx->base.destroy = trace_context_destroy; 1377 tr_ctx->base.draw_arrays = trace_context_draw_arrays; 1378 tr_ctx->base.draw_elements = trace_context_draw_elements; 1379 tr_ctx->base.draw_range_elements = trace_context_draw_range_elements; 1380 tr_ctx->base.create_query = trace_context_create_query; 1381 tr_ctx->base.destroy_query = trace_context_destroy_query; 1382 tr_ctx->base.begin_query = trace_context_begin_query; 1383 tr_ctx->base.end_query = trace_context_end_query; 1384 tr_ctx->base.get_query_result = trace_context_get_query_result; 1385 tr_ctx->base.create_blend_state = trace_context_create_blend_state; 1386 tr_ctx->base.bind_blend_state = trace_context_bind_blend_state; 1387 tr_ctx->base.delete_blend_state = trace_context_delete_blend_state; 1388 tr_ctx->base.create_sampler_state = trace_context_create_sampler_state; 1389 tr_ctx->base.bind_fragment_sampler_states = trace_context_bind_fragment_sampler_states; 1390 tr_ctx->base.bind_vertex_sampler_states = trace_context_bind_vertex_sampler_states; 1391 tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state; 1392 tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state; 1393 tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state; 1394 tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state; 1395 tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state; 1396 tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state; 1397 tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state; 1398 tr_ctx->base.create_fs_state = trace_context_create_fs_state; 1399 tr_ctx->base.bind_fs_state = trace_context_bind_fs_state; 1400 tr_ctx->base.delete_fs_state = trace_context_delete_fs_state; 1401 tr_ctx->base.create_vs_state = trace_context_create_vs_state; 1402 tr_ctx->base.bind_vs_state = trace_context_bind_vs_state; 1403 tr_ctx->base.delete_vs_state = trace_context_delete_vs_state; 1404 tr_ctx->base.create_vertex_elements_state = trace_context_create_vertex_elements_state; 1405 tr_ctx->base.bind_vertex_elements_state = trace_context_bind_vertex_elements_state; 1406 tr_ctx->base.delete_vertex_elements_state = trace_context_delete_vertex_elements_state; 1407 tr_ctx->base.set_blend_color = trace_context_set_blend_color; 1408 tr_ctx->base.set_stencil_ref = trace_context_set_stencil_ref; 1409 tr_ctx->base.set_clip_state = trace_context_set_clip_state; 1410 tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer; 1411 tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state; 1412 tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple; 1413 tr_ctx->base.set_scissor_state = trace_context_set_scissor_state; 1414 tr_ctx->base.set_viewport_state = trace_context_set_viewport_state; 1415 tr_ctx->base.set_fragment_sampler_views = trace_context_set_fragment_sampler_views; 1416 tr_ctx->base.set_vertex_sampler_views = trace_context_set_vertex_sampler_views; 1417 tr_ctx->base.create_sampler_view = trace_create_sampler_view; 1418 tr_ctx->base.sampler_view_destroy = trace_sampler_view_destroy; 1419 tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers; 1420 if (pipe->surface_copy) 1421 tr_ctx->base.surface_copy = trace_context_surface_copy; 1422 if (pipe->surface_fill) 1423 tr_ctx->base.surface_fill = trace_context_surface_fill; 1424 tr_ctx->base.clear = trace_context_clear; 1425 tr_ctx->base.flush = trace_context_flush; 1426 tr_ctx->base.is_texture_referenced = trace_is_texture_referenced; 1427 tr_ctx->base.is_buffer_referenced = trace_is_buffer_referenced; 1428 1429 tr_ctx->pipe = pipe; 1430 1431 trace_screen_add_to_list(tr_scr, contexts, tr_ctx); 1432 1433 return &tr_ctx->base; 1434 1435error1: 1436 return pipe; 1437} 1438