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