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