1 /**************************************************************************
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
28 #include "util/u_inlines.h"
29 #include "util/u_memory.h"
30 #include "util/u_simple_list.h"
32 #include "pipe/p_format.h"
33 #include "pipe/p_screen.h"
36 #include "tr_dump_state.h"
37 #include "tr_public.h"
38 #include "tr_screen.h"
39 #include "tr_texture.h"
40 #include "tr_context.h"
46 static INLINE
struct pipe_resource
*
47 trace_resource_unwrap(struct trace_context
*tr_ctx
,
48 struct pipe_resource
*resource
)
50 struct trace_resource
*tr_tex
;
55 tr_tex
= trace_resource(resource
);
57 assert(tr_tex
->resource
);
58 return tr_tex
->resource
;
62 static INLINE
struct pipe_surface
*
63 trace_surface_unwrap(struct trace_context
*tr_ctx
,
64 struct pipe_surface
*surface
)
66 struct trace_screen
*tr_scr
= trace_screen(tr_ctx
->base
.screen
);
67 struct trace_surface
*tr_surf
;
72 assert(surface
->texture
);
76 tr_surf
= trace_surface(surface
);
78 assert(tr_surf
->surface
);
79 assert(tr_surf
->surface
->texture
->screen
== tr_scr
->screen
);
81 return tr_surf
->surface
;
86 trace_context_draw_vbo(struct pipe_context
*_pipe
,
87 const struct pipe_draw_info
*info
)
89 struct trace_context
*tr_ctx
= trace_context(_pipe
);
90 struct pipe_context
*pipe
= tr_ctx
->pipe
;
92 trace_dump_call_begin("pipe_context", "draw_vbo");
94 trace_dump_arg(ptr
, pipe
);
95 trace_dump_arg(draw_info
, info
);
97 pipe
->draw_vbo(pipe
, info
);
99 trace_dump_call_end();
103 static INLINE
struct pipe_query
*
104 trace_context_create_query(struct pipe_context
*_pipe
,
107 struct trace_context
*tr_ctx
= trace_context(_pipe
);
108 struct pipe_context
*pipe
= tr_ctx
->pipe
;
109 struct pipe_query
*result
;
111 trace_dump_call_begin("pipe_context", "create_query");
113 trace_dump_arg(ptr
, pipe
);
114 trace_dump_arg(uint
, query_type
);
116 result
= pipe
->create_query(pipe
, query_type
);
118 trace_dump_ret(ptr
, result
);
120 trace_dump_call_end();
127 trace_context_destroy_query(struct pipe_context
*_pipe
,
128 struct pipe_query
*query
)
130 struct trace_context
*tr_ctx
= trace_context(_pipe
);
131 struct pipe_context
*pipe
= tr_ctx
->pipe
;
133 trace_dump_call_begin("pipe_context", "destroy_query");
135 trace_dump_arg(ptr
, pipe
);
136 trace_dump_arg(ptr
, query
);
138 pipe
->destroy_query(pipe
, query
);
140 trace_dump_call_end();
145 trace_context_begin_query(struct pipe_context
*_pipe
,
146 struct pipe_query
*query
)
148 struct trace_context
*tr_ctx
= trace_context(_pipe
);
149 struct pipe_context
*pipe
= tr_ctx
->pipe
;
151 trace_dump_call_begin("pipe_context", "begin_query");
153 trace_dump_arg(ptr
, pipe
);
154 trace_dump_arg(ptr
, query
);
156 pipe
->begin_query(pipe
, query
);
158 trace_dump_call_end();
163 trace_context_end_query(struct pipe_context
*_pipe
,
164 struct pipe_query
*query
)
166 struct trace_context
*tr_ctx
= trace_context(_pipe
);
167 struct pipe_context
*pipe
= tr_ctx
->pipe
;
169 trace_dump_call_begin("pipe_context", "end_query");
171 trace_dump_arg(ptr
, pipe
);
172 trace_dump_arg(ptr
, query
);
174 pipe
->end_query(pipe
, query
);
176 trace_dump_call_end();
180 static INLINE boolean
181 trace_context_get_query_result(struct pipe_context
*_pipe
,
182 struct pipe_query
*query
,
186 struct trace_context
*tr_ctx
= trace_context(_pipe
);
187 struct pipe_context
*pipe
= tr_ctx
->pipe
;
191 trace_dump_call_begin("pipe_context", "get_query_result");
193 trace_dump_arg(ptr
, pipe
);
195 _result
= pipe
->get_query_result(pipe
, query
, wait
, presult
);
196 result
= *((uint64_t*)presult
);
198 trace_dump_arg(uint
, result
);
199 trace_dump_ret(bool, _result
);
201 trace_dump_call_end();
208 trace_context_create_blend_state(struct pipe_context
*_pipe
,
209 const struct pipe_blend_state
*state
)
211 struct trace_context
*tr_ctx
= trace_context(_pipe
);
212 struct pipe_context
*pipe
= tr_ctx
->pipe
;
215 trace_dump_call_begin("pipe_context", "create_blend_state");
217 trace_dump_arg(ptr
, pipe
);
218 trace_dump_arg(blend_state
, state
);
220 result
= pipe
->create_blend_state(pipe
, state
);
222 trace_dump_ret(ptr
, result
);
224 trace_dump_call_end();
231 trace_context_bind_blend_state(struct pipe_context
*_pipe
,
234 struct trace_context
*tr_ctx
= trace_context(_pipe
);
235 struct pipe_context
*pipe
= tr_ctx
->pipe
;
237 trace_dump_call_begin("pipe_context", "bind_blend_state");
239 trace_dump_arg(ptr
, pipe
);
240 trace_dump_arg(ptr
, state
);
242 pipe
->bind_blend_state(pipe
, state
);
244 trace_dump_call_end();
249 trace_context_delete_blend_state(struct pipe_context
*_pipe
,
252 struct trace_context
*tr_ctx
= trace_context(_pipe
);
253 struct pipe_context
*pipe
= tr_ctx
->pipe
;
255 trace_dump_call_begin("pipe_context", "delete_blend_state");
257 trace_dump_arg(ptr
, pipe
);
258 trace_dump_arg(ptr
, state
);
260 pipe
->delete_blend_state(pipe
, state
);
262 trace_dump_call_end();
267 trace_context_create_sampler_state(struct pipe_context
*_pipe
,
268 const struct pipe_sampler_state
*state
)
270 struct trace_context
*tr_ctx
= trace_context(_pipe
);
271 struct pipe_context
*pipe
= tr_ctx
->pipe
;
274 trace_dump_call_begin("pipe_context", "create_sampler_state");
276 trace_dump_arg(ptr
, pipe
);
277 trace_dump_arg(sampler_state
, state
);
279 result
= pipe
->create_sampler_state(pipe
, state
);
281 trace_dump_ret(ptr
, result
);
283 trace_dump_call_end();
290 trace_context_bind_fragment_sampler_states(struct pipe_context
*_pipe
,
294 struct trace_context
*tr_ctx
= trace_context(_pipe
);
295 struct pipe_context
*pipe
= tr_ctx
->pipe
;
297 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
299 trace_dump_arg(ptr
, pipe
);
300 trace_dump_arg(uint
, num_states
);
301 trace_dump_arg_array(ptr
, states
, num_states
);
303 pipe
->bind_fragment_sampler_states(pipe
, num_states
, states
);
305 trace_dump_call_end();
310 trace_context_bind_vertex_sampler_states(struct pipe_context
*_pipe
,
314 struct trace_context
*tr_ctx
= trace_context(_pipe
);
315 struct pipe_context
*pipe
= tr_ctx
->pipe
;
317 if (!pipe
->bind_vertex_sampler_states
)
320 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
322 trace_dump_arg(ptr
, pipe
);
323 trace_dump_arg(uint
, num_states
);
324 trace_dump_arg_array(ptr
, states
, num_states
);
326 pipe
->bind_vertex_sampler_states(pipe
, num_states
, states
);
328 trace_dump_call_end();
333 trace_context_delete_sampler_state(struct pipe_context
*_pipe
,
336 struct trace_context
*tr_ctx
= trace_context(_pipe
);
337 struct pipe_context
*pipe
= tr_ctx
->pipe
;
339 trace_dump_call_begin("pipe_context", "delete_sampler_state");
341 trace_dump_arg(ptr
, pipe
);
342 trace_dump_arg(ptr
, state
);
344 pipe
->delete_sampler_state(pipe
, state
);
346 trace_dump_call_end();
351 trace_context_create_rasterizer_state(struct pipe_context
*_pipe
,
352 const struct pipe_rasterizer_state
*state
)
354 struct trace_context
*tr_ctx
= trace_context(_pipe
);
355 struct pipe_context
*pipe
= tr_ctx
->pipe
;
358 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
360 trace_dump_arg(ptr
, pipe
);
361 trace_dump_arg(rasterizer_state
, state
);
363 result
= pipe
->create_rasterizer_state(pipe
, state
);
365 trace_dump_ret(ptr
, result
);
367 trace_dump_call_end();
374 trace_context_bind_rasterizer_state(struct pipe_context
*_pipe
,
377 struct trace_context
*tr_ctx
= trace_context(_pipe
);
378 struct pipe_context
*pipe
= tr_ctx
->pipe
;
380 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
382 trace_dump_arg(ptr
, pipe
);
383 trace_dump_arg(ptr
, state
);
385 pipe
->bind_rasterizer_state(pipe
, state
);
387 trace_dump_call_end();
392 trace_context_delete_rasterizer_state(struct pipe_context
*_pipe
,
395 struct trace_context
*tr_ctx
= trace_context(_pipe
);
396 struct pipe_context
*pipe
= tr_ctx
->pipe
;
398 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
400 trace_dump_arg(ptr
, pipe
);
401 trace_dump_arg(ptr
, state
);
403 pipe
->delete_rasterizer_state(pipe
, state
);
405 trace_dump_call_end();
410 trace_context_create_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
411 const struct pipe_depth_stencil_alpha_state
*state
)
413 struct trace_context
*tr_ctx
= trace_context(_pipe
);
414 struct pipe_context
*pipe
= tr_ctx
->pipe
;
417 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
419 result
= pipe
->create_depth_stencil_alpha_state(pipe
, state
);
421 trace_dump_arg(ptr
, pipe
);
422 trace_dump_arg(depth_stencil_alpha_state
, state
);
424 trace_dump_ret(ptr
, result
);
426 trace_dump_call_end();
433 trace_context_bind_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
436 struct trace_context
*tr_ctx
= trace_context(_pipe
);
437 struct pipe_context
*pipe
= tr_ctx
->pipe
;
439 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
441 trace_dump_arg(ptr
, pipe
);
442 trace_dump_arg(ptr
, state
);
444 pipe
->bind_depth_stencil_alpha_state(pipe
, state
);
446 trace_dump_call_end();
451 trace_context_delete_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
454 struct trace_context
*tr_ctx
= trace_context(_pipe
);
455 struct pipe_context
*pipe
= tr_ctx
->pipe
;
457 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
459 trace_dump_arg(ptr
, pipe
);
460 trace_dump_arg(ptr
, state
);
462 pipe
->delete_depth_stencil_alpha_state(pipe
, state
);
464 trace_dump_call_end();
469 trace_context_create_fs_state(struct pipe_context
*_pipe
,
470 const struct pipe_shader_state
*state
)
472 struct trace_context
*tr_ctx
= trace_context(_pipe
);
473 struct pipe_context
*pipe
= tr_ctx
->pipe
;
476 trace_dump_call_begin("pipe_context", "create_fs_state");
478 trace_dump_arg(ptr
, pipe
);
479 trace_dump_arg(shader_state
, state
);
481 result
= pipe
->create_fs_state(pipe
, state
);
483 trace_dump_ret(ptr
, result
);
485 trace_dump_call_end();
492 trace_context_bind_fs_state(struct pipe_context
*_pipe
,
495 struct trace_context
*tr_ctx
= trace_context(_pipe
);
496 struct pipe_context
*pipe
= tr_ctx
->pipe
;
498 trace_dump_call_begin("pipe_context", "bind_fs_state");
500 trace_dump_arg(ptr
, pipe
);
501 trace_dump_arg(ptr
, state
);
503 pipe
->bind_fs_state(pipe
, state
);
505 trace_dump_call_end();
510 trace_context_delete_fs_state(struct pipe_context
*_pipe
,
513 struct trace_context
*tr_ctx
= trace_context(_pipe
);
514 struct pipe_context
*pipe
= tr_ctx
->pipe
;
516 trace_dump_call_begin("pipe_context", "delete_fs_state");
518 trace_dump_arg(ptr
, pipe
);
519 trace_dump_arg(ptr
, state
);
521 pipe
->delete_fs_state(pipe
, state
);
523 trace_dump_call_end();
528 trace_context_create_vs_state(struct pipe_context
*_pipe
,
529 const struct pipe_shader_state
*state
)
531 struct trace_context
*tr_ctx
= trace_context(_pipe
);
532 struct pipe_context
*pipe
= tr_ctx
->pipe
;
535 trace_dump_call_begin("pipe_context", "create_vs_state");
537 trace_dump_arg(ptr
, pipe
);
538 trace_dump_arg(shader_state
, state
);
540 result
= pipe
->create_vs_state(pipe
, state
);
542 trace_dump_ret(ptr
, result
);
544 trace_dump_call_end();
551 trace_context_bind_vs_state(struct pipe_context
*_pipe
,
554 struct trace_context
*tr_ctx
= trace_context(_pipe
);
555 struct pipe_context
*pipe
= tr_ctx
->pipe
;
557 trace_dump_call_begin("pipe_context", "bind_vs_state");
559 trace_dump_arg(ptr
, pipe
);
560 trace_dump_arg(ptr
, state
);
562 pipe
->bind_vs_state(pipe
, state
);
564 trace_dump_call_end();
569 trace_context_delete_vs_state(struct pipe_context
*_pipe
,
572 struct trace_context
*tr_ctx
= trace_context(_pipe
);
573 struct pipe_context
*pipe
= tr_ctx
->pipe
;
575 trace_dump_call_begin("pipe_context", "delete_vs_state");
577 trace_dump_arg(ptr
, pipe
);
578 trace_dump_arg(ptr
, state
);
580 pipe
->delete_vs_state(pipe
, state
);
582 trace_dump_call_end();
587 trace_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
588 unsigned num_elements
,
589 const struct pipe_vertex_element
*elements
)
591 struct trace_context
*tr_ctx
= trace_context(_pipe
);
592 struct pipe_context
*pipe
= tr_ctx
->pipe
;
595 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
597 trace_dump_arg(ptr
, pipe
);
598 trace_dump_arg(uint
, num_elements
);
600 trace_dump_arg_begin("elements");
601 trace_dump_struct_array(vertex_element
, elements
, num_elements
);
602 trace_dump_arg_end();
604 result
= pipe
->create_vertex_elements_state(pipe
, num_elements
, elements
);
606 trace_dump_ret(ptr
, result
);
608 trace_dump_call_end();
615 trace_context_bind_vertex_elements_state(struct pipe_context
*_pipe
,
618 struct trace_context
*tr_ctx
= trace_context(_pipe
);
619 struct pipe_context
*pipe
= tr_ctx
->pipe
;
621 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
623 trace_dump_arg(ptr
, pipe
);
624 trace_dump_arg(ptr
, state
);
626 pipe
->bind_vertex_elements_state(pipe
, state
);
628 trace_dump_call_end();
633 trace_context_delete_vertex_elements_state(struct pipe_context
*_pipe
,
636 struct trace_context
*tr_ctx
= trace_context(_pipe
);
637 struct pipe_context
*pipe
= tr_ctx
->pipe
;
639 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
641 trace_dump_arg(ptr
, pipe
);
642 trace_dump_arg(ptr
, state
);
644 pipe
->delete_vertex_elements_state(pipe
, state
);
646 trace_dump_call_end();
651 trace_context_set_blend_color(struct pipe_context
*_pipe
,
652 const struct pipe_blend_color
*state
)
654 struct trace_context
*tr_ctx
= trace_context(_pipe
);
655 struct pipe_context
*pipe
= tr_ctx
->pipe
;
657 trace_dump_call_begin("pipe_context", "set_blend_color");
659 trace_dump_arg(ptr
, pipe
);
660 trace_dump_arg(blend_color
, state
);
662 pipe
->set_blend_color(pipe
, state
);
664 trace_dump_call_end();
669 trace_context_set_stencil_ref(struct pipe_context
*_pipe
,
670 const struct pipe_stencil_ref
*state
)
672 struct trace_context
*tr_ctx
= trace_context(_pipe
);
673 struct pipe_context
*pipe
= tr_ctx
->pipe
;
675 trace_dump_call_begin("pipe_context", "set_stencil_ref");
677 trace_dump_arg(ptr
, pipe
);
678 trace_dump_arg(stencil_ref
, state
);
680 pipe
->set_stencil_ref(pipe
, state
);
682 trace_dump_call_end();
687 trace_context_set_clip_state(struct pipe_context
*_pipe
,
688 const struct pipe_clip_state
*state
)
690 struct trace_context
*tr_ctx
= trace_context(_pipe
);
691 struct pipe_context
*pipe
= tr_ctx
->pipe
;
693 trace_dump_call_begin("pipe_context", "set_clip_state");
695 trace_dump_arg(ptr
, pipe
);
696 trace_dump_arg(clip_state
, state
);
698 pipe
->set_clip_state(pipe
, state
);
700 trace_dump_call_end();
704 trace_context_set_sample_mask(struct pipe_context
*_pipe
,
705 unsigned sample_mask
)
707 struct trace_context
*tr_ctx
= trace_context(_pipe
);
708 struct pipe_context
*pipe
= tr_ctx
->pipe
;
710 trace_dump_call_begin("pipe_context", "set_sample_mask");
712 trace_dump_arg(ptr
, pipe
);
713 trace_dump_arg(uint
, sample_mask
);
715 pipe
->set_sample_mask(pipe
, sample_mask
);
717 trace_dump_call_end();
721 trace_context_set_constant_buffer(struct pipe_context
*_pipe
,
722 uint shader
, uint index
,
723 struct pipe_resource
*buffer
)
725 struct trace_context
*tr_ctx
= trace_context(_pipe
);
726 struct pipe_context
*pipe
= tr_ctx
->pipe
;
729 buffer
= trace_resource_unwrap(tr_ctx
, buffer
);
732 trace_dump_call_begin("pipe_context", "set_constant_buffer");
734 trace_dump_arg(ptr
, pipe
);
735 trace_dump_arg(uint
, shader
);
736 trace_dump_arg(uint
, index
);
737 trace_dump_arg(ptr
, buffer
);
739 pipe
->set_constant_buffer(pipe
, shader
, index
, buffer
);
741 trace_dump_call_end();
746 trace_context_set_framebuffer_state(struct pipe_context
*_pipe
,
747 const struct pipe_framebuffer_state
*state
)
749 struct trace_context
*tr_ctx
= trace_context(_pipe
);
750 struct pipe_context
*pipe
= tr_ctx
->pipe
;
751 struct pipe_framebuffer_state unwrapped_state
;
755 /* Unwrap the input state */
756 memcpy(&unwrapped_state
, state
, sizeof(unwrapped_state
));
757 for(i
= 0; i
< state
->nr_cbufs
; ++i
)
758 unwrapped_state
.cbufs
[i
] = trace_surface_unwrap(tr_ctx
, state
->cbufs
[i
]);
759 for(i
= state
->nr_cbufs
; i
< PIPE_MAX_COLOR_BUFS
; ++i
)
760 unwrapped_state
.cbufs
[i
] = NULL
;
761 unwrapped_state
.zsbuf
= trace_surface_unwrap(tr_ctx
, state
->zsbuf
);
762 state
= &unwrapped_state
;
764 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
766 trace_dump_arg(ptr
, pipe
);
767 trace_dump_arg(framebuffer_state
, state
);
769 pipe
->set_framebuffer_state(pipe
, state
);
771 trace_dump_call_end();
776 trace_context_set_polygon_stipple(struct pipe_context
*_pipe
,
777 const struct pipe_poly_stipple
*state
)
779 struct trace_context
*tr_ctx
= trace_context(_pipe
);
780 struct pipe_context
*pipe
= tr_ctx
->pipe
;
782 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
784 trace_dump_arg(ptr
, pipe
);
785 trace_dump_arg(poly_stipple
, state
);
787 pipe
->set_polygon_stipple(pipe
, state
);
789 trace_dump_call_end();
794 trace_context_set_scissor_state(struct pipe_context
*_pipe
,
795 const struct pipe_scissor_state
*state
)
797 struct trace_context
*tr_ctx
= trace_context(_pipe
);
798 struct pipe_context
*pipe
= tr_ctx
->pipe
;
800 trace_dump_call_begin("pipe_context", "set_scissor_state");
802 trace_dump_arg(ptr
, pipe
);
803 trace_dump_arg(scissor_state
, state
);
805 pipe
->set_scissor_state(pipe
, state
);
807 trace_dump_call_end();
812 trace_context_set_viewport_state(struct pipe_context
*_pipe
,
813 const struct pipe_viewport_state
*state
)
815 struct trace_context
*tr_ctx
= trace_context(_pipe
);
816 struct pipe_context
*pipe
= tr_ctx
->pipe
;
818 trace_dump_call_begin("pipe_context", "set_viewport_state");
820 trace_dump_arg(ptr
, pipe
);
821 trace_dump_arg(viewport_state
, state
);
823 pipe
->set_viewport_state(pipe
, state
);
825 trace_dump_call_end();
829 static struct pipe_sampler_view
*
830 trace_create_sampler_view(struct pipe_context
*_pipe
,
831 struct pipe_resource
*_resource
,
832 const struct pipe_sampler_view
*templ
)
834 struct trace_context
*tr_ctx
= trace_context(_pipe
);
835 struct trace_resource
*tr_tex
= trace_resource(_resource
);
836 struct pipe_context
*pipe
= tr_ctx
->pipe
;
837 struct pipe_resource
*texture
= tr_tex
->resource
;
838 struct pipe_sampler_view
*result
;
839 struct trace_sampler_view
*tr_view
;
841 trace_dump_call_begin("pipe_context", "create_sampler_view");
843 trace_dump_arg(ptr
, pipe
);
844 trace_dump_arg(ptr
, texture
);
845 trace_dump_arg(sampler_view_template
, templ
);
847 result
= pipe
->create_sampler_view(pipe
, texture
, templ
);
849 trace_dump_ret(ptr
, result
);
851 trace_dump_call_end();
854 * Wrap pipe_sampler_view
856 tr_view
= CALLOC_STRUCT(trace_sampler_view
);
857 tr_view
->base
= *templ
;
858 tr_view
->base
.reference
.count
= 1;
859 tr_view
->base
.texture
= NULL
;
860 pipe_resource_reference(&tr_view
->base
.texture
, _resource
);
861 tr_view
->base
.context
= _pipe
;
862 tr_view
->sampler_view
= result
;
863 result
= &tr_view
->base
;
870 trace_sampler_view_destroy(struct pipe_context
*_pipe
,
871 struct pipe_sampler_view
*_view
)
873 struct trace_context
*tr_ctx
= trace_context(_pipe
);
874 struct trace_sampler_view
*tr_view
= trace_sampler_view(_view
);
875 struct pipe_context
*pipe
= tr_ctx
->pipe
;
876 struct pipe_sampler_view
*view
= tr_view
->sampler_view
;
878 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
880 trace_dump_arg(ptr
, pipe
);
881 trace_dump_arg(ptr
, view
);
883 pipe_sampler_view_reference(&tr_view
->sampler_view
, NULL
);
885 trace_dump_call_end();
887 pipe_resource_reference(&_view
->texture
, NULL
);
891 /********************************************************************
896 static struct pipe_surface
*
897 trace_create_surface(struct pipe_context
*_pipe
,
898 struct pipe_resource
*_texture
,
899 const struct pipe_surface
*surf_tmpl
)
901 struct trace_context
*tr_ctx
= trace_context(_pipe
);
902 struct trace_resource
*tr_tex
= trace_resource(_texture
);
903 struct pipe_context
*pipe
= tr_ctx
->pipe
;
904 struct pipe_resource
*texture
= tr_tex
->resource
;
905 struct pipe_surface
*result
= NULL
;
907 trace_dump_call_begin("pipe_context", "create_surface");
909 trace_dump_arg(ptr
, pipe
);
910 trace_dump_arg(ptr
, texture
);
911 /* hmm some values unitialized there */
912 trace_dump_arg(surface
, surf_tmpl
);
914 result
= pipe
->create_surface(pipe
, texture
, surf_tmpl
);
916 trace_dump_ret(ptr
, result
);
918 trace_dump_call_end();
920 result
= trace_surf_create(tr_tex
, result
);
927 trace_surface_destroy(struct pipe_context
*_pipe
,
928 struct pipe_surface
*_surface
)
930 struct trace_context
*tr_ctx
= trace_context(_pipe
);
931 struct pipe_context
*pipe
= tr_ctx
->pipe
;
932 struct trace_surface
*tr_surf
= trace_surface(_surface
);
933 struct pipe_surface
*surface
= tr_surf
->surface
;
935 trace_dump_call_begin("pipe_context", "surface_destroy");
937 trace_dump_arg(ptr
, pipe
);
938 trace_dump_arg(ptr
, surface
);
940 trace_dump_call_end();
942 trace_surf_destroy(tr_surf
);
947 trace_context_set_fragment_sampler_views(struct pipe_context
*_pipe
,
949 struct pipe_sampler_view
**views
)
951 struct trace_context
*tr_ctx
= trace_context(_pipe
);
952 struct trace_sampler_view
*tr_view
;
953 struct pipe_context
*pipe
= tr_ctx
->pipe
;
954 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_SAMPLERS
];
957 for(i
= 0; i
< num
; ++i
) {
958 tr_view
= trace_sampler_view(views
[i
]);
959 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
961 views
= unwrapped_views
;
963 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
965 trace_dump_arg(ptr
, pipe
);
966 trace_dump_arg(uint
, num
);
967 trace_dump_arg_array(ptr
, views
, num
);
969 pipe
->set_fragment_sampler_views(pipe
, num
, views
);
971 trace_dump_call_end();
976 trace_context_set_vertex_sampler_views(struct pipe_context
*_pipe
,
978 struct pipe_sampler_view
**views
)
980 struct trace_context
*tr_ctx
= trace_context(_pipe
);
981 struct trace_sampler_view
*tr_view
;
982 struct pipe_context
*pipe
= tr_ctx
->pipe
;
983 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_VERTEX_SAMPLERS
];
986 if (!pipe
->set_vertex_sampler_views
)
989 for(i
= 0; i
< num
; ++i
) {
990 tr_view
= trace_sampler_view(views
[i
]);
991 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
993 views
= unwrapped_views
;
995 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
997 trace_dump_arg(ptr
, pipe
);
998 trace_dump_arg(uint
, num
);
999 trace_dump_arg_array(ptr
, views
, num
);
1001 pipe
->set_vertex_sampler_views(pipe
, num
, views
);
1003 trace_dump_call_end();
1008 trace_context_set_vertex_buffers(struct pipe_context
*_pipe
,
1009 unsigned num_buffers
,
1010 const struct pipe_vertex_buffer
*buffers
)
1012 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1013 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1016 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
1018 trace_dump_arg(ptr
, pipe
);
1019 trace_dump_arg(uint
, num_buffers
);
1021 trace_dump_arg_begin("buffers");
1022 trace_dump_struct_array(vertex_buffer
, buffers
, num_buffers
);
1023 trace_dump_arg_end();
1026 struct pipe_vertex_buffer
*_buffers
= MALLOC(num_buffers
* sizeof(*_buffers
));
1027 memcpy(_buffers
, buffers
, num_buffers
* sizeof(*_buffers
));
1028 for (i
= 0; i
< num_buffers
; i
++)
1029 _buffers
[i
].buffer
= trace_resource_unwrap(tr_ctx
, buffers
[i
].buffer
);
1030 pipe
->set_vertex_buffers(pipe
, num_buffers
, _buffers
);
1033 pipe
->set_vertex_buffers(pipe
, num_buffers
, NULL
);
1036 trace_dump_call_end();
1041 trace_context_set_index_buffer(struct pipe_context
*_pipe
,
1042 const struct pipe_index_buffer
*ib
)
1044 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1045 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1047 trace_dump_call_begin("pipe_context", "set_index_buffer");
1049 trace_dump_arg(ptr
, pipe
);
1050 trace_dump_arg(index_buffer
, ib
);
1053 struct pipe_index_buffer _ib
;
1055 _ib
.buffer
= trace_resource_unwrap(tr_ctx
, ib
->buffer
);
1056 pipe
->set_index_buffer(pipe
, &_ib
);
1058 pipe
->set_index_buffer(pipe
, NULL
);
1061 trace_dump_call_end();
1065 trace_context_resource_copy_region(struct pipe_context
*_pipe
,
1066 struct pipe_resource
*dst
,
1068 unsigned dstx
, unsigned dsty
, unsigned dstz
,
1069 struct pipe_resource
*src
,
1071 const struct pipe_box
*src_box
)
1073 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1074 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1076 dst
= trace_resource_unwrap(tr_ctx
, dst
);
1077 src
= trace_resource_unwrap(tr_ctx
, src
);
1079 trace_dump_call_begin("pipe_context", "resource_copy_region");
1081 trace_dump_arg(ptr
, pipe
);
1082 trace_dump_arg(ptr
, dst
);
1083 trace_dump_arg(uint
, dst_level
);
1084 trace_dump_arg(uint
, dstx
);
1085 trace_dump_arg(uint
, dsty
);
1086 trace_dump_arg(uint
, dstz
);
1087 trace_dump_arg(ptr
, src
);
1088 trace_dump_arg(uint
, src_level
);
1089 trace_dump_arg(box
, src_box
);
1091 pipe
->resource_copy_region(pipe
,
1092 dst
, dst_level
, dstx
, dsty
, dstz
,
1093 src
, src_level
, src_box
);
1095 trace_dump_call_end();
1100 trace_context_clear(struct pipe_context
*_pipe
,
1106 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1107 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1109 trace_dump_call_begin("pipe_context", "clear");
1111 trace_dump_arg(ptr
, pipe
);
1112 trace_dump_arg(uint
, buffers
);
1114 trace_dump_arg_array(float, rgba
, 4);
1117 trace_dump_arg(float, depth
);
1118 trace_dump_arg(uint
, stencil
);
1120 pipe
->clear(pipe
, buffers
, rgba
, depth
, stencil
);
1122 trace_dump_call_end();
1127 trace_context_clear_render_target(struct pipe_context
*_pipe
,
1128 struct pipe_surface
*dst
,
1130 unsigned dstx
, unsigned dsty
,
1131 unsigned width
, unsigned height
)
1133 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1134 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1136 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1138 trace_dump_call_begin("pipe_context", "clear_render_target");
1140 trace_dump_arg(ptr
, pipe
);
1141 trace_dump_arg(ptr
, dst
);
1142 trace_dump_arg_array(float, rgba
, 4);
1143 trace_dump_arg(uint
, dstx
);
1144 trace_dump_arg(uint
, dsty
);
1145 trace_dump_arg(uint
, width
);
1146 trace_dump_arg(uint
, height
);
1148 pipe
->clear_render_target(pipe
, dst
, rgba
, dstx
, dsty
, width
, height
);
1150 trace_dump_call_end();
1154 trace_context_clear_depth_stencil(struct pipe_context
*_pipe
,
1155 struct pipe_surface
*dst
,
1156 unsigned clear_flags
,
1159 unsigned dstx
, unsigned dsty
,
1160 unsigned width
, unsigned height
)
1162 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1163 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1165 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1167 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1169 trace_dump_arg(ptr
, pipe
);
1170 trace_dump_arg(ptr
, dst
);
1171 trace_dump_arg(uint
, clear_flags
);
1172 trace_dump_arg(float, depth
);
1173 trace_dump_arg(uint
, stencil
);
1174 trace_dump_arg(uint
, dstx
);
1175 trace_dump_arg(uint
, dsty
);
1176 trace_dump_arg(uint
, width
);
1177 trace_dump_arg(uint
, height
);
1179 pipe
->clear_depth_stencil(pipe
, dst
, clear_flags
, depth
, stencil
,
1180 dstx
, dsty
, width
, height
);
1182 trace_dump_call_end();
1186 trace_context_flush(struct pipe_context
*_pipe
,
1187 struct pipe_fence_handle
**fence
)
1189 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1190 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1192 trace_dump_call_begin("pipe_context", "flush");
1194 trace_dump_arg(ptr
, pipe
);
1196 pipe
->flush(pipe
, fence
);
1199 trace_dump_ret(ptr
, *fence
);
1201 trace_dump_call_end();
1206 trace_context_destroy(struct pipe_context
*_pipe
)
1208 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1209 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1211 trace_dump_call_begin("pipe_context", "destroy");
1212 trace_dump_arg(ptr
, pipe
);
1213 trace_dump_call_end();
1215 pipe
->destroy(pipe
);
1221 /********************************************************************
1226 static struct pipe_transfer
*
1227 trace_context_get_transfer(struct pipe_context
*_context
,
1228 struct pipe_resource
*_resource
,
1231 const struct pipe_box
*box
)
1233 struct trace_context
*tr_context
= trace_context(_context
);
1234 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1235 struct pipe_context
*context
= tr_context
->pipe
;
1236 struct pipe_resource
*texture
= tr_tex
->resource
;
1237 struct pipe_transfer
*result
= NULL
;
1239 assert(texture
->screen
== context
->screen
);
1242 * Map and transfers can't be serialized so we convert all write transfers
1243 * to transfer_inline_write and ignore read transfers.
1246 result
= context
->get_transfer(context
, texture
, level
, usage
, box
);
1249 result
= trace_transfer_create(tr_context
, tr_tex
, result
);
1256 trace_context_transfer_destroy(struct pipe_context
*_context
,
1257 struct pipe_transfer
*_transfer
)
1259 struct trace_context
*tr_context
= trace_context(_context
);
1260 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1262 trace_transfer_destroy(tr_context
, tr_trans
);
1267 trace_context_transfer_map(struct pipe_context
*_context
,
1268 struct pipe_transfer
*_transfer
)
1270 struct trace_context
*tr_context
= trace_context(_context
);
1271 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1272 struct pipe_context
*context
= tr_context
->pipe
;
1273 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1276 map
= context
->transfer_map(context
, transfer
);
1278 if(transfer
->usage
& PIPE_TRANSFER_WRITE
) {
1279 assert(!tr_trans
->map
);
1280 tr_trans
->map
= map
;
1289 trace_context_transfer_flush_region( struct pipe_context
*_context
,
1290 struct pipe_transfer
*_transfer
,
1291 const struct pipe_box
*box
)
1293 struct trace_context
*tr_context
= trace_context(_context
);
1294 struct trace_transfer
*tr_transfer
= trace_transfer(_transfer
);
1295 struct pipe_context
*context
= tr_context
->pipe
;
1296 struct pipe_transfer
*transfer
= tr_transfer
->transfer
;
1298 context
->transfer_flush_region(context
,
1304 trace_context_transfer_unmap(struct pipe_context
*_context
,
1305 struct pipe_transfer
*_transfer
)
1307 struct trace_context
*tr_ctx
= trace_context(_context
);
1308 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1309 struct pipe_context
*context
= tr_ctx
->pipe
;
1310 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1314 * Fake a transfer_inline_write
1317 struct pipe_resource
*resource
= transfer
->resource
;
1318 unsigned level
= transfer
->level
;
1319 unsigned usage
= transfer
->usage
;
1320 const struct pipe_box
*box
= &transfer
->box
;
1321 unsigned stride
= transfer
->stride
;
1322 unsigned layer_stride
= transfer
->layer_stride
;
1324 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1326 trace_dump_arg(ptr
, context
);
1327 trace_dump_arg(ptr
, resource
);
1328 trace_dump_arg(uint
, level
);
1329 trace_dump_arg(uint
, usage
);
1330 trace_dump_arg(box
, box
);
1332 trace_dump_arg_begin("data");
1333 trace_dump_box_bytes(tr_trans
->map
,
1338 trace_dump_arg_end();
1340 trace_dump_arg(uint
, stride
);
1341 trace_dump_arg(uint
, layer_stride
);
1343 trace_dump_call_end();
1345 tr_trans
->map
= NULL
;
1348 context
->transfer_unmap(context
, transfer
);
1353 trace_context_transfer_inline_write(struct pipe_context
*_context
,
1354 struct pipe_resource
*_resource
,
1357 const struct pipe_box
*box
,
1360 unsigned layer_stride
)
1362 struct trace_context
*tr_context
= trace_context(_context
);
1363 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1364 struct pipe_context
*context
= tr_context
->pipe
;
1365 struct pipe_resource
*resource
= tr_tex
->resource
;
1367 assert(resource
->screen
== context
->screen
);
1369 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1371 trace_dump_arg(ptr
, context
);
1372 trace_dump_arg(ptr
, resource
);
1373 trace_dump_arg(uint
, level
);
1374 trace_dump_arg(uint
, usage
);
1375 trace_dump_arg(box
, box
);
1377 trace_dump_arg_begin("data");
1378 trace_dump_box_bytes(data
,
1383 trace_dump_arg_end();
1385 trace_dump_arg(uint
, stride
);
1386 trace_dump_arg(uint
, layer_stride
);
1388 trace_dump_call_end();
1390 context
->transfer_inline_write(context
, resource
,
1391 level
, usage
, box
, data
, stride
, layer_stride
);
1395 static void trace_redefine_user_buffer(struct pipe_context
*_context
,
1396 struct pipe_resource
*_resource
,
1397 unsigned offset
, unsigned size
)
1399 struct trace_context
*tr_context
= trace_context(_context
);
1400 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1401 struct pipe_context
*context
= tr_context
->pipe
;
1402 struct pipe_resource
*resource
= tr_tex
->resource
;
1404 assert(resource
->screen
== context
->screen
);
1406 trace_dump_call_begin("pipe_context", "redefine_user_buffer");
1408 trace_dump_arg(ptr
, context
);
1409 trace_dump_arg(ptr
, resource
);
1410 trace_dump_arg(uint
, offset
);
1411 trace_dump_arg(uint
, size
);
1413 trace_dump_call_end();
1415 context
->redefine_user_buffer(context
, resource
, offset
, size
);
1419 static const struct debug_named_value rbug_blocker_flags
[] = {
1420 {"before", 1, NULL
},
1422 DEBUG_NAMED_VALUE_END
1425 struct pipe_context
*
1426 trace_context_create(struct trace_screen
*tr_scr
,
1427 struct pipe_context
*pipe
)
1429 struct trace_context
*tr_ctx
;
1434 if(!trace_enabled())
1437 tr_ctx
= CALLOC_STRUCT(trace_context
);
1441 tr_ctx
->base
.winsys
= NULL
;
1442 tr_ctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
1443 tr_ctx
->base
.screen
= &tr_scr
->base
;
1445 tr_ctx
->base
.destroy
= trace_context_destroy
;
1446 tr_ctx
->base
.draw_vbo
= trace_context_draw_vbo
;
1447 tr_ctx
->base
.create_query
= trace_context_create_query
;
1448 tr_ctx
->base
.destroy_query
= trace_context_destroy_query
;
1449 tr_ctx
->base
.begin_query
= trace_context_begin_query
;
1450 tr_ctx
->base
.end_query
= trace_context_end_query
;
1451 tr_ctx
->base
.get_query_result
= trace_context_get_query_result
;
1452 tr_ctx
->base
.create_blend_state
= trace_context_create_blend_state
;
1453 tr_ctx
->base
.bind_blend_state
= trace_context_bind_blend_state
;
1454 tr_ctx
->base
.delete_blend_state
= trace_context_delete_blend_state
;
1455 tr_ctx
->base
.create_sampler_state
= trace_context_create_sampler_state
;
1456 tr_ctx
->base
.bind_fragment_sampler_states
= trace_context_bind_fragment_sampler_states
;
1457 tr_ctx
->base
.bind_vertex_sampler_states
= trace_context_bind_vertex_sampler_states
;
1458 tr_ctx
->base
.delete_sampler_state
= trace_context_delete_sampler_state
;
1459 tr_ctx
->base
.create_rasterizer_state
= trace_context_create_rasterizer_state
;
1460 tr_ctx
->base
.bind_rasterizer_state
= trace_context_bind_rasterizer_state
;
1461 tr_ctx
->base
.delete_rasterizer_state
= trace_context_delete_rasterizer_state
;
1462 tr_ctx
->base
.create_depth_stencil_alpha_state
= trace_context_create_depth_stencil_alpha_state
;
1463 tr_ctx
->base
.bind_depth_stencil_alpha_state
= trace_context_bind_depth_stencil_alpha_state
;
1464 tr_ctx
->base
.delete_depth_stencil_alpha_state
= trace_context_delete_depth_stencil_alpha_state
;
1465 tr_ctx
->base
.create_fs_state
= trace_context_create_fs_state
;
1466 tr_ctx
->base
.bind_fs_state
= trace_context_bind_fs_state
;
1467 tr_ctx
->base
.delete_fs_state
= trace_context_delete_fs_state
;
1468 tr_ctx
->base
.create_vs_state
= trace_context_create_vs_state
;
1469 tr_ctx
->base
.bind_vs_state
= trace_context_bind_vs_state
;
1470 tr_ctx
->base
.delete_vs_state
= trace_context_delete_vs_state
;
1471 tr_ctx
->base
.create_vertex_elements_state
= trace_context_create_vertex_elements_state
;
1472 tr_ctx
->base
.bind_vertex_elements_state
= trace_context_bind_vertex_elements_state
;
1473 tr_ctx
->base
.delete_vertex_elements_state
= trace_context_delete_vertex_elements_state
;
1474 tr_ctx
->base
.set_blend_color
= trace_context_set_blend_color
;
1475 tr_ctx
->base
.set_stencil_ref
= trace_context_set_stencil_ref
;
1476 tr_ctx
->base
.set_clip_state
= trace_context_set_clip_state
;
1477 tr_ctx
->base
.set_sample_mask
= trace_context_set_sample_mask
;
1478 tr_ctx
->base
.set_constant_buffer
= trace_context_set_constant_buffer
;
1479 tr_ctx
->base
.set_framebuffer_state
= trace_context_set_framebuffer_state
;
1480 tr_ctx
->base
.set_polygon_stipple
= trace_context_set_polygon_stipple
;
1481 tr_ctx
->base
.set_scissor_state
= trace_context_set_scissor_state
;
1482 tr_ctx
->base
.set_viewport_state
= trace_context_set_viewport_state
;
1483 tr_ctx
->base
.set_fragment_sampler_views
= trace_context_set_fragment_sampler_views
;
1484 tr_ctx
->base
.set_vertex_sampler_views
= trace_context_set_vertex_sampler_views
;
1485 tr_ctx
->base
.create_sampler_view
= trace_create_sampler_view
;
1486 tr_ctx
->base
.sampler_view_destroy
= trace_sampler_view_destroy
;
1487 tr_ctx
->base
.create_surface
= trace_create_surface
;
1488 tr_ctx
->base
.surface_destroy
= trace_surface_destroy
;
1489 tr_ctx
->base
.set_vertex_buffers
= trace_context_set_vertex_buffers
;
1490 tr_ctx
->base
.set_index_buffer
= trace_context_set_index_buffer
;
1491 tr_ctx
->base
.resource_copy_region
= trace_context_resource_copy_region
;
1492 tr_ctx
->base
.clear
= trace_context_clear
;
1493 tr_ctx
->base
.clear_render_target
= trace_context_clear_render_target
;
1494 tr_ctx
->base
.clear_depth_stencil
= trace_context_clear_depth_stencil
;
1495 tr_ctx
->base
.flush
= trace_context_flush
;
1497 tr_ctx
->base
.get_transfer
= trace_context_get_transfer
;
1498 tr_ctx
->base
.transfer_destroy
= trace_context_transfer_destroy
;
1499 tr_ctx
->base
.transfer_map
= trace_context_transfer_map
;
1500 tr_ctx
->base
.transfer_unmap
= trace_context_transfer_unmap
;
1501 tr_ctx
->base
.transfer_flush_region
= trace_context_transfer_flush_region
;
1502 tr_ctx
->base
.transfer_inline_write
= trace_context_transfer_inline_write
;
1503 tr_ctx
->base
.redefine_user_buffer
= trace_redefine_user_buffer
;
1505 tr_ctx
->pipe
= pipe
;
1507 return &tr_ctx
->base
;