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