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