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