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