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