tr_context.c revision f40de50def1b7ee75dd320b151c025b7ddff45be
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 "pipe/p_util.h" 29#include "pipe/p_screen.h" 30 31#include "tr_dump.h" 32#include "tr_state.h" 33#include "tr_screen.h" 34#include "tr_texture.h" 35#include "tr_context.h" 36 37 38static INLINE struct pipe_texture * 39trace_texture_unwrap(struct trace_context *tr_ctx, 40 struct pipe_texture *texture) 41{ 42 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); 43 struct trace_texture *tr_tex; 44 45 if(!texture) 46 return NULL; 47 48 tr_tex = trace_texture(tr_scr, texture); 49 50 assert(tr_tex->texture); 51 assert(tr_tex->texture->screen == tr_scr->screen); 52 return tr_tex->texture; 53} 54 55 56static INLINE struct pipe_surface * 57trace_surface_unwrap(struct trace_context *tr_ctx, 58 struct pipe_surface *surface) 59{ 60 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen); 61 struct trace_texture *tr_tex; 62 struct trace_surface *tr_surf; 63 64 if(!surface) 65 return NULL; 66 67 assert(surface->texture); 68 if(!surface->texture) 69 return surface; 70 71 tr_tex = trace_texture(tr_scr, surface->texture); 72 tr_surf = trace_surface(tr_tex, surface); 73 74 assert(tr_surf->surface); 75 assert(tr_surf->surface->texture->screen == tr_scr->screen); 76 return tr_surf->surface; 77} 78 79 80static INLINE void 81trace_context_set_edgeflags(struct pipe_context *_pipe, 82 const unsigned *bitfield) 83{ 84 struct trace_context *tr_ctx = trace_context(_pipe); 85 struct pipe_context *pipe = tr_ctx->pipe; 86 87 trace_dump_call_begin("pipe_context", "set_edgeflags"); 88 89 trace_dump_arg(ptr, pipe); 90 /* FIXME: we don't know how big this array is */ 91 trace_dump_arg(ptr, bitfield); 92 93 pipe->set_edgeflags(pipe, bitfield);; 94 95 trace_dump_call_end(); 96} 97 98 99static INLINE boolean 100trace_context_draw_arrays(struct pipe_context *_pipe, 101 unsigned mode, unsigned start, unsigned count) 102{ 103 struct trace_context *tr_ctx = trace_context(_pipe); 104 struct pipe_context *pipe = tr_ctx->pipe; 105 boolean result; 106 107 trace_dump_call_begin("pipe_context", "draw_arrays"); 108 109 trace_dump_arg(ptr, pipe); 110 trace_dump_arg(uint, mode); 111 trace_dump_arg(uint, start); 112 trace_dump_arg(uint, count); 113 114 result = pipe->draw_arrays(pipe, mode, start, count);; 115 116 trace_dump_ret(bool, result); 117 118 trace_dump_call_end(); 119 120 return result; 121} 122 123 124static INLINE boolean 125trace_context_draw_elements(struct pipe_context *_pipe, 126 struct pipe_buffer *indexBuffer, 127 unsigned indexSize, 128 unsigned mode, unsigned start, unsigned count) 129{ 130 struct trace_context *tr_ctx = trace_context(_pipe); 131 struct pipe_context *pipe = tr_ctx->pipe; 132 boolean result; 133 134 trace_dump_call_begin("pipe_context", "draw_elements"); 135 136 trace_dump_arg(ptr, pipe); 137 trace_dump_arg(ptr, indexBuffer); 138 trace_dump_arg(uint, indexSize); 139 trace_dump_arg(uint, mode); 140 trace_dump_arg(uint, start); 141 trace_dump_arg(uint, count); 142 143 result = pipe->draw_elements(pipe, indexBuffer, indexSize, mode, start, count);; 144 145 trace_dump_ret(bool, result); 146 147 trace_dump_call_end(); 148 149 return result; 150} 151 152 153static INLINE boolean 154trace_context_draw_range_elements(struct pipe_context *_pipe, 155 struct pipe_buffer *indexBuffer, 156 unsigned indexSize, 157 unsigned minIndex, 158 unsigned maxIndex, 159 unsigned mode, 160 unsigned start, 161 unsigned count) 162{ 163 struct trace_context *tr_ctx = trace_context(_pipe); 164 struct pipe_context *pipe = tr_ctx->pipe; 165 boolean result; 166 167 trace_dump_call_begin("pipe_context", "draw_range_elements"); 168 169 trace_dump_arg(ptr, pipe); 170 trace_dump_arg(ptr, indexBuffer); 171 trace_dump_arg(uint, indexSize); 172 trace_dump_arg(uint, minIndex); 173 trace_dump_arg(uint, maxIndex); 174 trace_dump_arg(uint, mode); 175 trace_dump_arg(uint, start); 176 trace_dump_arg(uint, count); 177 178 result = pipe->draw_range_elements(pipe, 179 indexBuffer, 180 indexSize, minIndex, maxIndex, 181 mode, start, count); 182 183 trace_dump_ret(bool, result); 184 185 trace_dump_call_end(); 186 187 return result; 188} 189 190 191static INLINE struct pipe_query * 192trace_context_create_query(struct pipe_context *_pipe, 193 unsigned query_type) 194{ 195 struct trace_context *tr_ctx = trace_context(_pipe); 196 struct pipe_context *pipe = tr_ctx->pipe; 197 struct pipe_query *result; 198 199 trace_dump_call_begin("pipe_context", "create_query"); 200 201 trace_dump_arg(ptr, pipe); 202 trace_dump_arg(uint, query_type); 203 204 result = pipe->create_query(pipe, query_type);; 205 206 trace_dump_ret(ptr, result); 207 208 trace_dump_call_end(); 209 210 return result; 211} 212 213 214static INLINE void 215trace_context_destroy_query(struct pipe_context *_pipe, 216 struct pipe_query *query) 217{ 218 struct trace_context *tr_ctx = trace_context(_pipe); 219 struct pipe_context *pipe = tr_ctx->pipe; 220 221 trace_dump_call_begin("pipe_context", "destroy_query"); 222 223 trace_dump_arg(ptr, pipe); 224 trace_dump_arg(ptr, query); 225 226 pipe->destroy_query(pipe, query);; 227 228 trace_dump_call_end(); 229} 230 231 232static INLINE void 233trace_context_begin_query(struct pipe_context *_pipe, 234 struct pipe_query *query) 235{ 236 struct trace_context *tr_ctx = trace_context(_pipe); 237 struct pipe_context *pipe = tr_ctx->pipe; 238 239 trace_dump_call_begin("pipe_context", "begin_query"); 240 241 trace_dump_arg(ptr, pipe); 242 trace_dump_arg(ptr, query); 243 244 pipe->begin_query(pipe, query);; 245 246 trace_dump_call_end(); 247} 248 249 250static INLINE void 251trace_context_end_query(struct pipe_context *_pipe, 252 struct pipe_query *query) 253{ 254 struct trace_context *tr_ctx = trace_context(_pipe); 255 struct pipe_context *pipe = tr_ctx->pipe; 256 257 trace_dump_call_begin("pipe_context", "end_query"); 258 259 trace_dump_arg(ptr, pipe); 260 trace_dump_arg(ptr, query); 261 262 pipe->end_query(pipe, query); 263 264 trace_dump_call_end(); 265} 266 267 268static INLINE boolean 269trace_context_get_query_result(struct pipe_context *_pipe, 270 struct pipe_query *query, 271 boolean wait, 272 uint64 *presult) 273{ 274 struct trace_context *tr_ctx = trace_context(_pipe); 275 struct pipe_context *pipe = tr_ctx->pipe; 276 uint64 result; 277 boolean _result; 278 279 trace_dump_call_begin("pipe_context", "get_query_result"); 280 281 trace_dump_arg(ptr, pipe); 282 283 _result = pipe->get_query_result(pipe, query, wait, presult);; 284 result = *presult; 285 286 trace_dump_arg(uint, result); 287 trace_dump_ret(bool, _result); 288 289 trace_dump_call_end(); 290 291 return _result; 292} 293 294 295static INLINE void * 296trace_context_create_blend_state(struct pipe_context *_pipe, 297 const struct pipe_blend_state *state) 298{ 299 struct trace_context *tr_ctx = trace_context(_pipe); 300 struct pipe_context *pipe = tr_ctx->pipe; 301 void * result; 302 303 trace_dump_call_begin("pipe_context", "create_blend_state"); 304 305 trace_dump_arg(ptr, pipe); 306 trace_dump_arg(blend_state, state); 307 308 result = pipe->create_blend_state(pipe, state);; 309 310 trace_dump_ret(ptr, result); 311 312 trace_dump_call_end(); 313 314 return result; 315} 316 317 318static INLINE void 319trace_context_bind_blend_state(struct pipe_context *_pipe, 320 void *state) 321{ 322 struct trace_context *tr_ctx = trace_context(_pipe); 323 struct pipe_context *pipe = tr_ctx->pipe; 324 325 trace_dump_call_begin("pipe_context", "bind_blend_state"); 326 327 trace_dump_arg(ptr, pipe); 328 trace_dump_arg(ptr, state); 329 330 pipe->bind_blend_state(pipe, state);; 331 332 trace_dump_call_end(); 333} 334 335 336static INLINE void 337trace_context_delete_blend_state(struct pipe_context *_pipe, 338 void *state) 339{ 340 struct trace_context *tr_ctx = trace_context(_pipe); 341 struct pipe_context *pipe = tr_ctx->pipe; 342 343 trace_dump_call_begin("pipe_context", "delete_blend_state"); 344 345 trace_dump_arg(ptr, pipe); 346 trace_dump_arg(ptr, state); 347 348 pipe->delete_blend_state(pipe, state);; 349 350 trace_dump_call_end(); 351} 352 353 354static INLINE void * 355trace_context_create_sampler_state(struct pipe_context *_pipe, 356 const struct pipe_sampler_state *state) 357{ 358 struct trace_context *tr_ctx = trace_context(_pipe); 359 struct pipe_context *pipe = tr_ctx->pipe; 360 void * result; 361 362 trace_dump_call_begin("pipe_context", "create_sampler_state"); 363 364 trace_dump_arg(ptr, pipe); 365 trace_dump_arg(sampler_state, state); 366 367 result = pipe->create_sampler_state(pipe, state);; 368 369 trace_dump_ret(ptr, result); 370 371 trace_dump_call_end(); 372 373 return result; 374} 375 376 377static INLINE void 378trace_context_bind_sampler_states(struct pipe_context *_pipe, 379 unsigned num_states, void **states) 380{ 381 struct trace_context *tr_ctx = trace_context(_pipe); 382 struct pipe_context *pipe = tr_ctx->pipe; 383 384 trace_dump_call_begin("pipe_context", "bind_sampler_states"); 385 386 trace_dump_arg(ptr, pipe); 387 trace_dump_arg(uint, num_states); 388 trace_dump_arg_array(ptr, states, num_states); 389 390 pipe->bind_sampler_states(pipe, num_states, states);; 391 392 trace_dump_call_end(); 393} 394 395 396static INLINE void 397trace_context_delete_sampler_state(struct pipe_context *_pipe, 398 void *state) 399{ 400 struct trace_context *tr_ctx = trace_context(_pipe); 401 struct pipe_context *pipe = tr_ctx->pipe; 402 403 trace_dump_call_begin("pipe_context", "delete_sampler_state"); 404 405 trace_dump_arg(ptr, pipe); 406 trace_dump_arg(ptr, state); 407 408 pipe->delete_sampler_state(pipe, state);; 409 410 trace_dump_call_end(); 411} 412 413 414static INLINE void * 415trace_context_create_rasterizer_state(struct pipe_context *_pipe, 416 const struct pipe_rasterizer_state *state) 417{ 418 struct trace_context *tr_ctx = trace_context(_pipe); 419 struct pipe_context *pipe = tr_ctx->pipe; 420 void * result; 421 422 trace_dump_call_begin("pipe_context", "create_rasterizer_state"); 423 424 trace_dump_arg(ptr, pipe); 425 trace_dump_arg(rasterizer_state, state); 426 427 result = pipe->create_rasterizer_state(pipe, state);; 428 429 trace_dump_ret(ptr, result); 430 431 trace_dump_call_end(); 432 433 return result; 434} 435 436 437static INLINE void 438trace_context_bind_rasterizer_state(struct pipe_context *_pipe, 439 void *state) 440{ 441 struct trace_context *tr_ctx = trace_context(_pipe); 442 struct pipe_context *pipe = tr_ctx->pipe; 443 444 trace_dump_call_begin("pipe_context", "bind_rasterizer_state"); 445 446 trace_dump_arg(ptr, pipe); 447 trace_dump_arg(ptr, state); 448 449 pipe->bind_rasterizer_state(pipe, state);; 450 451 trace_dump_call_end(); 452} 453 454 455static INLINE void 456trace_context_delete_rasterizer_state(struct pipe_context *_pipe, 457 void *state) 458{ 459 struct trace_context *tr_ctx = trace_context(_pipe); 460 struct pipe_context *pipe = tr_ctx->pipe; 461 462 trace_dump_call_begin("pipe_context", "delete_rasterizer_state"); 463 464 trace_dump_arg(ptr, pipe); 465 trace_dump_arg(ptr, state); 466 467 pipe->delete_rasterizer_state(pipe, state);; 468 469 trace_dump_call_end(); 470} 471 472 473static INLINE void * 474trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe, 475 const struct pipe_depth_stencil_alpha_state *state) 476{ 477 struct trace_context *tr_ctx = trace_context(_pipe); 478 struct pipe_context *pipe = tr_ctx->pipe; 479 void * result; 480 481 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state"); 482 483 result = pipe->create_depth_stencil_alpha_state(pipe, state);; 484 485 trace_dump_arg(ptr, pipe); 486 trace_dump_arg(depth_stencil_alpha_state, state); 487 488 trace_dump_ret(ptr, result); 489 490 trace_dump_call_end(); 491 492 return result; 493} 494 495 496static INLINE void 497trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe, 498 void *state) 499{ 500 struct trace_context *tr_ctx = trace_context(_pipe); 501 struct pipe_context *pipe = tr_ctx->pipe; 502 503 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state"); 504 505 trace_dump_arg(ptr, pipe); 506 trace_dump_arg(ptr, state); 507 508 pipe->bind_depth_stencil_alpha_state(pipe, state);; 509 510 trace_dump_call_end(); 511} 512 513 514static INLINE void 515trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, 516 void *state) 517{ 518 struct trace_context *tr_ctx = trace_context(_pipe); 519 struct pipe_context *pipe = tr_ctx->pipe; 520 521 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state"); 522 523 trace_dump_arg(ptr, pipe); 524 trace_dump_arg(ptr, state); 525 526 pipe->delete_depth_stencil_alpha_state(pipe, state);; 527 528 trace_dump_call_end(); 529} 530 531 532static INLINE void * 533trace_context_create_fs_state(struct pipe_context *_pipe, 534 const struct pipe_shader_state *state) 535{ 536 struct trace_context *tr_ctx = trace_context(_pipe); 537 struct pipe_context *pipe = tr_ctx->pipe; 538 void * result; 539 540 trace_dump_call_begin("pipe_context", "create_fs_state"); 541 542 trace_dump_arg(ptr, pipe); 543 trace_dump_arg(shader_state, state); 544 545 result = pipe->create_fs_state(pipe, state);; 546 547 trace_dump_ret(ptr, result); 548 549 trace_dump_call_end(); 550 551 return result; 552} 553 554 555static INLINE void 556trace_context_bind_fs_state(struct pipe_context *_pipe, 557 void *state) 558{ 559 struct trace_context *tr_ctx = trace_context(_pipe); 560 struct pipe_context *pipe = tr_ctx->pipe; 561 562 trace_dump_call_begin("pipe_context", "bind_fs_state"); 563 564 trace_dump_arg(ptr, pipe); 565 trace_dump_arg(ptr, state); 566 567 pipe->bind_fs_state(pipe, state);; 568 569 trace_dump_call_end(); 570} 571 572 573static INLINE void 574trace_context_delete_fs_state(struct pipe_context *_pipe, 575 void *state) 576{ 577 struct trace_context *tr_ctx = trace_context(_pipe); 578 struct pipe_context *pipe = tr_ctx->pipe; 579 580 trace_dump_call_begin("pipe_context", "delete_fs_state"); 581 582 trace_dump_arg(ptr, pipe); 583 trace_dump_arg(ptr, state); 584 585 pipe->delete_fs_state(pipe, state);; 586 587 trace_dump_call_end(); 588} 589 590 591static INLINE void * 592trace_context_create_vs_state(struct pipe_context *_pipe, 593 const struct pipe_shader_state *state) 594{ 595 struct trace_context *tr_ctx = trace_context(_pipe); 596 struct pipe_context *pipe = tr_ctx->pipe; 597 void * result; 598 599 trace_dump_call_begin("pipe_context", "create_vs_state"); 600 601 trace_dump_arg(ptr, pipe); 602 trace_dump_arg(shader_state, state); 603 604 result = pipe->create_vs_state(pipe, state);; 605 606 trace_dump_ret(ptr, result); 607 608 trace_dump_call_end(); 609 610 return result; 611} 612 613 614static INLINE void 615trace_context_bind_vs_state(struct pipe_context *_pipe, 616 void *state) 617{ 618 struct trace_context *tr_ctx = trace_context(_pipe); 619 struct pipe_context *pipe = tr_ctx->pipe; 620 621 trace_dump_call_begin("pipe_context", "bind_vs_state"); 622 623 trace_dump_arg(ptr, pipe); 624 trace_dump_arg(ptr, state); 625 626 pipe->bind_vs_state(pipe, state);; 627 628 trace_dump_call_end(); 629} 630 631 632static INLINE void 633trace_context_delete_vs_state(struct pipe_context *_pipe, 634 void *state) 635{ 636 struct trace_context *tr_ctx = trace_context(_pipe); 637 struct pipe_context *pipe = tr_ctx->pipe; 638 639 trace_dump_call_begin("pipe_context", "delete_vs_state"); 640 641 trace_dump_arg(ptr, pipe); 642 trace_dump_arg(ptr, state); 643 644 pipe->delete_vs_state(pipe, state);; 645 646 trace_dump_call_end(); 647} 648 649 650static INLINE void 651trace_context_set_blend_color(struct pipe_context *_pipe, 652 const struct pipe_blend_color *state) 653{ 654 struct trace_context *tr_ctx = trace_context(_pipe); 655 struct pipe_context *pipe = tr_ctx->pipe; 656 657 trace_dump_call_begin("pipe_context", "set_blend_color"); 658 659 trace_dump_arg(ptr, pipe); 660 trace_dump_arg(blend_color, state); 661 662 pipe->set_blend_color(pipe, state);; 663 664 trace_dump_call_end(); 665} 666 667 668static INLINE void 669trace_context_set_clip_state(struct pipe_context *_pipe, 670 const struct pipe_clip_state *state) 671{ 672 struct trace_context *tr_ctx = trace_context(_pipe); 673 struct pipe_context *pipe = tr_ctx->pipe; 674 675 trace_dump_call_begin("pipe_context", "set_clip_state"); 676 677 trace_dump_arg(ptr, pipe); 678 trace_dump_arg(clip_state, state); 679 680 pipe->set_clip_state(pipe, state);; 681 682 trace_dump_call_end(); 683} 684 685 686static INLINE void 687trace_context_set_constant_buffer(struct pipe_context *_pipe, 688 uint shader, uint index, 689 const struct pipe_constant_buffer *buffer) 690{ 691 struct trace_context *tr_ctx = trace_context(_pipe); 692 struct pipe_context *pipe = tr_ctx->pipe; 693 694 trace_dump_call_begin("pipe_context", "set_constant_buffer"); 695 696 trace_dump_arg(ptr, pipe); 697 trace_dump_arg(uint, shader); 698 trace_dump_arg(uint, index); 699 trace_dump_arg(constant_buffer, buffer); 700 701 pipe->set_constant_buffer(pipe, shader, index, buffer);; 702 703 trace_dump_call_end(); 704} 705 706 707static INLINE void 708trace_context_set_framebuffer_state(struct pipe_context *_pipe, 709 const struct pipe_framebuffer_state *state) 710{ 711 struct trace_context *tr_ctx = trace_context(_pipe); 712 struct pipe_context *pipe = tr_ctx->pipe; 713 struct pipe_framebuffer_state unwrapped_state; 714 unsigned i; 715 716 /* Unwrap the input state */ 717 memcpy(&unwrapped_state, state, sizeof(unwrapped_state)); 718 for(i = 0; i < state->num_cbufs; ++i) 719 unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]); 720 for(i = state->num_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i) 721 unwrapped_state.cbufs[i] = NULL; 722 unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf); 723 state = &unwrapped_state; 724 725 trace_dump_call_begin("pipe_context", "set_framebuffer_state"); 726 727 trace_dump_arg(ptr, pipe); 728 trace_dump_arg(framebuffer_state, state); 729 730 pipe->set_framebuffer_state(pipe, state);; 731 732 trace_dump_call_end(); 733} 734 735 736static INLINE void 737trace_context_set_polygon_stipple(struct pipe_context *_pipe, 738 const struct pipe_poly_stipple *state) 739{ 740 struct trace_context *tr_ctx = trace_context(_pipe); 741 struct pipe_context *pipe = tr_ctx->pipe; 742 743 trace_dump_call_begin("pipe_context", "set_polygon_stipple"); 744 745 trace_dump_arg(ptr, pipe); 746 trace_dump_arg(poly_stipple, state); 747 748 pipe->set_polygon_stipple(pipe, state);; 749 750 trace_dump_call_end(); 751} 752 753 754static INLINE void 755trace_context_set_scissor_state(struct pipe_context *_pipe, 756 const struct pipe_scissor_state *state) 757{ 758 struct trace_context *tr_ctx = trace_context(_pipe); 759 struct pipe_context *pipe = tr_ctx->pipe; 760 761 trace_dump_call_begin("pipe_context", "set_scissor_state"); 762 763 trace_dump_arg(ptr, pipe); 764 trace_dump_arg(scissor_state, state); 765 766 pipe->set_scissor_state(pipe, state);; 767 768 trace_dump_call_end(); 769} 770 771 772static INLINE void 773trace_context_set_viewport_state(struct pipe_context *_pipe, 774 const struct pipe_viewport_state *state) 775{ 776 struct trace_context *tr_ctx = trace_context(_pipe); 777 struct pipe_context *pipe = tr_ctx->pipe; 778 779 trace_dump_call_begin("pipe_context", "set_viewport_state"); 780 781 trace_dump_arg(ptr, pipe); 782 trace_dump_arg(viewport_state, state); 783 784 pipe->set_viewport_state(pipe, state);; 785 786 trace_dump_call_end(); 787} 788 789 790static INLINE void 791trace_context_set_sampler_textures(struct pipe_context *_pipe, 792 unsigned num_textures, 793 struct pipe_texture **textures) 794{ 795 struct trace_context *tr_ctx = trace_context(_pipe); 796 struct pipe_context *pipe = tr_ctx->pipe; 797 struct pipe_texture *unwrapped_textures[PIPE_MAX_SAMPLERS]; 798 unsigned i; 799 800 for(i = 0; i < num_textures; ++i) 801 unwrapped_textures[i] = trace_texture_unwrap(tr_ctx, textures[i]); 802 textures = unwrapped_textures; 803 804 trace_dump_call_begin("pipe_context", "set_sampler_textures"); 805 806 trace_dump_arg(ptr, pipe); 807 trace_dump_arg(uint, num_textures); 808 trace_dump_arg_array(ptr, textures, num_textures); 809 810 pipe->set_sampler_textures(pipe, num_textures, textures);; 811 812 trace_dump_call_end(); 813} 814 815 816static INLINE void 817trace_context_set_vertex_buffers(struct pipe_context *_pipe, 818 unsigned num_buffers, 819 const struct pipe_vertex_buffer *buffers) 820{ 821 struct trace_context *tr_ctx = trace_context(_pipe); 822 struct pipe_context *pipe = tr_ctx->pipe; 823 824 trace_dump_call_begin("pipe_context", "set_vertex_buffers"); 825 826 trace_dump_arg(ptr, pipe); 827 trace_dump_arg(uint, num_buffers); 828 829 trace_dump_arg_begin("buffers"); 830 trace_dump_struct_array(vertex_buffer, buffers, num_buffers); 831 trace_dump_arg_end(); 832 833 pipe->set_vertex_buffers(pipe, num_buffers, buffers);; 834 835 trace_dump_call_end(); 836} 837 838 839static INLINE void 840trace_context_set_vertex_elements(struct pipe_context *_pipe, 841 unsigned num_elements, 842 const struct pipe_vertex_element *elements) 843{ 844 struct trace_context *tr_ctx = trace_context(_pipe); 845 struct pipe_context *pipe = tr_ctx->pipe; 846 847 trace_dump_call_begin("pipe_context", "set_vertex_elements"); 848 849 trace_dump_arg(ptr, pipe); 850 trace_dump_arg(uint, num_elements); 851 852 trace_dump_arg_begin("elements"); 853 trace_dump_struct_array(vertex_element, elements, num_elements); 854 trace_dump_arg_end(); 855 856 pipe->set_vertex_elements(pipe, num_elements, elements);; 857 858 trace_dump_call_end(); 859} 860 861 862static INLINE void 863trace_context_surface_copy(struct pipe_context *_pipe, 864 boolean do_flip, 865 struct pipe_surface *dest, 866 unsigned destx, unsigned desty, 867 struct pipe_surface *src, 868 unsigned srcx, unsigned srcy, 869 unsigned width, unsigned height) 870{ 871 struct trace_context *tr_ctx = trace_context(_pipe); 872 struct pipe_context *pipe = tr_ctx->pipe; 873 874 dest = trace_surface_unwrap(tr_ctx, dest); 875 src = trace_surface_unwrap(tr_ctx, src); 876 877 trace_dump_call_begin("pipe_context", "surface_copy"); 878 879 trace_dump_arg(ptr, pipe); 880 trace_dump_arg(bool, do_flip); 881 trace_dump_arg(ptr, dest); 882 trace_dump_arg(uint, destx); 883 trace_dump_arg(uint, desty); 884 trace_dump_arg(ptr, src); 885 trace_dump_arg(uint, srcx); 886 trace_dump_arg(uint, srcy); 887 trace_dump_arg(uint, width); 888 trace_dump_arg(uint, height); 889 890 pipe->surface_copy(pipe, do_flip, 891 dest, destx, desty, 892 src, srcx, srcy, width, height); 893 894 trace_dump_call_end(); 895} 896 897 898static INLINE void 899trace_context_surface_fill(struct pipe_context *_pipe, 900 struct pipe_surface *dst, 901 unsigned dstx, unsigned dsty, 902 unsigned width, unsigned height, 903 unsigned value) 904{ 905 struct trace_context *tr_ctx = trace_context(_pipe); 906 struct pipe_context *pipe = tr_ctx->pipe; 907 908 dst = trace_surface_unwrap(tr_ctx, dst); 909 910 trace_dump_call_begin("pipe_context", "surface_fill"); 911 912 trace_dump_arg(ptr, pipe); 913 trace_dump_arg(ptr, dst); 914 trace_dump_arg(uint, dstx); 915 trace_dump_arg(uint, dsty); 916 trace_dump_arg(uint, width); 917 trace_dump_arg(uint, height); 918 919 pipe->surface_fill(pipe, dst, dstx, dsty, width, height, value);; 920 921 trace_dump_call_end(); 922} 923 924 925static INLINE void 926trace_context_clear(struct pipe_context *_pipe, 927 struct pipe_surface *surface, 928 unsigned clearValue) 929{ 930 struct trace_context *tr_ctx = trace_context(_pipe); 931 struct pipe_context *pipe = tr_ctx->pipe; 932 933 surface = trace_surface_unwrap(tr_ctx, surface); 934 935 trace_dump_call_begin("pipe_context", "clear"); 936 937 trace_dump_arg(ptr, pipe); 938 trace_dump_arg(ptr, surface); 939 trace_dump_arg(uint, clearValue); 940 941 pipe->clear(pipe, surface, clearValue);; 942 943 trace_dump_call_end(); 944} 945 946 947static INLINE void 948trace_context_flush(struct pipe_context *_pipe, 949 unsigned flags, 950 struct pipe_fence_handle **fence) 951{ 952 struct trace_context *tr_ctx = trace_context(_pipe); 953 struct pipe_context *pipe = tr_ctx->pipe; 954 955 trace_dump_call_begin("pipe_context", "flush"); 956 957 trace_dump_arg(ptr, pipe); 958 trace_dump_arg(uint, flags); 959 960 pipe->flush(pipe, flags, fence);; 961 962 if(fence) 963 trace_dump_ret(ptr, *fence); 964 965 trace_dump_call_end(); 966} 967 968 969static INLINE void 970trace_context_destroy(struct pipe_context *_pipe) 971{ 972 struct trace_context *tr_ctx = trace_context(_pipe); 973 struct pipe_context *pipe = tr_ctx->pipe; 974 975 trace_dump_call_begin("pipe_context", "destroy"); 976 977 trace_dump_arg(ptr, pipe); 978 979 pipe->destroy(pipe); 980 981 trace_dump_call_end(); 982 983 FREE(tr_ctx); 984} 985 986 987struct pipe_context * 988trace_context_create(struct pipe_screen *screen, 989 struct pipe_context *pipe) 990{ 991 struct trace_context *tr_ctx; 992 993 if(!pipe) 994 goto error1; 995 996 if(!trace_dump_enabled()) 997 goto error1; 998 999 tr_ctx = CALLOC_STRUCT(trace_context); 1000 if(!tr_ctx) 1001 goto error1; 1002 1003 tr_ctx->base.winsys = screen->winsys; 1004 tr_ctx->base.screen = screen; 1005 tr_ctx->base.destroy = trace_context_destroy; 1006 tr_ctx->base.set_edgeflags = trace_context_set_edgeflags; 1007 tr_ctx->base.draw_arrays = trace_context_draw_arrays; 1008 tr_ctx->base.draw_elements = trace_context_draw_elements; 1009 tr_ctx->base.draw_range_elements = trace_context_draw_range_elements; 1010 tr_ctx->base.create_query = trace_context_create_query; 1011 tr_ctx->base.destroy_query = trace_context_destroy_query; 1012 tr_ctx->base.begin_query = trace_context_begin_query; 1013 tr_ctx->base.end_query = trace_context_end_query; 1014 tr_ctx->base.get_query_result = trace_context_get_query_result; 1015 tr_ctx->base.create_blend_state = trace_context_create_blend_state; 1016 tr_ctx->base.bind_blend_state = trace_context_bind_blend_state; 1017 tr_ctx->base.delete_blend_state = trace_context_delete_blend_state; 1018 tr_ctx->base.create_sampler_state = trace_context_create_sampler_state; 1019 tr_ctx->base.bind_sampler_states = trace_context_bind_sampler_states; 1020 tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state; 1021 tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state; 1022 tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state; 1023 tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state; 1024 tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state; 1025 tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state; 1026 tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state; 1027 tr_ctx->base.create_fs_state = trace_context_create_fs_state; 1028 tr_ctx->base.bind_fs_state = trace_context_bind_fs_state; 1029 tr_ctx->base.delete_fs_state = trace_context_delete_fs_state; 1030 tr_ctx->base.create_vs_state = trace_context_create_vs_state; 1031 tr_ctx->base.bind_vs_state = trace_context_bind_vs_state; 1032 tr_ctx->base.delete_vs_state = trace_context_delete_vs_state; 1033 tr_ctx->base.set_blend_color = trace_context_set_blend_color; 1034 tr_ctx->base.set_clip_state = trace_context_set_clip_state; 1035 tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer; 1036 tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state; 1037 tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple; 1038 tr_ctx->base.set_scissor_state = trace_context_set_scissor_state; 1039 tr_ctx->base.set_viewport_state = trace_context_set_viewport_state; 1040 tr_ctx->base.set_sampler_textures = trace_context_set_sampler_textures; 1041 tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers; 1042 tr_ctx->base.set_vertex_elements = trace_context_set_vertex_elements; 1043 tr_ctx->base.surface_copy = trace_context_surface_copy; 1044 tr_ctx->base.surface_fill = trace_context_surface_fill; 1045 tr_ctx->base.clear = trace_context_clear; 1046 tr_ctx->base.flush = trace_context_flush; 1047 1048 tr_ctx->pipe = pipe; 1049 1050 trace_dump_call_begin("", "pipe_context_create"); 1051 trace_dump_arg_begin("screen"); 1052 trace_dump_ptr(pipe->screen); 1053 trace_dump_arg_end(); 1054 trace_dump_ret(ptr, pipe); 1055 trace_dump_call_end(); 1056 1057 return &tr_ctx->base; 1058 1059error1: 1060 return pipe; 1061} 1062