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