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_arrays(struct pipe_context
*_pipe
,
87 unsigned mode
, unsigned start
, unsigned count
)
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_arrays");
94 trace_dump_arg(ptr
, pipe
);
95 trace_dump_arg(uint
, mode
);
96 trace_dump_arg(uint
, start
);
97 trace_dump_arg(uint
, count
);
99 pipe
->draw_arrays(pipe
, mode
, start
, count
);
101 trace_dump_call_end();
106 trace_context_draw_elements(struct pipe_context
*_pipe
,
107 struct pipe_resource
*_indexBuffer
,
108 unsigned indexSize
, int indexBias
,
109 unsigned mode
, unsigned start
, unsigned count
)
111 struct trace_context
*tr_ctx
= trace_context(_pipe
);
112 struct trace_resource
*tr_buf
= trace_resource(_indexBuffer
);
113 struct pipe_context
*pipe
= tr_ctx
->pipe
;
114 struct pipe_resource
*indexBuffer
= tr_buf
->resource
;
116 trace_dump_call_begin("pipe_context", "draw_elements");
118 trace_dump_arg(ptr
, pipe
);
119 trace_dump_arg(ptr
, indexBuffer
);
120 trace_dump_arg(uint
, indexSize
);
121 trace_dump_arg(int, indexBias
);
122 trace_dump_arg(uint
, mode
);
123 trace_dump_arg(uint
, start
);
124 trace_dump_arg(uint
, count
);
126 pipe
->draw_elements(pipe
, indexBuffer
, indexSize
, indexBias
,
129 trace_dump_call_end();
134 trace_context_draw_range_elements(struct pipe_context
*_pipe
,
135 struct pipe_resource
*_indexBuffer
,
144 struct trace_context
*tr_ctx
= trace_context(_pipe
);
145 struct trace_resource
*tr_buf
= trace_resource(_indexBuffer
);
146 struct pipe_context
*pipe
= tr_ctx
->pipe
;
147 struct pipe_resource
*indexBuffer
= tr_buf
->resource
;
149 trace_dump_call_begin("pipe_context", "draw_range_elements");
151 trace_dump_arg(ptr
, pipe
);
152 trace_dump_arg(ptr
, indexBuffer
);
153 trace_dump_arg(uint
, indexSize
);
154 trace_dump_arg(int, indexBias
);
155 trace_dump_arg(uint
, minIndex
);
156 trace_dump_arg(uint
, maxIndex
);
157 trace_dump_arg(uint
, mode
);
158 trace_dump_arg(uint
, start
);
159 trace_dump_arg(uint
, count
);
161 pipe
->draw_range_elements(pipe
,
162 indexBuffer
, indexSize
, indexBias
,
166 trace_dump_call_end();
170 static INLINE
struct pipe_query
*
171 trace_context_create_query(struct pipe_context
*_pipe
,
174 struct trace_context
*tr_ctx
= trace_context(_pipe
);
175 struct pipe_context
*pipe
= tr_ctx
->pipe
;
176 struct pipe_query
*result
;
178 trace_dump_call_begin("pipe_context", "create_query");
180 trace_dump_arg(ptr
, pipe
);
181 trace_dump_arg(uint
, query_type
);
183 result
= pipe
->create_query(pipe
, query_type
);
185 trace_dump_ret(ptr
, result
);
187 trace_dump_call_end();
194 trace_context_destroy_query(struct pipe_context
*_pipe
,
195 struct pipe_query
*query
)
197 struct trace_context
*tr_ctx
= trace_context(_pipe
);
198 struct pipe_context
*pipe
= tr_ctx
->pipe
;
200 trace_dump_call_begin("pipe_context", "destroy_query");
202 trace_dump_arg(ptr
, pipe
);
203 trace_dump_arg(ptr
, query
);
205 pipe
->destroy_query(pipe
, query
);
207 trace_dump_call_end();
212 trace_context_begin_query(struct pipe_context
*_pipe
,
213 struct pipe_query
*query
)
215 struct trace_context
*tr_ctx
= trace_context(_pipe
);
216 struct pipe_context
*pipe
= tr_ctx
->pipe
;
218 trace_dump_call_begin("pipe_context", "begin_query");
220 trace_dump_arg(ptr
, pipe
);
221 trace_dump_arg(ptr
, query
);
223 pipe
->begin_query(pipe
, query
);
225 trace_dump_call_end();
230 trace_context_end_query(struct pipe_context
*_pipe
,
231 struct pipe_query
*query
)
233 struct trace_context
*tr_ctx
= trace_context(_pipe
);
234 struct pipe_context
*pipe
= tr_ctx
->pipe
;
236 trace_dump_call_begin("pipe_context", "end_query");
238 trace_dump_arg(ptr
, pipe
);
239 trace_dump_arg(ptr
, query
);
241 pipe
->end_query(pipe
, query
);
243 trace_dump_call_end();
247 static INLINE boolean
248 trace_context_get_query_result(struct pipe_context
*_pipe
,
249 struct pipe_query
*query
,
253 struct trace_context
*tr_ctx
= trace_context(_pipe
);
254 struct pipe_context
*pipe
= tr_ctx
->pipe
;
258 trace_dump_call_begin("pipe_context", "get_query_result");
260 trace_dump_arg(ptr
, pipe
);
262 _result
= pipe
->get_query_result(pipe
, query
, wait
, presult
);
265 trace_dump_arg(uint
, result
);
266 trace_dump_ret(bool, _result
);
268 trace_dump_call_end();
275 trace_context_create_blend_state(struct pipe_context
*_pipe
,
276 const struct pipe_blend_state
*state
)
278 struct trace_context
*tr_ctx
= trace_context(_pipe
);
279 struct pipe_context
*pipe
= tr_ctx
->pipe
;
282 trace_dump_call_begin("pipe_context", "create_blend_state");
284 trace_dump_arg(ptr
, pipe
);
285 trace_dump_arg(blend_state
, state
);
287 result
= pipe
->create_blend_state(pipe
, state
);
289 trace_dump_ret(ptr
, result
);
291 trace_dump_call_end();
298 trace_context_bind_blend_state(struct pipe_context
*_pipe
,
301 struct trace_context
*tr_ctx
= trace_context(_pipe
);
302 struct pipe_context
*pipe
= tr_ctx
->pipe
;
304 trace_dump_call_begin("pipe_context", "bind_blend_state");
306 trace_dump_arg(ptr
, pipe
);
307 trace_dump_arg(ptr
, state
);
309 pipe
->bind_blend_state(pipe
, state
);
311 trace_dump_call_end();
316 trace_context_delete_blend_state(struct pipe_context
*_pipe
,
319 struct trace_context
*tr_ctx
= trace_context(_pipe
);
320 struct pipe_context
*pipe
= tr_ctx
->pipe
;
322 trace_dump_call_begin("pipe_context", "delete_blend_state");
324 trace_dump_arg(ptr
, pipe
);
325 trace_dump_arg(ptr
, state
);
327 pipe
->delete_blend_state(pipe
, state
);
329 trace_dump_call_end();
334 trace_context_create_sampler_state(struct pipe_context
*_pipe
,
335 const struct pipe_sampler_state
*state
)
337 struct trace_context
*tr_ctx
= trace_context(_pipe
);
338 struct pipe_context
*pipe
= tr_ctx
->pipe
;
341 trace_dump_call_begin("pipe_context", "create_sampler_state");
343 trace_dump_arg(ptr
, pipe
);
344 trace_dump_arg(sampler_state
, state
);
346 result
= pipe
->create_sampler_state(pipe
, state
);
348 trace_dump_ret(ptr
, result
);
350 trace_dump_call_end();
357 trace_context_bind_fragment_sampler_states(struct pipe_context
*_pipe
,
361 struct trace_context
*tr_ctx
= trace_context(_pipe
);
362 struct pipe_context
*pipe
= tr_ctx
->pipe
;
364 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
366 trace_dump_arg(ptr
, pipe
);
367 trace_dump_arg(uint
, num_states
);
368 trace_dump_arg_array(ptr
, states
, num_states
);
370 pipe
->bind_fragment_sampler_states(pipe
, num_states
, states
);
372 trace_dump_call_end();
377 trace_context_bind_vertex_sampler_states(struct pipe_context
*_pipe
,
381 struct trace_context
*tr_ctx
= trace_context(_pipe
);
382 struct pipe_context
*pipe
= tr_ctx
->pipe
;
384 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
386 trace_dump_arg(ptr
, pipe
);
387 trace_dump_arg(uint
, num_states
);
388 trace_dump_arg_array(ptr
, states
, num_states
);
390 pipe
->bind_vertex_sampler_states(pipe
, num_states
, states
);
392 trace_dump_call_end();
397 trace_context_delete_sampler_state(struct pipe_context
*_pipe
,
400 struct trace_context
*tr_ctx
= trace_context(_pipe
);
401 struct pipe_context
*pipe
= tr_ctx
->pipe
;
403 trace_dump_call_begin("pipe_context", "delete_sampler_state");
405 trace_dump_arg(ptr
, pipe
);
406 trace_dump_arg(ptr
, state
);
408 pipe
->delete_sampler_state(pipe
, state
);
410 trace_dump_call_end();
415 trace_context_create_rasterizer_state(struct pipe_context
*_pipe
,
416 const struct pipe_rasterizer_state
*state
)
418 struct trace_context
*tr_ctx
= trace_context(_pipe
);
419 struct pipe_context
*pipe
= tr_ctx
->pipe
;
422 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
424 trace_dump_arg(ptr
, pipe
);
425 trace_dump_arg(rasterizer_state
, state
);
427 result
= pipe
->create_rasterizer_state(pipe
, state
);
429 trace_dump_ret(ptr
, result
);
431 trace_dump_call_end();
438 trace_context_bind_rasterizer_state(struct pipe_context
*_pipe
,
441 struct trace_context
*tr_ctx
= trace_context(_pipe
);
442 struct pipe_context
*pipe
= tr_ctx
->pipe
;
444 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
446 trace_dump_arg(ptr
, pipe
);
447 trace_dump_arg(ptr
, state
);
449 pipe
->bind_rasterizer_state(pipe
, state
);
451 trace_dump_call_end();
456 trace_context_delete_rasterizer_state(struct pipe_context
*_pipe
,
459 struct trace_context
*tr_ctx
= trace_context(_pipe
);
460 struct pipe_context
*pipe
= tr_ctx
->pipe
;
462 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
464 trace_dump_arg(ptr
, pipe
);
465 trace_dump_arg(ptr
, state
);
467 pipe
->delete_rasterizer_state(pipe
, state
);
469 trace_dump_call_end();
474 trace_context_create_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
475 const struct pipe_depth_stencil_alpha_state
*state
)
477 struct trace_context
*tr_ctx
= trace_context(_pipe
);
478 struct pipe_context
*pipe
= tr_ctx
->pipe
;
481 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
483 result
= pipe
->create_depth_stencil_alpha_state(pipe
, state
);
485 trace_dump_arg(ptr
, pipe
);
486 trace_dump_arg(depth_stencil_alpha_state
, state
);
488 trace_dump_ret(ptr
, result
);
490 trace_dump_call_end();
497 trace_context_bind_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
500 struct trace_context
*tr_ctx
= trace_context(_pipe
);
501 struct pipe_context
*pipe
= tr_ctx
->pipe
;
503 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
505 trace_dump_arg(ptr
, pipe
);
506 trace_dump_arg(ptr
, state
);
508 pipe
->bind_depth_stencil_alpha_state(pipe
, state
);
510 trace_dump_call_end();
515 trace_context_delete_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
518 struct trace_context
*tr_ctx
= trace_context(_pipe
);
519 struct pipe_context
*pipe
= tr_ctx
->pipe
;
521 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
523 trace_dump_arg(ptr
, pipe
);
524 trace_dump_arg(ptr
, state
);
526 pipe
->delete_depth_stencil_alpha_state(pipe
, state
);
528 trace_dump_call_end();
533 trace_context_create_fs_state(struct pipe_context
*_pipe
,
534 const struct pipe_shader_state
*state
)
536 struct trace_context
*tr_ctx
= trace_context(_pipe
);
537 struct pipe_context
*pipe
= tr_ctx
->pipe
;
540 trace_dump_call_begin("pipe_context", "create_fs_state");
542 trace_dump_arg(ptr
, pipe
);
543 trace_dump_arg(shader_state
, state
);
545 result
= pipe
->create_fs_state(pipe
, state
);
547 trace_dump_ret(ptr
, result
);
549 trace_dump_call_end();
556 trace_context_bind_fs_state(struct pipe_context
*_pipe
,
559 struct trace_context
*tr_ctx
= trace_context(_pipe
);
560 struct pipe_context
*pipe
= tr_ctx
->pipe
;
562 trace_dump_call_begin("pipe_context", "bind_fs_state");
564 trace_dump_arg(ptr
, pipe
);
565 trace_dump_arg(ptr
, state
);
567 pipe
->bind_fs_state(pipe
, state
);
569 trace_dump_call_end();
574 trace_context_delete_fs_state(struct pipe_context
*_pipe
,
577 struct trace_context
*tr_ctx
= trace_context(_pipe
);
578 struct pipe_context
*pipe
= tr_ctx
->pipe
;
580 trace_dump_call_begin("pipe_context", "delete_fs_state");
582 trace_dump_arg(ptr
, pipe
);
583 trace_dump_arg(ptr
, state
);
585 pipe
->delete_fs_state(pipe
, state
);
587 trace_dump_call_end();
592 trace_context_create_vs_state(struct pipe_context
*_pipe
,
593 const struct pipe_shader_state
*state
)
595 struct trace_context
*tr_ctx
= trace_context(_pipe
);
596 struct pipe_context
*pipe
= tr_ctx
->pipe
;
599 trace_dump_call_begin("pipe_context", "create_vs_state");
601 trace_dump_arg(ptr
, pipe
);
602 trace_dump_arg(shader_state
, state
);
604 result
= pipe
->create_vs_state(pipe
, state
);
606 trace_dump_ret(ptr
, result
);
608 trace_dump_call_end();
615 trace_context_bind_vs_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_vs_state");
623 trace_dump_arg(ptr
, pipe
);
624 trace_dump_arg(ptr
, state
);
626 pipe
->bind_vs_state(pipe
, state
);
628 trace_dump_call_end();
633 trace_context_delete_vs_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_vs_state");
641 trace_dump_arg(ptr
, pipe
);
642 trace_dump_arg(ptr
, state
);
644 pipe
->delete_vs_state(pipe
, state
);
646 trace_dump_call_end();
651 trace_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
652 unsigned num_elements
,
653 const struct pipe_vertex_element
*elements
)
655 struct trace_context
*tr_ctx
= trace_context(_pipe
);
656 struct pipe_context
*pipe
= tr_ctx
->pipe
;
659 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
661 trace_dump_arg(ptr
, pipe
);
662 trace_dump_arg(uint
, num_elements
);
664 trace_dump_arg_begin("elements");
665 trace_dump_struct_array(vertex_element
, elements
, num_elements
);
666 trace_dump_arg_end();
668 result
= pipe
->create_vertex_elements_state(pipe
, num_elements
, elements
);
670 trace_dump_ret(ptr
, result
);
672 trace_dump_call_end();
679 trace_context_bind_vertex_elements_state(struct pipe_context
*_pipe
,
682 struct trace_context
*tr_ctx
= trace_context(_pipe
);
683 struct pipe_context
*pipe
= tr_ctx
->pipe
;
685 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
687 trace_dump_arg(ptr
, pipe
);
688 trace_dump_arg(ptr
, state
);
690 pipe
->bind_vertex_elements_state(pipe
, state
);
692 trace_dump_call_end();
697 trace_context_delete_vertex_elements_state(struct pipe_context
*_pipe
,
700 struct trace_context
*tr_ctx
= trace_context(_pipe
);
701 struct pipe_context
*pipe
= tr_ctx
->pipe
;
703 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
705 trace_dump_arg(ptr
, pipe
);
706 trace_dump_arg(ptr
, state
);
708 pipe
->delete_vertex_elements_state(pipe
, state
);
710 trace_dump_call_end();
715 trace_context_set_blend_color(struct pipe_context
*_pipe
,
716 const struct pipe_blend_color
*state
)
718 struct trace_context
*tr_ctx
= trace_context(_pipe
);
719 struct pipe_context
*pipe
= tr_ctx
->pipe
;
721 trace_dump_call_begin("pipe_context", "set_blend_color");
723 trace_dump_arg(ptr
, pipe
);
724 trace_dump_arg(blend_color
, state
);
726 pipe
->set_blend_color(pipe
, state
);
728 trace_dump_call_end();
733 trace_context_set_stencil_ref(struct pipe_context
*_pipe
,
734 const struct pipe_stencil_ref
*state
)
736 struct trace_context
*tr_ctx
= trace_context(_pipe
);
737 struct pipe_context
*pipe
= tr_ctx
->pipe
;
739 trace_dump_call_begin("pipe_context", "set_stencil_ref");
741 trace_dump_arg(ptr
, pipe
);
742 trace_dump_arg(stencil_ref
, state
);
744 pipe
->set_stencil_ref(pipe
, state
);
746 trace_dump_call_end();
751 trace_context_set_clip_state(struct pipe_context
*_pipe
,
752 const struct pipe_clip_state
*state
)
754 struct trace_context
*tr_ctx
= trace_context(_pipe
);
755 struct pipe_context
*pipe
= tr_ctx
->pipe
;
757 trace_dump_call_begin("pipe_context", "set_clip_state");
759 trace_dump_arg(ptr
, pipe
);
760 trace_dump_arg(clip_state
, state
);
762 pipe
->set_clip_state(pipe
, state
);
764 trace_dump_call_end();
769 trace_context_set_constant_buffer(struct pipe_context
*_pipe
,
770 uint shader
, uint index
,
771 struct pipe_resource
*buffer
)
773 struct trace_context
*tr_ctx
= trace_context(_pipe
);
774 struct pipe_context
*pipe
= tr_ctx
->pipe
;
777 buffer
= trace_resource_unwrap(tr_ctx
, buffer
);
780 trace_dump_call_begin("pipe_context", "set_constant_buffer");
782 trace_dump_arg(ptr
, pipe
);
783 trace_dump_arg(uint
, shader
);
784 trace_dump_arg(uint
, index
);
785 trace_dump_arg(ptr
, buffer
);
787 pipe
->set_constant_buffer(pipe
, shader
, index
, buffer
);
789 trace_dump_call_end();
794 trace_context_set_framebuffer_state(struct pipe_context
*_pipe
,
795 const struct pipe_framebuffer_state
*state
)
797 struct trace_context
*tr_ctx
= trace_context(_pipe
);
798 struct pipe_context
*pipe
= tr_ctx
->pipe
;
799 struct pipe_framebuffer_state unwrapped_state
;
803 /* Unwrap the input state */
804 memcpy(&unwrapped_state
, state
, sizeof(unwrapped_state
));
805 for(i
= 0; i
< state
->nr_cbufs
; ++i
)
806 unwrapped_state
.cbufs
[i
] = trace_surface_unwrap(tr_ctx
, state
->cbufs
[i
]);
807 for(i
= state
->nr_cbufs
; i
< PIPE_MAX_COLOR_BUFS
; ++i
)
808 unwrapped_state
.cbufs
[i
] = NULL
;
809 unwrapped_state
.zsbuf
= trace_surface_unwrap(tr_ctx
, state
->zsbuf
);
810 state
= &unwrapped_state
;
812 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
814 trace_dump_arg(ptr
, pipe
);
815 trace_dump_arg(framebuffer_state
, state
);
817 pipe
->set_framebuffer_state(pipe
, state
);
819 trace_dump_call_end();
824 trace_context_set_polygon_stipple(struct pipe_context
*_pipe
,
825 const struct pipe_poly_stipple
*state
)
827 struct trace_context
*tr_ctx
= trace_context(_pipe
);
828 struct pipe_context
*pipe
= tr_ctx
->pipe
;
830 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
832 trace_dump_arg(ptr
, pipe
);
833 trace_dump_arg(poly_stipple
, state
);
835 pipe
->set_polygon_stipple(pipe
, state
);
837 trace_dump_call_end();
842 trace_context_set_scissor_state(struct pipe_context
*_pipe
,
843 const struct pipe_scissor_state
*state
)
845 struct trace_context
*tr_ctx
= trace_context(_pipe
);
846 struct pipe_context
*pipe
= tr_ctx
->pipe
;
848 trace_dump_call_begin("pipe_context", "set_scissor_state");
850 trace_dump_arg(ptr
, pipe
);
851 trace_dump_arg(scissor_state
, state
);
853 pipe
->set_scissor_state(pipe
, state
);
855 trace_dump_call_end();
860 trace_context_set_viewport_state(struct pipe_context
*_pipe
,
861 const struct pipe_viewport_state
*state
)
863 struct trace_context
*tr_ctx
= trace_context(_pipe
);
864 struct pipe_context
*pipe
= tr_ctx
->pipe
;
866 trace_dump_call_begin("pipe_context", "set_viewport_state");
868 trace_dump_arg(ptr
, pipe
);
869 trace_dump_arg(viewport_state
, state
);
871 pipe
->set_viewport_state(pipe
, state
);
873 trace_dump_call_end();
877 static struct pipe_sampler_view
*
878 trace_create_sampler_view(struct pipe_context
*_pipe
,
879 struct pipe_resource
*_resource
,
880 const struct pipe_sampler_view
*templ
)
882 struct trace_context
*tr_ctx
= trace_context(_pipe
);
883 struct trace_resource
*tr_tex
= trace_resource(_resource
);
884 struct pipe_context
*pipe
= tr_ctx
->pipe
;
885 struct pipe_resource
*texture
= tr_tex
->resource
;
886 struct pipe_sampler_view
*result
;
887 struct trace_sampler_view
*tr_view
;
889 trace_dump_call_begin("pipe_context", "create_sampler_view");
891 trace_dump_arg(ptr
, pipe
);
892 trace_dump_arg(ptr
, texture
);
893 trace_dump_arg(sampler_view_template
, templ
);
895 result
= pipe
->create_sampler_view(pipe
, texture
, templ
);
897 trace_dump_ret(ptr
, result
);
899 trace_dump_call_end();
902 * Wrap pipe_sampler_view
904 tr_view
= CALLOC_STRUCT(trace_sampler_view
);
905 tr_view
->base
= *templ
;
906 tr_view
->base
.reference
.count
= 1;
907 tr_view
->base
.texture
= NULL
;
908 pipe_resource_reference(&tr_view
->base
.texture
, _resource
);
909 tr_view
->base
.context
= _pipe
;
910 tr_view
->sampler_view
= result
;
911 result
= &tr_view
->base
;
918 trace_sampler_view_destroy(struct pipe_context
*_pipe
,
919 struct pipe_sampler_view
*_view
)
921 struct trace_context
*tr_ctx
= trace_context(_pipe
);
922 struct trace_sampler_view
*tr_view
= trace_sampler_view(_view
);
923 struct pipe_context
*pipe
= tr_ctx
->pipe
;
924 struct pipe_sampler_view
*view
= tr_view
->sampler_view
;
926 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
928 trace_dump_arg(ptr
, pipe
);
929 trace_dump_arg(ptr
, view
);
931 pipe
->sampler_view_destroy(pipe
, view
);
933 trace_dump_call_end();
935 pipe_resource_reference(&_view
->texture
, NULL
);
941 trace_context_set_fragment_sampler_views(struct pipe_context
*_pipe
,
943 struct pipe_sampler_view
**views
)
945 struct trace_context
*tr_ctx
= trace_context(_pipe
);
946 struct trace_sampler_view
*tr_view
;
947 struct pipe_context
*pipe
= tr_ctx
->pipe
;
948 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_SAMPLERS
];
951 for(i
= 0; i
< num
; ++i
) {
952 tr_view
= trace_sampler_view(views
[i
]);
953 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
955 views
= unwrapped_views
;
957 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
959 trace_dump_arg(ptr
, pipe
);
960 trace_dump_arg(uint
, num
);
961 trace_dump_arg_array(ptr
, views
, num
);
963 pipe
->set_fragment_sampler_views(pipe
, num
, views
);
965 trace_dump_call_end();
970 trace_context_set_vertex_sampler_views(struct pipe_context
*_pipe
,
972 struct pipe_sampler_view
**views
)
974 struct trace_context
*tr_ctx
= trace_context(_pipe
);
975 struct trace_sampler_view
*tr_view
;
976 struct pipe_context
*pipe
= tr_ctx
->pipe
;
977 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_VERTEX_SAMPLERS
];
980 for(i
= 0; i
< num
; ++i
) {
981 tr_view
= trace_sampler_view(views
[i
]);
982 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
984 views
= unwrapped_views
;
986 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
988 trace_dump_arg(ptr
, pipe
);
989 trace_dump_arg(uint
, num
);
990 trace_dump_arg_array(ptr
, views
, num
);
992 pipe
->set_vertex_sampler_views(pipe
, num
, views
);
994 trace_dump_call_end();
999 trace_context_set_vertex_buffers(struct pipe_context
*_pipe
,
1000 unsigned num_buffers
,
1001 const struct pipe_vertex_buffer
*buffers
)
1003 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1004 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1007 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
1009 trace_dump_arg(ptr
, pipe
);
1010 trace_dump_arg(uint
, num_buffers
);
1012 trace_dump_arg_begin("buffers");
1013 trace_dump_struct_array(vertex_buffer
, buffers
, num_buffers
);
1014 trace_dump_arg_end();
1017 struct pipe_vertex_buffer
*_buffers
= MALLOC(num_buffers
* sizeof(*_buffers
));
1018 memcpy(_buffers
, buffers
, num_buffers
* sizeof(*_buffers
));
1019 for (i
= 0; i
< num_buffers
; i
++)
1020 _buffers
[i
].buffer
= trace_resource_unwrap(tr_ctx
, buffers
[i
].buffer
);
1021 pipe
->set_vertex_buffers(pipe
, num_buffers
, _buffers
);
1024 pipe
->set_vertex_buffers(pipe
, num_buffers
, NULL
);
1027 trace_dump_call_end();
1032 trace_context_surface_copy(struct pipe_context
*_pipe
,
1033 struct pipe_surface
*dest
,
1034 unsigned destx
, unsigned desty
,
1035 struct pipe_surface
*src
,
1036 unsigned srcx
, unsigned srcy
,
1037 unsigned width
, unsigned height
)
1039 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1040 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1042 dest
= trace_surface_unwrap(tr_ctx
, dest
);
1043 src
= trace_surface_unwrap(tr_ctx
, src
);
1045 trace_dump_call_begin("pipe_context", "surface_copy");
1047 trace_dump_arg(ptr
, pipe
);
1048 trace_dump_arg(ptr
, dest
);
1049 trace_dump_arg(uint
, destx
);
1050 trace_dump_arg(uint
, desty
);
1051 trace_dump_arg(ptr
, src
);
1052 trace_dump_arg(uint
, srcx
);
1053 trace_dump_arg(uint
, srcy
);
1054 trace_dump_arg(uint
, width
);
1055 trace_dump_arg(uint
, height
);
1057 pipe
->surface_copy(pipe
,
1059 src
, srcx
, srcy
, width
, height
);
1061 trace_dump_call_end();
1066 trace_context_surface_fill(struct pipe_context
*_pipe
,
1067 struct pipe_surface
*dst
,
1068 unsigned dstx
, unsigned dsty
,
1069 unsigned width
, unsigned height
,
1072 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1073 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1075 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1077 trace_dump_call_begin("pipe_context", "surface_fill");
1079 trace_dump_arg(ptr
, pipe
);
1080 trace_dump_arg(ptr
, dst
);
1081 trace_dump_arg(uint
, dstx
);
1082 trace_dump_arg(uint
, dsty
);
1083 trace_dump_arg(uint
, width
);
1084 trace_dump_arg(uint
, height
);
1086 pipe
->surface_fill(pipe
, dst
, dstx
, dsty
, width
, height
, value
);
1088 trace_dump_call_end();
1093 trace_context_clear(struct pipe_context
*_pipe
,
1099 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1100 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1102 trace_dump_call_begin("pipe_context", "clear");
1104 trace_dump_arg(ptr
, pipe
);
1105 trace_dump_arg(uint
, buffers
);
1106 trace_dump_arg_array(float, rgba
, 4);
1107 trace_dump_arg(float, depth
);
1108 trace_dump_arg(uint
, stencil
);
1110 pipe
->clear(pipe
, buffers
, rgba
, depth
, stencil
);
1112 trace_dump_call_end();
1117 trace_context_flush(struct pipe_context
*_pipe
,
1119 struct pipe_fence_handle
**fence
)
1121 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1122 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1124 trace_dump_call_begin("pipe_context", "flush");
1126 trace_dump_arg(ptr
, pipe
);
1127 trace_dump_arg(uint
, flags
);
1129 pipe
->flush(pipe
, flags
, fence
);
1132 trace_dump_ret(ptr
, *fence
);
1134 trace_dump_call_end();
1139 trace_context_destroy(struct pipe_context
*_pipe
)
1141 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1142 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1144 trace_dump_call_begin("pipe_context", "destroy");
1145 trace_dump_arg(ptr
, pipe
);
1146 trace_dump_call_end();
1148 pipe
->destroy(pipe
);
1154 trace_is_resource_referenced( struct pipe_context
*_pipe
,
1155 struct pipe_resource
*_resource
,
1156 unsigned face
, unsigned level
)
1158 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1159 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1160 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1161 struct pipe_resource
*texture
= tr_tex
->resource
;
1162 unsigned int referenced
;
1164 trace_dump_call_begin("pipe_context", "is_resource_referenced");
1165 trace_dump_arg(ptr
, pipe
);
1166 trace_dump_arg(ptr
, texture
);
1167 trace_dump_arg(uint
, face
);
1168 trace_dump_arg(uint
, level
);
1170 referenced
= pipe
->is_resource_referenced(pipe
, texture
, face
, level
);
1172 trace_dump_ret(uint
, referenced
);
1173 trace_dump_call_end();
1179 /********************************************************************
1184 static struct pipe_transfer
*
1185 trace_context_get_transfer(struct pipe_context
*_context
,
1186 struct pipe_resource
*_resource
,
1187 struct pipe_subresource sr
,
1189 const struct pipe_box
*box
)
1191 struct trace_context
*tr_context
= trace_context(_context
);
1192 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1193 struct pipe_context
*context
= tr_context
->pipe
;
1194 struct pipe_resource
*texture
= tr_tex
->resource
;
1195 struct pipe_transfer
*result
= NULL
;
1197 assert(texture
->screen
== context
->screen
);
1200 * Map and transfers can't be serialized so we convert all write transfers
1201 * to transfer_inline_write and ignore read transfers.
1204 result
= context
->get_transfer(context
, texture
, sr
, usage
, box
);
1207 result
= trace_transfer_create(tr_context
, tr_tex
, result
);
1214 trace_context_transfer_destroy(struct pipe_context
*_context
,
1215 struct pipe_transfer
*_transfer
)
1217 struct trace_context
*tr_context
= trace_context(_context
);
1218 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1220 trace_transfer_destroy(tr_context
, tr_trans
);
1225 trace_context_transfer_map(struct pipe_context
*_context
,
1226 struct pipe_transfer
*_transfer
)
1228 struct trace_context
*tr_context
= trace_context(_context
);
1229 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1230 struct pipe_context
*context
= tr_context
->pipe
;
1231 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1234 map
= context
->transfer_map(context
, transfer
);
1236 if(transfer
->usage
& PIPE_TRANSFER_WRITE
) {
1237 assert(!tr_trans
->map
);
1238 tr_trans
->map
= map
;
1247 trace_context_transfer_flush_region( struct pipe_context
*_context
,
1248 struct pipe_transfer
*_transfer
,
1249 const struct pipe_box
*box
)
1251 struct trace_context
*tr_context
= trace_context(_context
);
1252 struct trace_transfer
*tr_transfer
= trace_transfer(_transfer
);
1253 struct pipe_context
*context
= tr_context
->pipe
;
1254 struct pipe_transfer
*transfer
= tr_transfer
->transfer
;
1256 context
->transfer_flush_region(context
,
1262 trace_context_transfer_unmap(struct pipe_context
*_context
,
1263 struct pipe_transfer
*_transfer
)
1265 struct trace_context
*tr_ctx
= trace_context(_context
);
1266 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1267 struct pipe_context
*context
= tr_ctx
->pipe
;
1268 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1272 * Fake a transfer_inline_write
1275 struct pipe_resource
*resource
= transfer
->resource
;
1276 struct pipe_subresource sr
= transfer
->sr
;
1277 unsigned usage
= transfer
->usage
;
1278 const struct pipe_box
*box
= &transfer
->box
;
1279 unsigned stride
= transfer
->stride
;
1280 unsigned slice_stride
= transfer
->slice_stride
;
1282 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1284 trace_dump_arg(ptr
, context
);
1285 trace_dump_arg(ptr
, resource
);
1286 trace_dump_arg_struct(subresource
, sr
);
1287 trace_dump_arg(uint
, usage
);
1288 trace_dump_arg(box
, box
);
1290 trace_dump_arg_begin("data");
1291 trace_dump_box_bytes(tr_trans
->map
,
1296 trace_dump_arg_end();
1298 trace_dump_arg(uint
, stride
);
1299 trace_dump_arg(uint
, slice_stride
);
1301 trace_dump_call_end();
1303 tr_trans
->map
= NULL
;
1306 context
->transfer_unmap(context
, transfer
);
1311 trace_context_transfer_inline_write(struct pipe_context
*_context
,
1312 struct pipe_resource
*_resource
,
1313 struct pipe_subresource sr
,
1315 const struct pipe_box
*box
,
1318 unsigned slice_stride
)
1320 struct trace_context
*tr_context
= trace_context(_context
);
1321 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1322 struct pipe_context
*context
= tr_context
->pipe
;
1323 struct pipe_resource
*resource
= tr_tex
->resource
;
1325 assert(resource
->screen
== context
->screen
);
1327 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1329 trace_dump_arg(ptr
, context
);
1330 trace_dump_arg(ptr
, resource
);
1331 trace_dump_arg_struct(subresource
, sr
);
1332 trace_dump_arg(uint
, usage
);
1333 trace_dump_arg(box
, box
);
1335 trace_dump_arg_begin("data");
1336 trace_dump_box_bytes(data
,
1341 trace_dump_arg_end();
1343 trace_dump_arg(uint
, stride
);
1344 trace_dump_arg(uint
, slice_stride
);
1346 trace_dump_call_end();
1348 context
->transfer_inline_write(context
, resource
,
1349 sr
, usage
, box
, data
, stride
, slice_stride
);
1355 static const struct debug_named_value rbug_blocker_flags
[] = {
1361 struct pipe_context
*
1362 trace_context_create(struct trace_screen
*tr_scr
,
1363 struct pipe_context
*pipe
)
1365 struct trace_context
*tr_ctx
;
1370 if(!trace_enabled())
1373 tr_ctx
= CALLOC_STRUCT(trace_context
);
1377 tr_ctx
->base
.winsys
= NULL
;
1378 tr_ctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
1379 tr_ctx
->base
.screen
= &tr_scr
->base
;
1381 tr_ctx
->base
.destroy
= trace_context_destroy
;
1382 tr_ctx
->base
.draw_arrays
= trace_context_draw_arrays
;
1383 tr_ctx
->base
.draw_elements
= trace_context_draw_elements
;
1384 tr_ctx
->base
.draw_range_elements
= trace_context_draw_range_elements
;
1385 tr_ctx
->base
.create_query
= trace_context_create_query
;
1386 tr_ctx
->base
.destroy_query
= trace_context_destroy_query
;
1387 tr_ctx
->base
.begin_query
= trace_context_begin_query
;
1388 tr_ctx
->base
.end_query
= trace_context_end_query
;
1389 tr_ctx
->base
.get_query_result
= trace_context_get_query_result
;
1390 tr_ctx
->base
.create_blend_state
= trace_context_create_blend_state
;
1391 tr_ctx
->base
.bind_blend_state
= trace_context_bind_blend_state
;
1392 tr_ctx
->base
.delete_blend_state
= trace_context_delete_blend_state
;
1393 tr_ctx
->base
.create_sampler_state
= trace_context_create_sampler_state
;
1394 tr_ctx
->base
.bind_fragment_sampler_states
= trace_context_bind_fragment_sampler_states
;
1395 tr_ctx
->base
.bind_vertex_sampler_states
= trace_context_bind_vertex_sampler_states
;
1396 tr_ctx
->base
.delete_sampler_state
= trace_context_delete_sampler_state
;
1397 tr_ctx
->base
.create_rasterizer_state
= trace_context_create_rasterizer_state
;
1398 tr_ctx
->base
.bind_rasterizer_state
= trace_context_bind_rasterizer_state
;
1399 tr_ctx
->base
.delete_rasterizer_state
= trace_context_delete_rasterizer_state
;
1400 tr_ctx
->base
.create_depth_stencil_alpha_state
= trace_context_create_depth_stencil_alpha_state
;
1401 tr_ctx
->base
.bind_depth_stencil_alpha_state
= trace_context_bind_depth_stencil_alpha_state
;
1402 tr_ctx
->base
.delete_depth_stencil_alpha_state
= trace_context_delete_depth_stencil_alpha_state
;
1403 tr_ctx
->base
.create_fs_state
= trace_context_create_fs_state
;
1404 tr_ctx
->base
.bind_fs_state
= trace_context_bind_fs_state
;
1405 tr_ctx
->base
.delete_fs_state
= trace_context_delete_fs_state
;
1406 tr_ctx
->base
.create_vs_state
= trace_context_create_vs_state
;
1407 tr_ctx
->base
.bind_vs_state
= trace_context_bind_vs_state
;
1408 tr_ctx
->base
.delete_vs_state
= trace_context_delete_vs_state
;
1409 tr_ctx
->base
.create_vertex_elements_state
= trace_context_create_vertex_elements_state
;
1410 tr_ctx
->base
.bind_vertex_elements_state
= trace_context_bind_vertex_elements_state
;
1411 tr_ctx
->base
.delete_vertex_elements_state
= trace_context_delete_vertex_elements_state
;
1412 tr_ctx
->base
.set_blend_color
= trace_context_set_blend_color
;
1413 tr_ctx
->base
.set_stencil_ref
= trace_context_set_stencil_ref
;
1414 tr_ctx
->base
.set_clip_state
= trace_context_set_clip_state
;
1415 tr_ctx
->base
.set_constant_buffer
= trace_context_set_constant_buffer
;
1416 tr_ctx
->base
.set_framebuffer_state
= trace_context_set_framebuffer_state
;
1417 tr_ctx
->base
.set_polygon_stipple
= trace_context_set_polygon_stipple
;
1418 tr_ctx
->base
.set_scissor_state
= trace_context_set_scissor_state
;
1419 tr_ctx
->base
.set_viewport_state
= trace_context_set_viewport_state
;
1420 tr_ctx
->base
.set_fragment_sampler_views
= trace_context_set_fragment_sampler_views
;
1421 tr_ctx
->base
.set_vertex_sampler_views
= trace_context_set_vertex_sampler_views
;
1422 tr_ctx
->base
.create_sampler_view
= trace_create_sampler_view
;
1423 tr_ctx
->base
.sampler_view_destroy
= trace_sampler_view_destroy
;
1424 tr_ctx
->base
.set_vertex_buffers
= trace_context_set_vertex_buffers
;
1425 if (pipe
->surface_copy
)
1426 tr_ctx
->base
.surface_copy
= trace_context_surface_copy
;
1427 if (pipe
->surface_fill
)
1428 tr_ctx
->base
.surface_fill
= trace_context_surface_fill
;
1429 tr_ctx
->base
.clear
= trace_context_clear
;
1430 tr_ctx
->base
.flush
= trace_context_flush
;
1431 tr_ctx
->base
.is_resource_referenced
= trace_is_resource_referenced
;
1433 tr_ctx
->base
.get_transfer
= trace_context_get_transfer
;
1434 tr_ctx
->base
.transfer_destroy
= trace_context_transfer_destroy
;
1435 tr_ctx
->base
.transfer_map
= trace_context_transfer_map
;
1436 tr_ctx
->base
.transfer_unmap
= trace_context_transfer_unmap
;
1437 tr_ctx
->base
.transfer_flush_region
= trace_context_transfer_flush_region
;
1438 tr_ctx
->base
.transfer_inline_write
= trace_context_transfer_inline_write
;
1440 tr_ctx
->pipe
= pipe
;
1442 return &tr_ctx
->base
;