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 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
319 trace_dump_arg(ptr
, pipe
);
320 trace_dump_arg(uint
, num_states
);
321 trace_dump_arg_array(ptr
, states
, num_states
);
323 pipe
->bind_vertex_sampler_states(pipe
, num_states
, states
);
325 trace_dump_call_end();
330 trace_context_delete_sampler_state(struct pipe_context
*_pipe
,
333 struct trace_context
*tr_ctx
= trace_context(_pipe
);
334 struct pipe_context
*pipe
= tr_ctx
->pipe
;
336 trace_dump_call_begin("pipe_context", "delete_sampler_state");
338 trace_dump_arg(ptr
, pipe
);
339 trace_dump_arg(ptr
, state
);
341 pipe
->delete_sampler_state(pipe
, state
);
343 trace_dump_call_end();
348 trace_context_create_rasterizer_state(struct pipe_context
*_pipe
,
349 const struct pipe_rasterizer_state
*state
)
351 struct trace_context
*tr_ctx
= trace_context(_pipe
);
352 struct pipe_context
*pipe
= tr_ctx
->pipe
;
355 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
357 trace_dump_arg(ptr
, pipe
);
358 trace_dump_arg(rasterizer_state
, state
);
360 result
= pipe
->create_rasterizer_state(pipe
, state
);
362 trace_dump_ret(ptr
, result
);
364 trace_dump_call_end();
371 trace_context_bind_rasterizer_state(struct pipe_context
*_pipe
,
374 struct trace_context
*tr_ctx
= trace_context(_pipe
);
375 struct pipe_context
*pipe
= tr_ctx
->pipe
;
377 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
379 trace_dump_arg(ptr
, pipe
);
380 trace_dump_arg(ptr
, state
);
382 pipe
->bind_rasterizer_state(pipe
, state
);
384 trace_dump_call_end();
389 trace_context_delete_rasterizer_state(struct pipe_context
*_pipe
,
392 struct trace_context
*tr_ctx
= trace_context(_pipe
);
393 struct pipe_context
*pipe
= tr_ctx
->pipe
;
395 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
397 trace_dump_arg(ptr
, pipe
);
398 trace_dump_arg(ptr
, state
);
400 pipe
->delete_rasterizer_state(pipe
, state
);
402 trace_dump_call_end();
407 trace_context_create_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
408 const struct pipe_depth_stencil_alpha_state
*state
)
410 struct trace_context
*tr_ctx
= trace_context(_pipe
);
411 struct pipe_context
*pipe
= tr_ctx
->pipe
;
414 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
416 result
= pipe
->create_depth_stencil_alpha_state(pipe
, state
);
418 trace_dump_arg(ptr
, pipe
);
419 trace_dump_arg(depth_stencil_alpha_state
, state
);
421 trace_dump_ret(ptr
, result
);
423 trace_dump_call_end();
430 trace_context_bind_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
433 struct trace_context
*tr_ctx
= trace_context(_pipe
);
434 struct pipe_context
*pipe
= tr_ctx
->pipe
;
436 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
438 trace_dump_arg(ptr
, pipe
);
439 trace_dump_arg(ptr
, state
);
441 pipe
->bind_depth_stencil_alpha_state(pipe
, state
);
443 trace_dump_call_end();
448 trace_context_delete_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
451 struct trace_context
*tr_ctx
= trace_context(_pipe
);
452 struct pipe_context
*pipe
= tr_ctx
->pipe
;
454 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
456 trace_dump_arg(ptr
, pipe
);
457 trace_dump_arg(ptr
, state
);
459 pipe
->delete_depth_stencil_alpha_state(pipe
, state
);
461 trace_dump_call_end();
466 trace_context_create_fs_state(struct pipe_context
*_pipe
,
467 const struct pipe_shader_state
*state
)
469 struct trace_context
*tr_ctx
= trace_context(_pipe
);
470 struct pipe_context
*pipe
= tr_ctx
->pipe
;
473 trace_dump_call_begin("pipe_context", "create_fs_state");
475 trace_dump_arg(ptr
, pipe
);
476 trace_dump_arg(shader_state
, state
);
478 result
= pipe
->create_fs_state(pipe
, state
);
480 trace_dump_ret(ptr
, result
);
482 trace_dump_call_end();
489 trace_context_bind_fs_state(struct pipe_context
*_pipe
,
492 struct trace_context
*tr_ctx
= trace_context(_pipe
);
493 struct pipe_context
*pipe
= tr_ctx
->pipe
;
495 trace_dump_call_begin("pipe_context", "bind_fs_state");
497 trace_dump_arg(ptr
, pipe
);
498 trace_dump_arg(ptr
, state
);
500 pipe
->bind_fs_state(pipe
, state
);
502 trace_dump_call_end();
507 trace_context_delete_fs_state(struct pipe_context
*_pipe
,
510 struct trace_context
*tr_ctx
= trace_context(_pipe
);
511 struct pipe_context
*pipe
= tr_ctx
->pipe
;
513 trace_dump_call_begin("pipe_context", "delete_fs_state");
515 trace_dump_arg(ptr
, pipe
);
516 trace_dump_arg(ptr
, state
);
518 pipe
->delete_fs_state(pipe
, state
);
520 trace_dump_call_end();
525 trace_context_create_vs_state(struct pipe_context
*_pipe
,
526 const struct pipe_shader_state
*state
)
528 struct trace_context
*tr_ctx
= trace_context(_pipe
);
529 struct pipe_context
*pipe
= tr_ctx
->pipe
;
532 trace_dump_call_begin("pipe_context", "create_vs_state");
534 trace_dump_arg(ptr
, pipe
);
535 trace_dump_arg(shader_state
, state
);
537 result
= pipe
->create_vs_state(pipe
, state
);
539 trace_dump_ret(ptr
, result
);
541 trace_dump_call_end();
548 trace_context_bind_vs_state(struct pipe_context
*_pipe
,
551 struct trace_context
*tr_ctx
= trace_context(_pipe
);
552 struct pipe_context
*pipe
= tr_ctx
->pipe
;
554 trace_dump_call_begin("pipe_context", "bind_vs_state");
556 trace_dump_arg(ptr
, pipe
);
557 trace_dump_arg(ptr
, state
);
559 pipe
->bind_vs_state(pipe
, state
);
561 trace_dump_call_end();
566 trace_context_delete_vs_state(struct pipe_context
*_pipe
,
569 struct trace_context
*tr_ctx
= trace_context(_pipe
);
570 struct pipe_context
*pipe
= tr_ctx
->pipe
;
572 trace_dump_call_begin("pipe_context", "delete_vs_state");
574 trace_dump_arg(ptr
, pipe
);
575 trace_dump_arg(ptr
, state
);
577 pipe
->delete_vs_state(pipe
, state
);
579 trace_dump_call_end();
584 trace_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
585 unsigned num_elements
,
586 const struct pipe_vertex_element
*elements
)
588 struct trace_context
*tr_ctx
= trace_context(_pipe
);
589 struct pipe_context
*pipe
= tr_ctx
->pipe
;
592 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
594 trace_dump_arg(ptr
, pipe
);
595 trace_dump_arg(uint
, num_elements
);
597 trace_dump_arg_begin("elements");
598 trace_dump_struct_array(vertex_element
, elements
, num_elements
);
599 trace_dump_arg_end();
601 result
= pipe
->create_vertex_elements_state(pipe
, num_elements
, elements
);
603 trace_dump_ret(ptr
, result
);
605 trace_dump_call_end();
612 trace_context_bind_vertex_elements_state(struct pipe_context
*_pipe
,
615 struct trace_context
*tr_ctx
= trace_context(_pipe
);
616 struct pipe_context
*pipe
= tr_ctx
->pipe
;
618 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
620 trace_dump_arg(ptr
, pipe
);
621 trace_dump_arg(ptr
, state
);
623 pipe
->bind_vertex_elements_state(pipe
, state
);
625 trace_dump_call_end();
630 trace_context_delete_vertex_elements_state(struct pipe_context
*_pipe
,
633 struct trace_context
*tr_ctx
= trace_context(_pipe
);
634 struct pipe_context
*pipe
= tr_ctx
->pipe
;
636 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
638 trace_dump_arg(ptr
, pipe
);
639 trace_dump_arg(ptr
, state
);
641 pipe
->delete_vertex_elements_state(pipe
, state
);
643 trace_dump_call_end();
648 trace_context_set_blend_color(struct pipe_context
*_pipe
,
649 const struct pipe_blend_color
*state
)
651 struct trace_context
*tr_ctx
= trace_context(_pipe
);
652 struct pipe_context
*pipe
= tr_ctx
->pipe
;
654 trace_dump_call_begin("pipe_context", "set_blend_color");
656 trace_dump_arg(ptr
, pipe
);
657 trace_dump_arg(blend_color
, state
);
659 pipe
->set_blend_color(pipe
, state
);
661 trace_dump_call_end();
666 trace_context_set_stencil_ref(struct pipe_context
*_pipe
,
667 const struct pipe_stencil_ref
*state
)
669 struct trace_context
*tr_ctx
= trace_context(_pipe
);
670 struct pipe_context
*pipe
= tr_ctx
->pipe
;
672 trace_dump_call_begin("pipe_context", "set_stencil_ref");
674 trace_dump_arg(ptr
, pipe
);
675 trace_dump_arg(stencil_ref
, state
);
677 pipe
->set_stencil_ref(pipe
, state
);
679 trace_dump_call_end();
684 trace_context_set_clip_state(struct pipe_context
*_pipe
,
685 const struct pipe_clip_state
*state
)
687 struct trace_context
*tr_ctx
= trace_context(_pipe
);
688 struct pipe_context
*pipe
= tr_ctx
->pipe
;
690 trace_dump_call_begin("pipe_context", "set_clip_state");
692 trace_dump_arg(ptr
, pipe
);
693 trace_dump_arg(clip_state
, state
);
695 pipe
->set_clip_state(pipe
, state
);
697 trace_dump_call_end();
701 trace_context_set_sample_mask(struct pipe_context
*_pipe
,
702 unsigned sample_mask
)
704 struct trace_context
*tr_ctx
= trace_context(_pipe
);
705 struct pipe_context
*pipe
= tr_ctx
->pipe
;
707 trace_dump_call_begin("pipe_context", "set_sample_mask");
709 trace_dump_arg(ptr
, pipe
);
710 trace_dump_arg(uint
, sample_mask
);
712 pipe
->set_sample_mask(pipe
, sample_mask
);
714 trace_dump_call_end();
718 trace_context_set_constant_buffer(struct pipe_context
*_pipe
,
719 uint shader
, uint index
,
720 struct pipe_resource
*buffer
)
722 struct trace_context
*tr_ctx
= trace_context(_pipe
);
723 struct pipe_context
*pipe
= tr_ctx
->pipe
;
726 buffer
= trace_resource_unwrap(tr_ctx
, buffer
);
729 trace_dump_call_begin("pipe_context", "set_constant_buffer");
731 trace_dump_arg(ptr
, pipe
);
732 trace_dump_arg(uint
, shader
);
733 trace_dump_arg(uint
, index
);
734 trace_dump_arg(ptr
, buffer
);
736 pipe
->set_constant_buffer(pipe
, shader
, index
, buffer
);
738 trace_dump_call_end();
743 trace_context_set_framebuffer_state(struct pipe_context
*_pipe
,
744 const struct pipe_framebuffer_state
*state
)
746 struct trace_context
*tr_ctx
= trace_context(_pipe
);
747 struct pipe_context
*pipe
= tr_ctx
->pipe
;
748 struct pipe_framebuffer_state unwrapped_state
;
752 /* Unwrap the input state */
753 memcpy(&unwrapped_state
, state
, sizeof(unwrapped_state
));
754 for(i
= 0; i
< state
->nr_cbufs
; ++i
)
755 unwrapped_state
.cbufs
[i
] = trace_surface_unwrap(tr_ctx
, state
->cbufs
[i
]);
756 for(i
= state
->nr_cbufs
; i
< PIPE_MAX_COLOR_BUFS
; ++i
)
757 unwrapped_state
.cbufs
[i
] = NULL
;
758 unwrapped_state
.zsbuf
= trace_surface_unwrap(tr_ctx
, state
->zsbuf
);
759 state
= &unwrapped_state
;
761 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
763 trace_dump_arg(ptr
, pipe
);
764 trace_dump_arg(framebuffer_state
, state
);
766 pipe
->set_framebuffer_state(pipe
, state
);
768 trace_dump_call_end();
773 trace_context_set_polygon_stipple(struct pipe_context
*_pipe
,
774 const struct pipe_poly_stipple
*state
)
776 struct trace_context
*tr_ctx
= trace_context(_pipe
);
777 struct pipe_context
*pipe
= tr_ctx
->pipe
;
779 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
781 trace_dump_arg(ptr
, pipe
);
782 trace_dump_arg(poly_stipple
, state
);
784 pipe
->set_polygon_stipple(pipe
, state
);
786 trace_dump_call_end();
791 trace_context_set_scissor_state(struct pipe_context
*_pipe
,
792 const struct pipe_scissor_state
*state
)
794 struct trace_context
*tr_ctx
= trace_context(_pipe
);
795 struct pipe_context
*pipe
= tr_ctx
->pipe
;
797 trace_dump_call_begin("pipe_context", "set_scissor_state");
799 trace_dump_arg(ptr
, pipe
);
800 trace_dump_arg(scissor_state
, state
);
802 pipe
->set_scissor_state(pipe
, state
);
804 trace_dump_call_end();
809 trace_context_set_viewport_state(struct pipe_context
*_pipe
,
810 const struct pipe_viewport_state
*state
)
812 struct trace_context
*tr_ctx
= trace_context(_pipe
);
813 struct pipe_context
*pipe
= tr_ctx
->pipe
;
815 trace_dump_call_begin("pipe_context", "set_viewport_state");
817 trace_dump_arg(ptr
, pipe
);
818 trace_dump_arg(viewport_state
, state
);
820 pipe
->set_viewport_state(pipe
, state
);
822 trace_dump_call_end();
826 static struct pipe_sampler_view
*
827 trace_create_sampler_view(struct pipe_context
*_pipe
,
828 struct pipe_resource
*_resource
,
829 const struct pipe_sampler_view
*templ
)
831 struct trace_context
*tr_ctx
= trace_context(_pipe
);
832 struct trace_resource
*tr_tex
= trace_resource(_resource
);
833 struct pipe_context
*pipe
= tr_ctx
->pipe
;
834 struct pipe_resource
*texture
= tr_tex
->resource
;
835 struct pipe_sampler_view
*result
;
836 struct trace_sampler_view
*tr_view
;
838 trace_dump_call_begin("pipe_context", "create_sampler_view");
840 trace_dump_arg(ptr
, pipe
);
841 trace_dump_arg(ptr
, texture
);
842 trace_dump_arg(sampler_view_template
, templ
);
844 result
= pipe
->create_sampler_view(pipe
, texture
, templ
);
846 trace_dump_ret(ptr
, result
);
848 trace_dump_call_end();
851 * Wrap pipe_sampler_view
853 tr_view
= CALLOC_STRUCT(trace_sampler_view
);
854 tr_view
->base
= *templ
;
855 tr_view
->base
.reference
.count
= 1;
856 tr_view
->base
.texture
= NULL
;
857 pipe_resource_reference(&tr_view
->base
.texture
, _resource
);
858 tr_view
->base
.context
= _pipe
;
859 tr_view
->sampler_view
= result
;
860 result
= &tr_view
->base
;
867 trace_sampler_view_destroy(struct pipe_context
*_pipe
,
868 struct pipe_sampler_view
*_view
)
870 struct trace_context
*tr_ctx
= trace_context(_pipe
);
871 struct trace_sampler_view
*tr_view
= trace_sampler_view(_view
);
872 struct pipe_context
*pipe
= tr_ctx
->pipe
;
873 struct pipe_sampler_view
*view
= tr_view
->sampler_view
;
875 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
877 trace_dump_arg(ptr
, pipe
);
878 trace_dump_arg(ptr
, view
);
880 pipe_sampler_view_reference(&tr_view
->sampler_view
, NULL
);
882 trace_dump_call_end();
884 pipe_resource_reference(&_view
->texture
, NULL
);
890 trace_context_set_fragment_sampler_views(struct pipe_context
*_pipe
,
892 struct pipe_sampler_view
**views
)
894 struct trace_context
*tr_ctx
= trace_context(_pipe
);
895 struct trace_sampler_view
*tr_view
;
896 struct pipe_context
*pipe
= tr_ctx
->pipe
;
897 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_SAMPLERS
];
900 for(i
= 0; i
< num
; ++i
) {
901 tr_view
= trace_sampler_view(views
[i
]);
902 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
904 views
= unwrapped_views
;
906 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
908 trace_dump_arg(ptr
, pipe
);
909 trace_dump_arg(uint
, num
);
910 trace_dump_arg_array(ptr
, views
, num
);
912 pipe
->set_fragment_sampler_views(pipe
, num
, views
);
914 trace_dump_call_end();
919 trace_context_set_vertex_sampler_views(struct pipe_context
*_pipe
,
921 struct pipe_sampler_view
**views
)
923 struct trace_context
*tr_ctx
= trace_context(_pipe
);
924 struct trace_sampler_view
*tr_view
;
925 struct pipe_context
*pipe
= tr_ctx
->pipe
;
926 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_VERTEX_SAMPLERS
];
929 for(i
= 0; i
< num
; ++i
) {
930 tr_view
= trace_sampler_view(views
[i
]);
931 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
933 views
= unwrapped_views
;
935 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
937 trace_dump_arg(ptr
, pipe
);
938 trace_dump_arg(uint
, num
);
939 trace_dump_arg_array(ptr
, views
, num
);
941 pipe
->set_vertex_sampler_views(pipe
, num
, views
);
943 trace_dump_call_end();
948 trace_context_set_vertex_buffers(struct pipe_context
*_pipe
,
949 unsigned num_buffers
,
950 const struct pipe_vertex_buffer
*buffers
)
952 struct trace_context
*tr_ctx
= trace_context(_pipe
);
953 struct pipe_context
*pipe
= tr_ctx
->pipe
;
956 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
958 trace_dump_arg(ptr
, pipe
);
959 trace_dump_arg(uint
, num_buffers
);
961 trace_dump_arg_begin("buffers");
962 trace_dump_struct_array(vertex_buffer
, buffers
, num_buffers
);
963 trace_dump_arg_end();
966 struct pipe_vertex_buffer
*_buffers
= MALLOC(num_buffers
* sizeof(*_buffers
));
967 memcpy(_buffers
, buffers
, num_buffers
* sizeof(*_buffers
));
968 for (i
= 0; i
< num_buffers
; i
++)
969 _buffers
[i
].buffer
= trace_resource_unwrap(tr_ctx
, buffers
[i
].buffer
);
970 pipe
->set_vertex_buffers(pipe
, num_buffers
, _buffers
);
973 pipe
->set_vertex_buffers(pipe
, num_buffers
, NULL
);
976 trace_dump_call_end();
981 trace_context_set_index_buffer(struct pipe_context
*_pipe
,
982 const struct pipe_index_buffer
*ib
)
984 struct trace_context
*tr_ctx
= trace_context(_pipe
);
985 struct pipe_context
*pipe
= tr_ctx
->pipe
;
987 trace_dump_call_begin("pipe_context", "set_index_buffer");
989 trace_dump_arg(ptr
, pipe
);
990 trace_dump_arg(index_buffer
, ib
);
993 struct pipe_index_buffer _ib
;
995 _ib
.buffer
= trace_resource_unwrap(tr_ctx
, ib
->buffer
);
996 pipe
->set_index_buffer(pipe
, &_ib
);
998 pipe
->set_index_buffer(pipe
, NULL
);
1001 trace_dump_call_end();
1005 trace_context_resource_copy_region(struct pipe_context
*_pipe
,
1006 struct pipe_resource
*dst
,
1007 struct pipe_subresource subdst
,
1008 unsigned dstx
, unsigned dsty
, unsigned dstz
,
1009 struct pipe_resource
*src
,
1010 struct pipe_subresource subsrc
,
1011 unsigned srcx
, unsigned srcy
, unsigned srcz
,
1012 unsigned width
, unsigned height
)
1014 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1015 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1017 dst
= trace_resource_unwrap(tr_ctx
, dst
);
1018 src
= trace_resource_unwrap(tr_ctx
, src
);
1020 trace_dump_call_begin("pipe_context", "resource_copy_region");
1022 trace_dump_arg(ptr
, pipe
);
1023 trace_dump_arg(ptr
, dst
);
1024 trace_dump_arg_struct(subresource
, subdst
);
1025 trace_dump_arg(uint
, dstx
);
1026 trace_dump_arg(uint
, dsty
);
1027 trace_dump_arg(uint
, dstz
);
1028 trace_dump_arg(ptr
, src
);
1029 trace_dump_arg_struct(subresource
, subsrc
);
1030 trace_dump_arg(uint
, srcx
);
1031 trace_dump_arg(uint
, srcy
);
1032 trace_dump_arg(uint
, srcz
);
1033 trace_dump_arg(uint
, width
);
1034 trace_dump_arg(uint
, height
);
1036 pipe
->resource_copy_region(pipe
,
1037 dst
, subdst
, dstx
, dsty
, dstz
,
1038 src
, subsrc
, srcx
, srcy
, srcz
, width
, height
);
1040 trace_dump_call_end();
1045 trace_context_clear(struct pipe_context
*_pipe
,
1051 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1052 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1054 trace_dump_call_begin("pipe_context", "clear");
1056 trace_dump_arg(ptr
, pipe
);
1057 trace_dump_arg(uint
, buffers
);
1059 trace_dump_arg_array(float, rgba
, 4);
1062 trace_dump_arg(float, depth
);
1063 trace_dump_arg(uint
, stencil
);
1065 pipe
->clear(pipe
, buffers
, rgba
, depth
, stencil
);
1067 trace_dump_call_end();
1072 trace_context_clear_render_target(struct pipe_context
*_pipe
,
1073 struct pipe_surface
*dst
,
1075 unsigned dstx
, unsigned dsty
,
1076 unsigned width
, unsigned height
)
1078 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1079 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1081 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1083 trace_dump_call_begin("pipe_context", "clear_render_target");
1085 trace_dump_arg(ptr
, pipe
);
1086 trace_dump_arg(ptr
, dst
);
1087 trace_dump_arg_array(float, rgba
, 4);
1088 trace_dump_arg(uint
, dstx
);
1089 trace_dump_arg(uint
, dsty
);
1090 trace_dump_arg(uint
, width
);
1091 trace_dump_arg(uint
, height
);
1093 pipe
->clear_render_target(pipe
, dst
, rgba
, dstx
, dsty
, width
, height
);
1095 trace_dump_call_end();
1099 trace_context_clear_depth_stencil(struct pipe_context
*_pipe
,
1100 struct pipe_surface
*dst
,
1101 unsigned clear_flags
,
1104 unsigned dstx
, unsigned dsty
,
1105 unsigned width
, unsigned height
)
1107 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1108 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1110 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1112 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1114 trace_dump_arg(ptr
, pipe
);
1115 trace_dump_arg(ptr
, dst
);
1116 trace_dump_arg(uint
, clear_flags
);
1117 trace_dump_arg(float, depth
);
1118 trace_dump_arg(uint
, stencil
);
1119 trace_dump_arg(uint
, dstx
);
1120 trace_dump_arg(uint
, dsty
);
1121 trace_dump_arg(uint
, width
);
1122 trace_dump_arg(uint
, height
);
1124 pipe
->clear_depth_stencil(pipe
, dst
, clear_flags
, depth
, stencil
,
1125 dstx
, dsty
, width
, height
);
1127 trace_dump_call_end();
1131 trace_context_flush(struct pipe_context
*_pipe
,
1133 struct pipe_fence_handle
**fence
)
1135 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1136 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1138 trace_dump_call_begin("pipe_context", "flush");
1140 trace_dump_arg(ptr
, pipe
);
1141 trace_dump_arg(uint
, flags
);
1143 pipe
->flush(pipe
, flags
, fence
);
1146 trace_dump_ret(ptr
, *fence
);
1148 trace_dump_call_end();
1153 trace_context_destroy(struct pipe_context
*_pipe
)
1155 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1156 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1158 trace_dump_call_begin("pipe_context", "destroy");
1159 trace_dump_arg(ptr
, pipe
);
1160 trace_dump_call_end();
1162 pipe
->destroy(pipe
);
1168 trace_is_resource_referenced( struct pipe_context
*_pipe
,
1169 struct pipe_resource
*_resource
,
1170 unsigned face
, unsigned level
)
1172 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1173 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1174 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1175 struct pipe_resource
*texture
= tr_tex
->resource
;
1176 unsigned int referenced
;
1178 trace_dump_call_begin("pipe_context", "is_resource_referenced");
1179 trace_dump_arg(ptr
, pipe
);
1180 trace_dump_arg(ptr
, texture
);
1181 trace_dump_arg(uint
, face
);
1182 trace_dump_arg(uint
, level
);
1184 referenced
= pipe
->is_resource_referenced(pipe
, texture
, face
, level
);
1186 trace_dump_ret(uint
, referenced
);
1187 trace_dump_call_end();
1193 /********************************************************************
1198 static struct pipe_transfer
*
1199 trace_context_get_transfer(struct pipe_context
*_context
,
1200 struct pipe_resource
*_resource
,
1201 struct pipe_subresource sr
,
1203 const struct pipe_box
*box
)
1205 struct trace_context
*tr_context
= trace_context(_context
);
1206 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1207 struct pipe_context
*context
= tr_context
->pipe
;
1208 struct pipe_resource
*texture
= tr_tex
->resource
;
1209 struct pipe_transfer
*result
= NULL
;
1211 assert(texture
->screen
== context
->screen
);
1214 * Map and transfers can't be serialized so we convert all write transfers
1215 * to transfer_inline_write and ignore read transfers.
1218 result
= context
->get_transfer(context
, texture
, sr
, usage
, box
);
1221 result
= trace_transfer_create(tr_context
, tr_tex
, result
);
1228 trace_context_transfer_destroy(struct pipe_context
*_context
,
1229 struct pipe_transfer
*_transfer
)
1231 struct trace_context
*tr_context
= trace_context(_context
);
1232 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1234 trace_transfer_destroy(tr_context
, tr_trans
);
1239 trace_context_transfer_map(struct pipe_context
*_context
,
1240 struct pipe_transfer
*_transfer
)
1242 struct trace_context
*tr_context
= trace_context(_context
);
1243 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1244 struct pipe_context
*context
= tr_context
->pipe
;
1245 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1248 map
= context
->transfer_map(context
, transfer
);
1250 if(transfer
->usage
& PIPE_TRANSFER_WRITE
) {
1251 assert(!tr_trans
->map
);
1252 tr_trans
->map
= map
;
1261 trace_context_transfer_flush_region( struct pipe_context
*_context
,
1262 struct pipe_transfer
*_transfer
,
1263 const struct pipe_box
*box
)
1265 struct trace_context
*tr_context
= trace_context(_context
);
1266 struct trace_transfer
*tr_transfer
= trace_transfer(_transfer
);
1267 struct pipe_context
*context
= tr_context
->pipe
;
1268 struct pipe_transfer
*transfer
= tr_transfer
->transfer
;
1270 context
->transfer_flush_region(context
,
1276 trace_context_transfer_unmap(struct pipe_context
*_context
,
1277 struct pipe_transfer
*_transfer
)
1279 struct trace_context
*tr_ctx
= trace_context(_context
);
1280 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1281 struct pipe_context
*context
= tr_ctx
->pipe
;
1282 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1286 * Fake a transfer_inline_write
1289 struct pipe_resource
*resource
= transfer
->resource
;
1290 struct pipe_subresource sr
= transfer
->sr
;
1291 unsigned usage
= transfer
->usage
;
1292 const struct pipe_box
*box
= &transfer
->box
;
1293 unsigned stride
= transfer
->stride
;
1294 unsigned slice_stride
= transfer
->slice_stride
;
1296 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1298 trace_dump_arg(ptr
, context
);
1299 trace_dump_arg(ptr
, resource
);
1300 trace_dump_arg_struct(subresource
, sr
);
1301 trace_dump_arg(uint
, usage
);
1302 trace_dump_arg(box
, box
);
1304 trace_dump_arg_begin("data");
1305 trace_dump_box_bytes(tr_trans
->map
,
1310 trace_dump_arg_end();
1312 trace_dump_arg(uint
, stride
);
1313 trace_dump_arg(uint
, slice_stride
);
1315 trace_dump_call_end();
1317 tr_trans
->map
= NULL
;
1320 context
->transfer_unmap(context
, transfer
);
1325 trace_context_transfer_inline_write(struct pipe_context
*_context
,
1326 struct pipe_resource
*_resource
,
1327 struct pipe_subresource sr
,
1329 const struct pipe_box
*box
,
1332 unsigned slice_stride
)
1334 struct trace_context
*tr_context
= trace_context(_context
);
1335 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1336 struct pipe_context
*context
= tr_context
->pipe
;
1337 struct pipe_resource
*resource
= tr_tex
->resource
;
1339 assert(resource
->screen
== context
->screen
);
1341 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1343 trace_dump_arg(ptr
, context
);
1344 trace_dump_arg(ptr
, resource
);
1345 trace_dump_arg_struct(subresource
, sr
);
1346 trace_dump_arg(uint
, usage
);
1347 trace_dump_arg(box
, box
);
1349 trace_dump_arg_begin("data");
1350 trace_dump_box_bytes(data
,
1355 trace_dump_arg_end();
1357 trace_dump_arg(uint
, stride
);
1358 trace_dump_arg(uint
, slice_stride
);
1360 trace_dump_call_end();
1362 context
->transfer_inline_write(context
, resource
,
1363 sr
, usage
, box
, data
, stride
, slice_stride
);
1369 static const struct debug_named_value rbug_blocker_flags
[] = {
1370 {"before", 1, NULL
},
1372 DEBUG_NAMED_VALUE_END
1375 struct pipe_context
*
1376 trace_context_create(struct trace_screen
*tr_scr
,
1377 struct pipe_context
*pipe
)
1379 struct trace_context
*tr_ctx
;
1384 if(!trace_enabled())
1387 tr_ctx
= CALLOC_STRUCT(trace_context
);
1391 tr_ctx
->base
.winsys
= NULL
;
1392 tr_ctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
1393 tr_ctx
->base
.screen
= &tr_scr
->base
;
1395 tr_ctx
->base
.destroy
= trace_context_destroy
;
1396 tr_ctx
->base
.draw_vbo
= trace_context_draw_vbo
;
1397 tr_ctx
->base
.create_query
= trace_context_create_query
;
1398 tr_ctx
->base
.destroy_query
= trace_context_destroy_query
;
1399 tr_ctx
->base
.begin_query
= trace_context_begin_query
;
1400 tr_ctx
->base
.end_query
= trace_context_end_query
;
1401 tr_ctx
->base
.get_query_result
= trace_context_get_query_result
;
1402 tr_ctx
->base
.create_blend_state
= trace_context_create_blend_state
;
1403 tr_ctx
->base
.bind_blend_state
= trace_context_bind_blend_state
;
1404 tr_ctx
->base
.delete_blend_state
= trace_context_delete_blend_state
;
1405 tr_ctx
->base
.create_sampler_state
= trace_context_create_sampler_state
;
1406 tr_ctx
->base
.bind_fragment_sampler_states
= trace_context_bind_fragment_sampler_states
;
1407 tr_ctx
->base
.bind_vertex_sampler_states
= trace_context_bind_vertex_sampler_states
;
1408 tr_ctx
->base
.delete_sampler_state
= trace_context_delete_sampler_state
;
1409 tr_ctx
->base
.create_rasterizer_state
= trace_context_create_rasterizer_state
;
1410 tr_ctx
->base
.bind_rasterizer_state
= trace_context_bind_rasterizer_state
;
1411 tr_ctx
->base
.delete_rasterizer_state
= trace_context_delete_rasterizer_state
;
1412 tr_ctx
->base
.create_depth_stencil_alpha_state
= trace_context_create_depth_stencil_alpha_state
;
1413 tr_ctx
->base
.bind_depth_stencil_alpha_state
= trace_context_bind_depth_stencil_alpha_state
;
1414 tr_ctx
->base
.delete_depth_stencil_alpha_state
= trace_context_delete_depth_stencil_alpha_state
;
1415 tr_ctx
->base
.create_fs_state
= trace_context_create_fs_state
;
1416 tr_ctx
->base
.bind_fs_state
= trace_context_bind_fs_state
;
1417 tr_ctx
->base
.delete_fs_state
= trace_context_delete_fs_state
;
1418 tr_ctx
->base
.create_vs_state
= trace_context_create_vs_state
;
1419 tr_ctx
->base
.bind_vs_state
= trace_context_bind_vs_state
;
1420 tr_ctx
->base
.delete_vs_state
= trace_context_delete_vs_state
;
1421 tr_ctx
->base
.create_vertex_elements_state
= trace_context_create_vertex_elements_state
;
1422 tr_ctx
->base
.bind_vertex_elements_state
= trace_context_bind_vertex_elements_state
;
1423 tr_ctx
->base
.delete_vertex_elements_state
= trace_context_delete_vertex_elements_state
;
1424 tr_ctx
->base
.set_blend_color
= trace_context_set_blend_color
;
1425 tr_ctx
->base
.set_stencil_ref
= trace_context_set_stencil_ref
;
1426 tr_ctx
->base
.set_clip_state
= trace_context_set_clip_state
;
1427 tr_ctx
->base
.set_sample_mask
= trace_context_set_sample_mask
;
1428 tr_ctx
->base
.set_constant_buffer
= trace_context_set_constant_buffer
;
1429 tr_ctx
->base
.set_framebuffer_state
= trace_context_set_framebuffer_state
;
1430 tr_ctx
->base
.set_polygon_stipple
= trace_context_set_polygon_stipple
;
1431 tr_ctx
->base
.set_scissor_state
= trace_context_set_scissor_state
;
1432 tr_ctx
->base
.set_viewport_state
= trace_context_set_viewport_state
;
1433 tr_ctx
->base
.set_fragment_sampler_views
= trace_context_set_fragment_sampler_views
;
1434 tr_ctx
->base
.set_vertex_sampler_views
= trace_context_set_vertex_sampler_views
;
1435 tr_ctx
->base
.create_sampler_view
= trace_create_sampler_view
;
1436 tr_ctx
->base
.sampler_view_destroy
= trace_sampler_view_destroy
;
1437 tr_ctx
->base
.set_vertex_buffers
= trace_context_set_vertex_buffers
;
1438 tr_ctx
->base
.set_index_buffer
= trace_context_set_index_buffer
;
1439 tr_ctx
->base
.resource_copy_region
= trace_context_resource_copy_region
;
1440 tr_ctx
->base
.clear
= trace_context_clear
;
1441 tr_ctx
->base
.clear_render_target
= trace_context_clear_render_target
;
1442 tr_ctx
->base
.clear_depth_stencil
= trace_context_clear_depth_stencil
;
1443 tr_ctx
->base
.flush
= trace_context_flush
;
1444 tr_ctx
->base
.is_resource_referenced
= trace_is_resource_referenced
;
1446 tr_ctx
->base
.get_transfer
= trace_context_get_transfer
;
1447 tr_ctx
->base
.transfer_destroy
= trace_context_transfer_destroy
;
1448 tr_ctx
->base
.transfer_map
= trace_context_transfer_map
;
1449 tr_ctx
->base
.transfer_unmap
= trace_context_transfer_unmap
;
1450 tr_ctx
->base
.transfer_flush_region
= trace_context_transfer_flush_region
;
1451 tr_ctx
->base
.transfer_inline_write
= trace_context_transfer_inline_write
;
1453 tr_ctx
->pipe
= pipe
;
1455 return &tr_ctx
->base
;