1 /************************************************************************** 2 * 3 * Copyright 2010 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29 #include "pipe/p_context.h" 30 #include "util/u_memory.h" 31 #include "util/u_inlines.h" 32 #include "util/simple_list.h" 33 34 #include "rbug/rbug_context.h" 35 36 #include "rbug_context.h" 37 #include "rbug_objects.h" 38 39 40 static void 41 rbug_destroy(struct pipe_context *_pipe) 42 { 43 struct rbug_screen *rb_screen = rbug_screen(_pipe->screen); 44 struct rbug_context *rb_pipe = rbug_context(_pipe); 45 struct pipe_context *pipe = rb_pipe->pipe; 46 47 rbug_screen_remove_from_list(rb_screen, contexts, rb_pipe); 48 49 pipe_mutex_lock(rb_pipe->call_mutex); 50 pipe->destroy(pipe); 51 rb_pipe->pipe = NULL; 52 pipe_mutex_unlock(rb_pipe->call_mutex); 53 54 FREE(rb_pipe); 55 } 56 57 static void 58 rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag) 59 { 60 61 if (rb_pipe->draw_blocker & flag) { 62 rb_pipe->draw_blocked |= flag; 63 } else if ((rb_pipe->draw_rule.blocker & flag) && 64 (rb_pipe->draw_blocker & RBUG_BLOCK_RULE)) { 65 unsigned k; 66 boolean block = FALSE; 67 unsigned sh; 68 69 debug_printf("%s (%p %p) (%p %p) (%p %u) (%p %u)\n", __FUNCTION__, 70 (void *) rb_pipe->draw_rule.shader[PIPE_SHADER_FRAGMENT], 71 (void *) rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT], 72 (void *) rb_pipe->draw_rule.shader[PIPE_SHADER_VERTEX], 73 (void *) rb_pipe->curr.shader[PIPE_SHADER_VERTEX], 74 (void *) rb_pipe->draw_rule.surf, 0, 75 (void *) rb_pipe->draw_rule.texture, 0); 76 for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) { 77 if (rb_pipe->draw_rule.shader[sh] && 78 rb_pipe->draw_rule.shader[sh] == rb_pipe->curr.shader[sh]) 79 block = TRUE; 80 } 81 82 if (rb_pipe->draw_rule.surf && 83 rb_pipe->draw_rule.surf == rb_pipe->curr.zsbuf) 84 block = TRUE; 85 if (rb_pipe->draw_rule.surf) 86 for (k = 0; k < rb_pipe->curr.nr_cbufs; k++) 87 if (rb_pipe->draw_rule.surf == rb_pipe->curr.cbufs[k]) 88 block = TRUE; 89 if (rb_pipe->draw_rule.texture) { 90 for (sh = 0; sh < ARRAY_SIZE(rb_pipe->curr.num_views); sh++) { 91 for (k = 0; k < rb_pipe->curr.num_views[sh]; k++) { 92 if (rb_pipe->draw_rule.texture == rb_pipe->curr.texs[sh][k]) { 93 block = TRUE; 94 sh = PIPE_SHADER_TYPES; /* to break out of both loops */ 95 break; 96 } 97 } 98 } 99 } 100 101 if (block) 102 rb_pipe->draw_blocked |= (flag | RBUG_BLOCK_RULE); 103 } 104 105 if (rb_pipe->draw_blocked) 106 rbug_notify_draw_blocked(rb_pipe); 107 108 /* wait for rbug to clear the blocked flag */ 109 while (rb_pipe->draw_blocked & flag) { 110 rb_pipe->draw_blocked |= flag; 111 pipe_condvar_wait(rb_pipe->draw_cond, rb_pipe->draw_mutex); 112 } 113 114 } 115 116 static void 117 rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info) 118 { 119 struct rbug_context *rb_pipe = rbug_context(_pipe); 120 struct pipe_context *pipe = rb_pipe->pipe; 121 122 pipe_mutex_lock(rb_pipe->draw_mutex); 123 rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_BEFORE); 124 125 pipe_mutex_lock(rb_pipe->call_mutex); 126 /* XXX loop over PIPE_SHADER_x here */ 127 if (!(rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] && rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT]->disabled) && 128 !(rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] && rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY]->disabled) && 129 !(rb_pipe->curr.shader[PIPE_SHADER_VERTEX] && rb_pipe->curr.shader[PIPE_SHADER_VERTEX]->disabled)) 130 pipe->draw_vbo(pipe, info); 131 pipe_mutex_unlock(rb_pipe->call_mutex); 132 133 rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_AFTER); 134 pipe_mutex_unlock(rb_pipe->draw_mutex); 135 } 136 137 static struct pipe_query * 138 rbug_create_query(struct pipe_context *_pipe, 139 unsigned query_type, 140 unsigned index) 141 { 142 struct rbug_context *rb_pipe = rbug_context(_pipe); 143 struct pipe_context *pipe = rb_pipe->pipe; 144 struct pipe_query *query; 145 146 pipe_mutex_lock(rb_pipe->call_mutex); 147 query = pipe->create_query(pipe, 148 query_type, 149 index); 150 pipe_mutex_unlock(rb_pipe->call_mutex); 151 return query; 152 } 153 154 static void 155 rbug_destroy_query(struct pipe_context *_pipe, 156 struct pipe_query *query) 157 { 158 struct rbug_context *rb_pipe = rbug_context(_pipe); 159 struct pipe_context *pipe = rb_pipe->pipe; 160 161 pipe_mutex_lock(rb_pipe->call_mutex); 162 pipe->destroy_query(pipe, 163 query); 164 pipe_mutex_unlock(rb_pipe->call_mutex); 165 } 166 167 static boolean 168 rbug_begin_query(struct pipe_context *_pipe, 169 struct pipe_query *query) 170 { 171 struct rbug_context *rb_pipe = rbug_context(_pipe); 172 struct pipe_context *pipe = rb_pipe->pipe; 173 boolean ret; 174 175 pipe_mutex_lock(rb_pipe->call_mutex); 176 ret = pipe->begin_query(pipe, query); 177 pipe_mutex_unlock(rb_pipe->call_mutex); 178 return ret; 179 } 180 181 static bool 182 rbug_end_query(struct pipe_context *_pipe, 183 struct pipe_query *query) 184 { 185 struct rbug_context *rb_pipe = rbug_context(_pipe); 186 struct pipe_context *pipe = rb_pipe->pipe; 187 bool ret; 188 189 pipe_mutex_lock(rb_pipe->call_mutex); 190 ret = pipe->end_query(pipe, 191 query); 192 pipe_mutex_unlock(rb_pipe->call_mutex); 193 194 return ret; 195 } 196 197 static boolean 198 rbug_get_query_result(struct pipe_context *_pipe, 199 struct pipe_query *query, 200 boolean wait, 201 union pipe_query_result *result) 202 { 203 struct rbug_context *rb_pipe = rbug_context(_pipe); 204 struct pipe_context *pipe = rb_pipe->pipe; 205 boolean ret; 206 207 pipe_mutex_lock(rb_pipe->call_mutex); 208 ret = pipe->get_query_result(pipe, 209 query, 210 wait, 211 result); 212 pipe_mutex_unlock(rb_pipe->call_mutex); 213 214 return ret; 215 } 216 217 static void 218 rbug_set_active_query_state(struct pipe_context *_pipe, boolean enable) 219 { 220 struct rbug_context *rb_pipe = rbug_context(_pipe); 221 struct pipe_context *pipe = rb_pipe->pipe; 222 223 pipe_mutex_lock(rb_pipe->call_mutex); 224 pipe->set_active_query_state(pipe, enable); 225 pipe_mutex_unlock(rb_pipe->call_mutex); 226 } 227 228 static void * 229 rbug_create_blend_state(struct pipe_context *_pipe, 230 const struct pipe_blend_state *blend) 231 { 232 struct rbug_context *rb_pipe = rbug_context(_pipe); 233 struct pipe_context *pipe = rb_pipe->pipe; 234 void *ret; 235 236 pipe_mutex_lock(rb_pipe->call_mutex); 237 ret = pipe->create_blend_state(pipe, 238 blend); 239 pipe_mutex_unlock(rb_pipe->call_mutex); 240 241 return ret; 242 } 243 244 static void 245 rbug_bind_blend_state(struct pipe_context *_pipe, 246 void *blend) 247 { 248 struct rbug_context *rb_pipe = rbug_context(_pipe); 249 struct pipe_context *pipe = rb_pipe->pipe; 250 251 pipe_mutex_lock(rb_pipe->call_mutex); 252 pipe->bind_blend_state(pipe, 253 blend); 254 pipe_mutex_unlock(rb_pipe->call_mutex); 255 } 256 257 static void 258 rbug_delete_blend_state(struct pipe_context *_pipe, 259 void *blend) 260 { 261 struct rbug_context *rb_pipe = rbug_context(_pipe); 262 struct pipe_context *pipe = rb_pipe->pipe; 263 264 pipe_mutex_lock(rb_pipe->call_mutex); 265 pipe->delete_blend_state(pipe, 266 blend); 267 pipe_mutex_unlock(rb_pipe->call_mutex); 268 } 269 270 static void * 271 rbug_create_sampler_state(struct pipe_context *_pipe, 272 const struct pipe_sampler_state *sampler) 273 { 274 struct rbug_context *rb_pipe = rbug_context(_pipe); 275 struct pipe_context *pipe = rb_pipe->pipe; 276 void *ret; 277 278 pipe_mutex_lock(rb_pipe->call_mutex); 279 ret = pipe->create_sampler_state(pipe, 280 sampler); 281 pipe_mutex_unlock(rb_pipe->call_mutex); 282 283 return ret; 284 } 285 286 static void 287 rbug_bind_sampler_states(struct pipe_context *_pipe, 288 enum pipe_shader_type shader, 289 unsigned start, unsigned count, 290 void **samplers) 291 { 292 struct rbug_context *rb_pipe = rbug_context(_pipe); 293 struct pipe_context *pipe = rb_pipe->pipe; 294 295 pipe_mutex_lock(rb_pipe->call_mutex); 296 pipe->bind_sampler_states(pipe, shader, start, count, samplers); 297 pipe_mutex_unlock(rb_pipe->call_mutex); 298 } 299 300 static void 301 rbug_delete_sampler_state(struct pipe_context *_pipe, 302 void *sampler) 303 { 304 struct rbug_context *rb_pipe = rbug_context(_pipe); 305 struct pipe_context *pipe = rb_pipe->pipe; 306 307 pipe_mutex_lock(rb_pipe->call_mutex); 308 pipe->delete_sampler_state(pipe, 309 sampler); 310 pipe_mutex_unlock(rb_pipe->call_mutex); 311 } 312 313 static void * 314 rbug_create_rasterizer_state(struct pipe_context *_pipe, 315 const struct pipe_rasterizer_state *rasterizer) 316 { 317 struct rbug_context *rb_pipe = rbug_context(_pipe); 318 struct pipe_context *pipe = rb_pipe->pipe; 319 void *ret; 320 321 pipe_mutex_lock(rb_pipe->call_mutex); 322 ret = pipe->create_rasterizer_state(pipe, 323 rasterizer); 324 pipe_mutex_unlock(rb_pipe->call_mutex); 325 326 return ret; 327 } 328 329 static void 330 rbug_bind_rasterizer_state(struct pipe_context *_pipe, 331 void *rasterizer) 332 { 333 struct rbug_context *rb_pipe = rbug_context(_pipe); 334 struct pipe_context *pipe = rb_pipe->pipe; 335 336 pipe_mutex_lock(rb_pipe->call_mutex); 337 pipe->bind_rasterizer_state(pipe, 338 rasterizer); 339 pipe_mutex_unlock(rb_pipe->call_mutex); 340 } 341 342 static void 343 rbug_delete_rasterizer_state(struct pipe_context *_pipe, 344 void *rasterizer) 345 { 346 struct rbug_context *rb_pipe = rbug_context(_pipe); 347 struct pipe_context *pipe = rb_pipe->pipe; 348 349 pipe_mutex_lock(rb_pipe->call_mutex); 350 pipe->delete_rasterizer_state(pipe, 351 rasterizer); 352 pipe_mutex_unlock(rb_pipe->call_mutex); 353 } 354 355 static void * 356 rbug_create_depth_stencil_alpha_state(struct pipe_context *_pipe, 357 const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha) 358 { 359 struct rbug_context *rb_pipe = rbug_context(_pipe); 360 struct pipe_context *pipe = rb_pipe->pipe; 361 void *ret; 362 363 pipe_mutex_lock(rb_pipe->call_mutex); 364 ret = pipe->create_depth_stencil_alpha_state(pipe, 365 depth_stencil_alpha); 366 pipe_mutex_unlock(rb_pipe->call_mutex); 367 368 return ret; 369 } 370 371 static void 372 rbug_bind_depth_stencil_alpha_state(struct pipe_context *_pipe, 373 void *depth_stencil_alpha) 374 { 375 struct rbug_context *rb_pipe = rbug_context(_pipe); 376 struct pipe_context *pipe = rb_pipe->pipe; 377 378 pipe_mutex_lock(rb_pipe->call_mutex); 379 pipe->bind_depth_stencil_alpha_state(pipe, 380 depth_stencil_alpha); 381 pipe_mutex_unlock(rb_pipe->call_mutex); 382 } 383 384 static void 385 rbug_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, 386 void *depth_stencil_alpha) 387 { 388 struct rbug_context *rb_pipe = rbug_context(_pipe); 389 struct pipe_context *pipe = rb_pipe->pipe; 390 391 pipe_mutex_lock(rb_pipe->call_mutex); 392 pipe->delete_depth_stencil_alpha_state(pipe, 393 depth_stencil_alpha); 394 pipe_mutex_unlock(rb_pipe->call_mutex); 395 } 396 397 static void * 398 rbug_create_fs_state(struct pipe_context *_pipe, 399 const struct pipe_shader_state *state) 400 { 401 struct rbug_context *rb_pipe = rbug_context(_pipe); 402 struct pipe_context *pipe = rb_pipe->pipe; 403 void *result; 404 405 pipe_mutex_lock(rb_pipe->call_mutex); 406 result = pipe->create_fs_state(pipe, state); 407 pipe_mutex_unlock(rb_pipe->call_mutex); 408 409 if (!result) 410 return NULL; 411 412 return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_FRAGMENT); 413 } 414 415 static void 416 rbug_bind_fs_state(struct pipe_context *_pipe, 417 void *_fs) 418 { 419 struct rbug_context *rb_pipe = rbug_context(_pipe); 420 struct pipe_context *pipe = rb_pipe->pipe; 421 void *fs; 422 423 pipe_mutex_lock(rb_pipe->call_mutex); 424 425 fs = rbug_shader_unwrap(_fs); 426 rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] = rbug_shader(_fs); 427 pipe->bind_fs_state(pipe, 428 fs); 429 430 pipe_mutex_unlock(rb_pipe->call_mutex); 431 } 432 433 static void 434 rbug_delete_fs_state(struct pipe_context *_pipe, 435 void *_fs) 436 { 437 struct rbug_context *rb_pipe = rbug_context(_pipe); 438 struct rbug_shader *rb_shader = rbug_shader(_fs); 439 440 pipe_mutex_lock(rb_pipe->call_mutex); 441 rbug_shader_destroy(rb_pipe, rb_shader); 442 pipe_mutex_unlock(rb_pipe->call_mutex); 443 } 444 445 static void * 446 rbug_create_vs_state(struct pipe_context *_pipe, 447 const struct pipe_shader_state *state) 448 { 449 struct rbug_context *rb_pipe = rbug_context(_pipe); 450 struct pipe_context *pipe = rb_pipe->pipe; 451 void *result; 452 453 pipe_mutex_lock(rb_pipe->call_mutex); 454 result = pipe->create_vs_state(pipe, state); 455 pipe_mutex_unlock(rb_pipe->call_mutex); 456 457 if (!result) 458 return NULL; 459 460 return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_VERTEX); 461 } 462 463 static void 464 rbug_bind_vs_state(struct pipe_context *_pipe, 465 void *_vs) 466 { 467 struct rbug_context *rb_pipe = rbug_context(_pipe); 468 struct pipe_context *pipe = rb_pipe->pipe; 469 void *vs; 470 471 pipe_mutex_lock(rb_pipe->call_mutex); 472 473 vs = rbug_shader_unwrap(_vs); 474 rb_pipe->curr.shader[PIPE_SHADER_VERTEX] = rbug_shader(_vs); 475 pipe->bind_vs_state(pipe, 476 vs); 477 478 pipe_mutex_unlock(rb_pipe->call_mutex); 479 } 480 481 static void 482 rbug_delete_vs_state(struct pipe_context *_pipe, 483 void *_vs) 484 { 485 struct rbug_context *rb_pipe = rbug_context(_pipe); 486 struct rbug_shader *rb_shader = rbug_shader(_vs); 487 488 pipe_mutex_unlock(rb_pipe->call_mutex); 489 rbug_shader_destroy(rb_pipe, rb_shader); 490 pipe_mutex_unlock(rb_pipe->call_mutex); 491 } 492 493 static void * 494 rbug_create_gs_state(struct pipe_context *_pipe, 495 const struct pipe_shader_state *state) 496 { 497 struct rbug_context *rb_pipe = rbug_context(_pipe); 498 struct pipe_context *pipe = rb_pipe->pipe; 499 void *result; 500 501 pipe_mutex_lock(rb_pipe->call_mutex); 502 result = pipe->create_gs_state(pipe, state); 503 pipe_mutex_unlock(rb_pipe->call_mutex); 504 505 if (!result) 506 return NULL; 507 508 return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_GEOM); 509 } 510 511 static void 512 rbug_bind_gs_state(struct pipe_context *_pipe, 513 void *_gs) 514 { 515 struct rbug_context *rb_pipe = rbug_context(_pipe); 516 struct pipe_context *pipe = rb_pipe->pipe; 517 void *gs; 518 519 pipe_mutex_lock(rb_pipe->call_mutex); 520 521 gs = rbug_shader_unwrap(_gs); 522 rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] = rbug_shader(_gs); 523 pipe->bind_gs_state(pipe, 524 gs); 525 526 pipe_mutex_unlock(rb_pipe->call_mutex); 527 } 528 529 static void 530 rbug_delete_gs_state(struct pipe_context *_pipe, 531 void *_gs) 532 { 533 struct rbug_context *rb_pipe = rbug_context(_pipe); 534 struct rbug_shader *rb_shader = rbug_shader(_gs); 535 536 pipe_mutex_lock(rb_pipe->call_mutex); 537 rbug_shader_destroy(rb_pipe, rb_shader); 538 pipe_mutex_unlock(rb_pipe->call_mutex); 539 } 540 541 static void * 542 rbug_create_vertex_elements_state(struct pipe_context *_pipe, 543 unsigned num_elements, 544 const struct pipe_vertex_element *vertex_elements) 545 { 546 struct rbug_context *rb_pipe = rbug_context(_pipe); 547 struct pipe_context *pipe = rb_pipe->pipe; 548 void *ret; 549 550 pipe_mutex_lock(rb_pipe->call_mutex); 551 ret = pipe->create_vertex_elements_state(pipe, 552 num_elements, 553 vertex_elements); 554 pipe_mutex_unlock(rb_pipe->call_mutex); 555 556 return ret; 557 } 558 559 static void 560 rbug_bind_vertex_elements_state(struct pipe_context *_pipe, 561 void *velems) 562 { 563 struct rbug_context *rb_pipe = rbug_context(_pipe); 564 struct pipe_context *pipe = rb_pipe->pipe; 565 566 pipe_mutex_lock(rb_pipe->call_mutex); 567 pipe->bind_vertex_elements_state(pipe, 568 velems); 569 pipe_mutex_unlock(rb_pipe->call_mutex); 570 } 571 572 static void 573 rbug_delete_vertex_elements_state(struct pipe_context *_pipe, 574 void *velems) 575 { 576 struct rbug_context *rb_pipe = rbug_context(_pipe); 577 struct pipe_context *pipe = rb_pipe->pipe; 578 579 pipe_mutex_lock(rb_pipe->call_mutex); 580 pipe->delete_vertex_elements_state(pipe, 581 velems); 582 pipe_mutex_unlock(rb_pipe->call_mutex); 583 } 584 585 static void 586 rbug_set_blend_color(struct pipe_context *_pipe, 587 const struct pipe_blend_color *blend_color) 588 { 589 struct rbug_context *rb_pipe = rbug_context(_pipe); 590 struct pipe_context *pipe = rb_pipe->pipe; 591 592 pipe_mutex_lock(rb_pipe->call_mutex); 593 pipe->set_blend_color(pipe, 594 blend_color); 595 pipe_mutex_unlock(rb_pipe->call_mutex); 596 } 597 598 static void 599 rbug_set_stencil_ref(struct pipe_context *_pipe, 600 const struct pipe_stencil_ref *stencil_ref) 601 { 602 struct rbug_context *rb_pipe = rbug_context(_pipe); 603 struct pipe_context *pipe = rb_pipe->pipe; 604 605 pipe_mutex_lock(rb_pipe->call_mutex); 606 pipe->set_stencil_ref(pipe, 607 stencil_ref); 608 pipe_mutex_unlock(rb_pipe->call_mutex); 609 } 610 611 static void 612 rbug_set_clip_state(struct pipe_context *_pipe, 613 const struct pipe_clip_state *clip) 614 { 615 struct rbug_context *rb_pipe = rbug_context(_pipe); 616 struct pipe_context *pipe = rb_pipe->pipe; 617 618 pipe_mutex_lock(rb_pipe->call_mutex); 619 pipe->set_clip_state(pipe, 620 clip); 621 pipe_mutex_unlock(rb_pipe->call_mutex); 622 } 623 624 static void 625 rbug_set_constant_buffer(struct pipe_context *_pipe, 626 uint shader, 627 uint index, 628 const struct pipe_constant_buffer *_cb) 629 { 630 struct rbug_context *rb_pipe = rbug_context(_pipe); 631 struct pipe_context *pipe = rb_pipe->pipe; 632 struct pipe_constant_buffer cb; 633 634 /* XXX hmm? unwrap the input state */ 635 if (_cb) { 636 cb = *_cb; 637 cb.buffer = rbug_resource_unwrap(_cb->buffer); 638 } 639 640 pipe_mutex_lock(rb_pipe->call_mutex); 641 pipe->set_constant_buffer(pipe, 642 shader, 643 index, 644 _cb ? &cb : NULL); 645 pipe_mutex_unlock(rb_pipe->call_mutex); 646 } 647 648 static void 649 rbug_set_framebuffer_state(struct pipe_context *_pipe, 650 const struct pipe_framebuffer_state *_state) 651 { 652 struct rbug_context *rb_pipe = rbug_context(_pipe); 653 struct pipe_context *pipe = rb_pipe->pipe; 654 struct pipe_framebuffer_state unwrapped_state; 655 struct pipe_framebuffer_state *state = NULL; 656 unsigned i; 657 658 /* must protect curr status */ 659 pipe_mutex_lock(rb_pipe->call_mutex); 660 661 rb_pipe->curr.nr_cbufs = 0; 662 memset(rb_pipe->curr.cbufs, 0, sizeof(rb_pipe->curr.cbufs)); 663 rb_pipe->curr.zsbuf = NULL; 664 665 /* unwrap the input state */ 666 if (_state) { 667 memcpy(&unwrapped_state, _state, sizeof(unwrapped_state)); 668 669 rb_pipe->curr.nr_cbufs = _state->nr_cbufs; 670 for(i = 0; i < _state->nr_cbufs; i++) { 671 unwrapped_state.cbufs[i] = rbug_surface_unwrap(_state->cbufs[i]); 672 if (_state->cbufs[i]) 673 rb_pipe->curr.cbufs[i] = rbug_resource(_state->cbufs[i]->texture); 674 } 675 unwrapped_state.zsbuf = rbug_surface_unwrap(_state->zsbuf); 676 if (_state->zsbuf) 677 rb_pipe->curr.zsbuf = rbug_resource(_state->zsbuf->texture); 678 state = &unwrapped_state; 679 } 680 681 pipe->set_framebuffer_state(pipe, 682 state); 683 684 pipe_mutex_unlock(rb_pipe->call_mutex); 685 } 686 687 static void 688 rbug_set_polygon_stipple(struct pipe_context *_pipe, 689 const struct pipe_poly_stipple *poly_stipple) 690 { 691 struct rbug_context *rb_pipe = rbug_context(_pipe); 692 struct pipe_context *pipe = rb_pipe->pipe; 693 694 pipe_mutex_lock(rb_pipe->call_mutex); 695 pipe->set_polygon_stipple(pipe, 696 poly_stipple); 697 pipe_mutex_unlock(rb_pipe->call_mutex); 698 } 699 700 static void 701 rbug_set_scissor_states(struct pipe_context *_pipe, 702 unsigned start_slot, 703 unsigned num_scissors, 704 const struct pipe_scissor_state *scissor) 705 { 706 struct rbug_context *rb_pipe = rbug_context(_pipe); 707 struct pipe_context *pipe = rb_pipe->pipe; 708 709 pipe_mutex_lock(rb_pipe->call_mutex); 710 pipe->set_scissor_states(pipe, start_slot, num_scissors, scissor); 711 pipe_mutex_unlock(rb_pipe->call_mutex); 712 } 713 714 static void 715 rbug_set_viewport_states(struct pipe_context *_pipe, 716 unsigned start_slot, 717 unsigned num_viewports, 718 const struct pipe_viewport_state *viewport) 719 { 720 struct rbug_context *rb_pipe = rbug_context(_pipe); 721 struct pipe_context *pipe = rb_pipe->pipe; 722 723 pipe_mutex_lock(rb_pipe->call_mutex); 724 pipe->set_viewport_states(pipe, start_slot, num_viewports, viewport); 725 pipe_mutex_unlock(rb_pipe->call_mutex); 726 } 727 728 static void 729 rbug_set_sampler_views(struct pipe_context *_pipe, 730 enum pipe_shader_type shader, 731 unsigned start, 732 unsigned num, 733 struct pipe_sampler_view **_views) 734 { 735 struct rbug_context *rb_pipe = rbug_context(_pipe); 736 struct pipe_context *pipe = rb_pipe->pipe; 737 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 738 struct pipe_sampler_view **views = NULL; 739 unsigned i; 740 741 assert(start == 0); /* XXX fix */ 742 743 /* must protect curr status */ 744 pipe_mutex_lock(rb_pipe->call_mutex); 745 746 rb_pipe->curr.num_views[shader] = 0; 747 memset(rb_pipe->curr.views[shader], 0, sizeof(rb_pipe->curr.views[shader])); 748 memset(rb_pipe->curr.texs[shader], 0, sizeof(rb_pipe->curr.texs[shader])); 749 memset(unwrapped_views, 0, sizeof(unwrapped_views)); 750 751 if (_views) { 752 rb_pipe->curr.num_views[shader] = num; 753 for (i = 0; i < num; i++) { 754 rb_pipe->curr.views[shader][i] = rbug_sampler_view(_views[i]); 755 rb_pipe->curr.texs[shader][i] = rbug_resource(_views[i] ? _views[i]->texture : NULL); 756 unwrapped_views[i] = rbug_sampler_view_unwrap(_views[i]); 757 } 758 views = unwrapped_views; 759 } 760 761 pipe->set_sampler_views(pipe, shader, start, num, views); 762 763 pipe_mutex_unlock(rb_pipe->call_mutex); 764 } 765 766 static void 767 rbug_set_vertex_buffers(struct pipe_context *_pipe, 768 unsigned start_slot, unsigned num_buffers, 769 const struct pipe_vertex_buffer *_buffers) 770 { 771 struct rbug_context *rb_pipe = rbug_context(_pipe); 772 struct pipe_context *pipe = rb_pipe->pipe; 773 struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS]; 774 struct pipe_vertex_buffer *buffers = NULL; 775 unsigned i; 776 777 pipe_mutex_lock(rb_pipe->call_mutex); 778 779 if (num_buffers && _buffers) { 780 memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers)); 781 for (i = 0; i < num_buffers; i++) 782 unwrapped_buffers[i].buffer = rbug_resource_unwrap(_buffers[i].buffer); 783 buffers = unwrapped_buffers; 784 } 785 786 pipe->set_vertex_buffers(pipe, start_slot, 787 num_buffers, 788 buffers); 789 790 pipe_mutex_unlock(rb_pipe->call_mutex); 791 } 792 793 static void 794 rbug_set_index_buffer(struct pipe_context *_pipe, 795 const struct pipe_index_buffer *_ib) 796 { 797 struct rbug_context *rb_pipe = rbug_context(_pipe); 798 struct pipe_context *pipe = rb_pipe->pipe; 799 struct pipe_index_buffer unwrapped_ib, *ib = NULL; 800 801 if (_ib) { 802 unwrapped_ib = *_ib; 803 unwrapped_ib.buffer = rbug_resource_unwrap(_ib->buffer); 804 ib = &unwrapped_ib; 805 } 806 807 pipe_mutex_lock(rb_pipe->call_mutex); 808 pipe->set_index_buffer(pipe, ib); 809 pipe_mutex_unlock(rb_pipe->call_mutex); 810 } 811 812 static void 813 rbug_set_sample_mask(struct pipe_context *_pipe, 814 unsigned sample_mask) 815 { 816 struct rbug_context *rb_pipe = rbug_context(_pipe); 817 struct pipe_context *pipe = rb_pipe->pipe; 818 819 pipe_mutex_lock(rb_pipe->call_mutex); 820 pipe->set_sample_mask(pipe, sample_mask); 821 pipe_mutex_unlock(rb_pipe->call_mutex); 822 } 823 824 static struct pipe_stream_output_target * 825 rbug_create_stream_output_target(struct pipe_context *_pipe, 826 struct pipe_resource *_res, 827 unsigned buffer_offset, unsigned buffer_size) 828 { 829 struct rbug_context *rb_pipe = rbug_context(_pipe); 830 struct pipe_context *pipe = rb_pipe->pipe; 831 struct pipe_resource *res = rbug_resource_unwrap(_res); 832 struct pipe_stream_output_target *target; 833 834 pipe_mutex_lock(rb_pipe->call_mutex); 835 target = pipe->create_stream_output_target(pipe, res, buffer_offset, 836 buffer_size); 837 pipe_mutex_unlock(rb_pipe->call_mutex); 838 return target; 839 } 840 841 static void 842 rbug_stream_output_target_destroy(struct pipe_context *_pipe, 843 struct pipe_stream_output_target *target) 844 { 845 struct rbug_context *rb_pipe = rbug_context(_pipe); 846 struct pipe_context *pipe = rb_pipe->pipe; 847 848 pipe_mutex_lock(rb_pipe->call_mutex); 849 pipe->stream_output_target_destroy(pipe, target); 850 pipe_mutex_unlock(rb_pipe->call_mutex); 851 } 852 853 static void 854 rbug_set_stream_output_targets(struct pipe_context *_pipe, 855 unsigned num_targets, 856 struct pipe_stream_output_target **targets, 857 const unsigned *offsets) 858 { 859 struct rbug_context *rb_pipe = rbug_context(_pipe); 860 struct pipe_context *pipe = rb_pipe->pipe; 861 862 pipe_mutex_lock(rb_pipe->call_mutex); 863 pipe->set_stream_output_targets(pipe, num_targets, targets, offsets); 864 pipe_mutex_unlock(rb_pipe->call_mutex); 865 } 866 867 static void 868 rbug_resource_copy_region(struct pipe_context *_pipe, 869 struct pipe_resource *_dst, 870 unsigned dst_level, 871 unsigned dstx, 872 unsigned dsty, 873 unsigned dstz, 874 struct pipe_resource *_src, 875 unsigned src_level, 876 const struct pipe_box *src_box) 877 { 878 struct rbug_context *rb_pipe = rbug_context(_pipe); 879 struct rbug_resource *rb_resource_dst = rbug_resource(_dst); 880 struct rbug_resource *rb_resource_src = rbug_resource(_src); 881 struct pipe_context *pipe = rb_pipe->pipe; 882 struct pipe_resource *dst = rb_resource_dst->resource; 883 struct pipe_resource *src = rb_resource_src->resource; 884 885 pipe_mutex_lock(rb_pipe->call_mutex); 886 pipe->resource_copy_region(pipe, 887 dst, 888 dst_level, 889 dstx, 890 dsty, 891 dstz, 892 src, 893 src_level, 894 src_box); 895 pipe_mutex_unlock(rb_pipe->call_mutex); 896 } 897 898 static void 899 rbug_blit(struct pipe_context *_pipe, const struct pipe_blit_info *_blit_info) 900 { 901 struct rbug_context *rb_pipe = rbug_context(_pipe); 902 struct rbug_resource *rb_resource_dst = rbug_resource(_blit_info->dst.resource); 903 struct rbug_resource *rb_resource_src = rbug_resource(_blit_info->src.resource); 904 struct pipe_context *pipe = rb_pipe->pipe; 905 struct pipe_resource *dst = rb_resource_dst->resource; 906 struct pipe_resource *src = rb_resource_src->resource; 907 struct pipe_blit_info blit_info; 908 909 blit_info = *_blit_info; 910 blit_info.dst.resource = dst; 911 blit_info.src.resource = src; 912 913 pipe_mutex_lock(rb_pipe->call_mutex); 914 pipe->blit(pipe, &blit_info); 915 pipe_mutex_unlock(rb_pipe->call_mutex); 916 } 917 918 static void 919 rbug_flush_resource(struct pipe_context *_pipe, 920 struct pipe_resource *_res) 921 { 922 struct rbug_context *rb_pipe = rbug_context(_pipe); 923 struct rbug_resource *rb_resource_res = rbug_resource(_res); 924 struct pipe_context *pipe = rb_pipe->pipe; 925 struct pipe_resource *res = rb_resource_res->resource; 926 927 pipe_mutex_lock(rb_pipe->call_mutex); 928 pipe->flush_resource(pipe, res); 929 pipe_mutex_unlock(rb_pipe->call_mutex); 930 } 931 932 static void 933 rbug_clear(struct pipe_context *_pipe, 934 unsigned buffers, 935 const union pipe_color_union *color, 936 double depth, 937 unsigned stencil) 938 { 939 struct rbug_context *rb_pipe = rbug_context(_pipe); 940 struct pipe_context *pipe = rb_pipe->pipe; 941 942 pipe_mutex_lock(rb_pipe->call_mutex); 943 pipe->clear(pipe, 944 buffers, 945 color, 946 depth, 947 stencil); 948 pipe_mutex_unlock(rb_pipe->call_mutex); 949 } 950 951 static void 952 rbug_clear_render_target(struct pipe_context *_pipe, 953 struct pipe_surface *_dst, 954 const union pipe_color_union *color, 955 unsigned dstx, unsigned dsty, 956 unsigned width, unsigned height, 957 bool render_condition_enabled) 958 { 959 struct rbug_context *rb_pipe = rbug_context(_pipe); 960 struct rbug_surface *rb_surface_dst = rbug_surface(_dst); 961 struct pipe_context *pipe = rb_pipe->pipe; 962 struct pipe_surface *dst = rb_surface_dst->surface; 963 964 pipe_mutex_lock(rb_pipe->call_mutex); 965 pipe->clear_render_target(pipe, 966 dst, 967 color, 968 dstx, 969 dsty, 970 width, 971 height, 972 render_condition_enabled); 973 pipe_mutex_unlock(rb_pipe->call_mutex); 974 } 975 976 static void 977 rbug_clear_depth_stencil(struct pipe_context *_pipe, 978 struct pipe_surface *_dst, 979 unsigned clear_flags, 980 double depth, 981 unsigned stencil, 982 unsigned dstx, unsigned dsty, 983 unsigned width, unsigned height, 984 bool render_condition_enabled) 985 { 986 struct rbug_context *rb_pipe = rbug_context(_pipe); 987 struct rbug_surface *rb_surface_dst = rbug_surface(_dst); 988 struct pipe_context *pipe = rb_pipe->pipe; 989 struct pipe_surface *dst = rb_surface_dst->surface; 990 991 pipe_mutex_lock(rb_pipe->call_mutex); 992 pipe->clear_depth_stencil(pipe, 993 dst, 994 clear_flags, 995 depth, 996 stencil, 997 dstx, 998 dsty, 999 width, 1000 height, 1001 render_condition_enabled); 1002 pipe_mutex_unlock(rb_pipe->call_mutex); 1003 } 1004 1005 static void 1006 rbug_flush(struct pipe_context *_pipe, 1007 struct pipe_fence_handle **fence, 1008 unsigned flags) 1009 { 1010 struct rbug_context *rb_pipe = rbug_context(_pipe); 1011 struct pipe_context *pipe = rb_pipe->pipe; 1012 1013 pipe_mutex_lock(rb_pipe->call_mutex); 1014 pipe->flush(pipe, fence, flags); 1015 pipe_mutex_unlock(rb_pipe->call_mutex); 1016 } 1017 1018 static struct pipe_sampler_view * 1019 rbug_context_create_sampler_view(struct pipe_context *_pipe, 1020 struct pipe_resource *_resource, 1021 const struct pipe_sampler_view *templ) 1022 { 1023 struct rbug_context *rb_pipe = rbug_context(_pipe); 1024 struct rbug_resource *rb_resource = rbug_resource(_resource); 1025 struct pipe_context *pipe = rb_pipe->pipe; 1026 struct pipe_resource *resource = rb_resource->resource; 1027 struct pipe_sampler_view *result; 1028 1029 pipe_mutex_lock(rb_pipe->call_mutex); 1030 result = pipe->create_sampler_view(pipe, 1031 resource, 1032 templ); 1033 pipe_mutex_unlock(rb_pipe->call_mutex); 1034 1035 if (result) 1036 return rbug_sampler_view_create(rb_pipe, rb_resource, result); 1037 return NULL; 1038 } 1039 1040 static void 1041 rbug_context_sampler_view_destroy(struct pipe_context *_pipe, 1042 struct pipe_sampler_view *_view) 1043 { 1044 rbug_sampler_view_destroy(rbug_context(_pipe), 1045 rbug_sampler_view(_view)); 1046 } 1047 1048 static struct pipe_surface * 1049 rbug_context_create_surface(struct pipe_context *_pipe, 1050 struct pipe_resource *_resource, 1051 const struct pipe_surface *surf_tmpl) 1052 { 1053 struct rbug_context *rb_pipe = rbug_context(_pipe); 1054 struct rbug_resource *rb_resource = rbug_resource(_resource); 1055 struct pipe_context *pipe = rb_pipe->pipe; 1056 struct pipe_resource *resource = rb_resource->resource; 1057 struct pipe_surface *result; 1058 1059 pipe_mutex_lock(rb_pipe->call_mutex); 1060 result = pipe->create_surface(pipe, 1061 resource, 1062 surf_tmpl); 1063 pipe_mutex_unlock(rb_pipe->call_mutex); 1064 1065 if (result) 1066 return rbug_surface_create(rb_pipe, rb_resource, result); 1067 return NULL; 1068 } 1069 1070 static void 1071 rbug_context_surface_destroy(struct pipe_context *_pipe, 1072 struct pipe_surface *_surface) 1073 { 1074 struct rbug_context *rb_pipe = rbug_context(_pipe); 1075 struct rbug_surface *rb_surface = rbug_surface(_surface); 1076 1077 pipe_mutex_lock(rb_pipe->call_mutex); 1078 rbug_surface_destroy(rb_pipe, 1079 rb_surface); 1080 pipe_mutex_unlock(rb_pipe->call_mutex); 1081 } 1082 1083 1084 1085 static void * 1086 rbug_context_transfer_map(struct pipe_context *_context, 1087 struct pipe_resource *_resource, 1088 unsigned level, 1089 unsigned usage, 1090 const struct pipe_box *box, 1091 struct pipe_transfer **transfer) 1092 { 1093 struct rbug_context *rb_pipe = rbug_context(_context); 1094 struct rbug_resource *rb_resource = rbug_resource(_resource); 1095 struct pipe_context *context = rb_pipe->pipe; 1096 struct pipe_resource *resource = rb_resource->resource; 1097 struct pipe_transfer *result; 1098 void *map; 1099 1100 pipe_mutex_lock(rb_pipe->call_mutex); 1101 map = context->transfer_map(context, 1102 resource, 1103 level, 1104 usage, 1105 box, &result); 1106 pipe_mutex_unlock(rb_pipe->call_mutex); 1107 1108 *transfer = rbug_transfer_create(rb_pipe, rb_resource, result); 1109 return *transfer ? map : NULL; 1110 } 1111 1112 static void 1113 rbug_context_transfer_flush_region(struct pipe_context *_context, 1114 struct pipe_transfer *_transfer, 1115 const struct pipe_box *box) 1116 { 1117 struct rbug_context *rb_pipe = rbug_context(_context); 1118 struct rbug_transfer *rb_transfer = rbug_transfer(_transfer); 1119 struct pipe_context *context = rb_pipe->pipe; 1120 struct pipe_transfer *transfer = rb_transfer->transfer; 1121 1122 pipe_mutex_lock(rb_pipe->call_mutex); 1123 context->transfer_flush_region(context, 1124 transfer, 1125 box); 1126 pipe_mutex_unlock(rb_pipe->call_mutex); 1127 } 1128 1129 1130 static void 1131 rbug_context_transfer_unmap(struct pipe_context *_context, 1132 struct pipe_transfer *_transfer) 1133 { 1134 struct rbug_context *rb_pipe = rbug_context(_context); 1135 struct rbug_transfer *rb_transfer = rbug_transfer(_transfer); 1136 struct pipe_context *context = rb_pipe->pipe; 1137 struct pipe_transfer *transfer = rb_transfer->transfer; 1138 1139 pipe_mutex_lock(rb_pipe->call_mutex); 1140 context->transfer_unmap(context, 1141 transfer); 1142 rbug_transfer_destroy(rb_pipe, 1143 rb_transfer); 1144 pipe_mutex_unlock(rb_pipe->call_mutex); 1145 } 1146 1147 1148 static void 1149 rbug_context_buffer_subdata(struct pipe_context *_context, 1150 struct pipe_resource *_resource, 1151 unsigned usage, unsigned offset, 1152 unsigned size, const void *data) 1153 { 1154 struct rbug_context *rb_pipe = rbug_context(_context); 1155 struct rbug_resource *rb_resource = rbug_resource(_resource); 1156 struct pipe_context *context = rb_pipe->pipe; 1157 struct pipe_resource *resource = rb_resource->resource; 1158 1159 pipe_mutex_lock(rb_pipe->call_mutex); 1160 context->buffer_subdata(context, resource, usage, offset, size, data); 1161 pipe_mutex_unlock(rb_pipe->call_mutex); 1162 } 1163 1164 1165 static void 1166 rbug_context_texture_subdata(struct pipe_context *_context, 1167 struct pipe_resource *_resource, 1168 unsigned level, 1169 unsigned usage, 1170 const struct pipe_box *box, 1171 const void *data, 1172 unsigned stride, 1173 unsigned layer_stride) 1174 { 1175 struct rbug_context *rb_pipe = rbug_context(_context); 1176 struct rbug_resource *rb_resource = rbug_resource(_resource); 1177 struct pipe_context *context = rb_pipe->pipe; 1178 struct pipe_resource *resource = rb_resource->resource; 1179 1180 pipe_mutex_lock(rb_pipe->call_mutex); 1181 context->texture_subdata(context, 1182 resource, 1183 level, 1184 usage, 1185 box, 1186 data, 1187 stride, 1188 layer_stride); 1189 pipe_mutex_unlock(rb_pipe->call_mutex); 1190 } 1191 1192 1193 struct pipe_context * 1194 rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) 1195 { 1196 struct rbug_context *rb_pipe; 1197 struct rbug_screen *rb_screen = rbug_screen(_screen); 1198 1199 if (!rb_screen) 1200 return NULL; 1201 1202 rb_pipe = CALLOC_STRUCT(rbug_context); 1203 if (!rb_pipe) 1204 return NULL; 1205 1206 pipe_mutex_init(rb_pipe->draw_mutex); 1207 pipe_condvar_init(rb_pipe->draw_cond); 1208 pipe_mutex_init(rb_pipe->call_mutex); 1209 pipe_mutex_init(rb_pipe->list_mutex); 1210 make_empty_list(&rb_pipe->shaders); 1211 1212 rb_pipe->base.screen = _screen; 1213 rb_pipe->base.priv = pipe->priv; /* expose wrapped data */ 1214 rb_pipe->base.draw = NULL; 1215 1216 rb_pipe->base.destroy = rbug_destroy; 1217 rb_pipe->base.draw_vbo = rbug_draw_vbo; 1218 rb_pipe->base.create_query = rbug_create_query; 1219 rb_pipe->base.destroy_query = rbug_destroy_query; 1220 rb_pipe->base.begin_query = rbug_begin_query; 1221 rb_pipe->base.end_query = rbug_end_query; 1222 rb_pipe->base.get_query_result = rbug_get_query_result; 1223 rb_pipe->base.set_active_query_state = rbug_set_active_query_state; 1224 rb_pipe->base.create_blend_state = rbug_create_blend_state; 1225 rb_pipe->base.bind_blend_state = rbug_bind_blend_state; 1226 rb_pipe->base.delete_blend_state = rbug_delete_blend_state; 1227 rb_pipe->base.create_sampler_state = rbug_create_sampler_state; 1228 rb_pipe->base.bind_sampler_states = rbug_bind_sampler_states; 1229 rb_pipe->base.delete_sampler_state = rbug_delete_sampler_state; 1230 rb_pipe->base.create_rasterizer_state = rbug_create_rasterizer_state; 1231 rb_pipe->base.bind_rasterizer_state = rbug_bind_rasterizer_state; 1232 rb_pipe->base.delete_rasterizer_state = rbug_delete_rasterizer_state; 1233 rb_pipe->base.create_depth_stencil_alpha_state = rbug_create_depth_stencil_alpha_state; 1234 rb_pipe->base.bind_depth_stencil_alpha_state = rbug_bind_depth_stencil_alpha_state; 1235 rb_pipe->base.delete_depth_stencil_alpha_state = rbug_delete_depth_stencil_alpha_state; 1236 rb_pipe->base.create_fs_state = rbug_create_fs_state; 1237 rb_pipe->base.bind_fs_state = rbug_bind_fs_state; 1238 rb_pipe->base.delete_fs_state = rbug_delete_fs_state; 1239 rb_pipe->base.create_vs_state = rbug_create_vs_state; 1240 rb_pipe->base.bind_vs_state = rbug_bind_vs_state; 1241 rb_pipe->base.delete_vs_state = rbug_delete_vs_state; 1242 rb_pipe->base.create_gs_state = rbug_create_gs_state; 1243 rb_pipe->base.bind_gs_state = rbug_bind_gs_state; 1244 rb_pipe->base.delete_gs_state = rbug_delete_gs_state; 1245 rb_pipe->base.create_vertex_elements_state = rbug_create_vertex_elements_state; 1246 rb_pipe->base.bind_vertex_elements_state = rbug_bind_vertex_elements_state; 1247 rb_pipe->base.delete_vertex_elements_state = rbug_delete_vertex_elements_state; 1248 rb_pipe->base.set_blend_color = rbug_set_blend_color; 1249 rb_pipe->base.set_stencil_ref = rbug_set_stencil_ref; 1250 rb_pipe->base.set_clip_state = rbug_set_clip_state; 1251 rb_pipe->base.set_constant_buffer = rbug_set_constant_buffer; 1252 rb_pipe->base.set_framebuffer_state = rbug_set_framebuffer_state; 1253 rb_pipe->base.set_polygon_stipple = rbug_set_polygon_stipple; 1254 rb_pipe->base.set_scissor_states = rbug_set_scissor_states; 1255 rb_pipe->base.set_viewport_states = rbug_set_viewport_states; 1256 rb_pipe->base.set_sampler_views = rbug_set_sampler_views; 1257 rb_pipe->base.set_vertex_buffers = rbug_set_vertex_buffers; 1258 rb_pipe->base.set_index_buffer = rbug_set_index_buffer; 1259 rb_pipe->base.set_sample_mask = rbug_set_sample_mask; 1260 rb_pipe->base.create_stream_output_target = rbug_create_stream_output_target; 1261 rb_pipe->base.stream_output_target_destroy = rbug_stream_output_target_destroy; 1262 rb_pipe->base.set_stream_output_targets = rbug_set_stream_output_targets; 1263 rb_pipe->base.resource_copy_region = rbug_resource_copy_region; 1264 rb_pipe->base.blit = rbug_blit; 1265 rb_pipe->base.flush_resource = rbug_flush_resource; 1266 rb_pipe->base.clear = rbug_clear; 1267 rb_pipe->base.clear_render_target = rbug_clear_render_target; 1268 rb_pipe->base.clear_depth_stencil = rbug_clear_depth_stencil; 1269 rb_pipe->base.flush = rbug_flush; 1270 rb_pipe->base.create_sampler_view = rbug_context_create_sampler_view; 1271 rb_pipe->base.sampler_view_destroy = rbug_context_sampler_view_destroy; 1272 rb_pipe->base.create_surface = rbug_context_create_surface; 1273 rb_pipe->base.surface_destroy = rbug_context_surface_destroy; 1274 rb_pipe->base.transfer_map = rbug_context_transfer_map; 1275 rb_pipe->base.transfer_unmap = rbug_context_transfer_unmap; 1276 rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region; 1277 rb_pipe->base.buffer_subdata = rbug_context_buffer_subdata; 1278 rb_pipe->base.texture_subdata = rbug_context_texture_subdata; 1279 1280 rb_pipe->pipe = pipe; 1281 1282 rbug_screen_add_to_list(rb_screen, contexts, rb_pipe); 1283 1284 if (debug_get_bool_option("GALLIUM_RBUG_START_BLOCKED", FALSE)) { 1285 rb_pipe->draw_blocked = RBUG_BLOCK_BEFORE; 1286 } 1287 1288 return &rb_pipe->base; 1289 } 1290