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