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