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(bool, info
->indexed
);
96 trace_dump_arg(uint
, info
->mode
);
97 trace_dump_arg(uint
, info
->start
);
98 trace_dump_arg(uint
, info
->count
);
99 trace_dump_arg(uint
, info
->start_instance
);
100 trace_dump_arg(uint
, info
->instance_count
);
101 trace_dump_arg(int, info
->index_bias
);
102 trace_dump_arg(uint
, info
->min_index
);
103 trace_dump_arg(uint
, info
->max_index
);
105 pipe
->draw_vbo(pipe
, info
);
107 trace_dump_call_end();
111 static INLINE
struct pipe_query
*
112 trace_context_create_query(struct pipe_context
*_pipe
,
115 struct trace_context
*tr_ctx
= trace_context(_pipe
);
116 struct pipe_context
*pipe
= tr_ctx
->pipe
;
117 struct pipe_query
*result
;
119 trace_dump_call_begin("pipe_context", "create_query");
121 trace_dump_arg(ptr
, pipe
);
122 trace_dump_arg(uint
, query_type
);
124 result
= pipe
->create_query(pipe
, query_type
);
126 trace_dump_ret(ptr
, result
);
128 trace_dump_call_end();
135 trace_context_destroy_query(struct pipe_context
*_pipe
,
136 struct pipe_query
*query
)
138 struct trace_context
*tr_ctx
= trace_context(_pipe
);
139 struct pipe_context
*pipe
= tr_ctx
->pipe
;
141 trace_dump_call_begin("pipe_context", "destroy_query");
143 trace_dump_arg(ptr
, pipe
);
144 trace_dump_arg(ptr
, query
);
146 pipe
->destroy_query(pipe
, query
);
148 trace_dump_call_end();
153 trace_context_begin_query(struct pipe_context
*_pipe
,
154 struct pipe_query
*query
)
156 struct trace_context
*tr_ctx
= trace_context(_pipe
);
157 struct pipe_context
*pipe
= tr_ctx
->pipe
;
159 trace_dump_call_begin("pipe_context", "begin_query");
161 trace_dump_arg(ptr
, pipe
);
162 trace_dump_arg(ptr
, query
);
164 pipe
->begin_query(pipe
, query
);
166 trace_dump_call_end();
171 trace_context_end_query(struct pipe_context
*_pipe
,
172 struct pipe_query
*query
)
174 struct trace_context
*tr_ctx
= trace_context(_pipe
);
175 struct pipe_context
*pipe
= tr_ctx
->pipe
;
177 trace_dump_call_begin("pipe_context", "end_query");
179 trace_dump_arg(ptr
, pipe
);
180 trace_dump_arg(ptr
, query
);
182 pipe
->end_query(pipe
, query
);
184 trace_dump_call_end();
188 static INLINE boolean
189 trace_context_get_query_result(struct pipe_context
*_pipe
,
190 struct pipe_query
*query
,
194 struct trace_context
*tr_ctx
= trace_context(_pipe
);
195 struct pipe_context
*pipe
= tr_ctx
->pipe
;
199 trace_dump_call_begin("pipe_context", "get_query_result");
201 trace_dump_arg(ptr
, pipe
);
203 _result
= pipe
->get_query_result(pipe
, query
, wait
, presult
);
204 result
= *((uint64_t*)presult
);
206 trace_dump_arg(uint
, result
);
207 trace_dump_ret(bool, _result
);
209 trace_dump_call_end();
216 trace_context_create_blend_state(struct pipe_context
*_pipe
,
217 const struct pipe_blend_state
*state
)
219 struct trace_context
*tr_ctx
= trace_context(_pipe
);
220 struct pipe_context
*pipe
= tr_ctx
->pipe
;
223 trace_dump_call_begin("pipe_context", "create_blend_state");
225 trace_dump_arg(ptr
, pipe
);
226 trace_dump_arg(blend_state
, state
);
228 result
= pipe
->create_blend_state(pipe
, state
);
230 trace_dump_ret(ptr
, result
);
232 trace_dump_call_end();
239 trace_context_bind_blend_state(struct pipe_context
*_pipe
,
242 struct trace_context
*tr_ctx
= trace_context(_pipe
);
243 struct pipe_context
*pipe
= tr_ctx
->pipe
;
245 trace_dump_call_begin("pipe_context", "bind_blend_state");
247 trace_dump_arg(ptr
, pipe
);
248 trace_dump_arg(ptr
, state
);
250 pipe
->bind_blend_state(pipe
, state
);
252 trace_dump_call_end();
257 trace_context_delete_blend_state(struct pipe_context
*_pipe
,
260 struct trace_context
*tr_ctx
= trace_context(_pipe
);
261 struct pipe_context
*pipe
= tr_ctx
->pipe
;
263 trace_dump_call_begin("pipe_context", "delete_blend_state");
265 trace_dump_arg(ptr
, pipe
);
266 trace_dump_arg(ptr
, state
);
268 pipe
->delete_blend_state(pipe
, state
);
270 trace_dump_call_end();
275 trace_context_create_sampler_state(struct pipe_context
*_pipe
,
276 const struct pipe_sampler_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_sampler_state");
284 trace_dump_arg(ptr
, pipe
);
285 trace_dump_arg(sampler_state
, state
);
287 result
= pipe
->create_sampler_state(pipe
, state
);
289 trace_dump_ret(ptr
, result
);
291 trace_dump_call_end();
298 trace_context_bind_fragment_sampler_states(struct pipe_context
*_pipe
,
302 struct trace_context
*tr_ctx
= trace_context(_pipe
);
303 struct pipe_context
*pipe
= tr_ctx
->pipe
;
305 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
307 trace_dump_arg(ptr
, pipe
);
308 trace_dump_arg(uint
, num_states
);
309 trace_dump_arg_array(ptr
, states
, num_states
);
311 pipe
->bind_fragment_sampler_states(pipe
, num_states
, states
);
313 trace_dump_call_end();
318 trace_context_bind_vertex_sampler_states(struct pipe_context
*_pipe
,
322 struct trace_context
*tr_ctx
= trace_context(_pipe
);
323 struct pipe_context
*pipe
= tr_ctx
->pipe
;
325 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
327 trace_dump_arg(ptr
, pipe
);
328 trace_dump_arg(uint
, num_states
);
329 trace_dump_arg_array(ptr
, states
, num_states
);
331 pipe
->bind_vertex_sampler_states(pipe
, num_states
, states
);
333 trace_dump_call_end();
338 trace_context_delete_sampler_state(struct pipe_context
*_pipe
,
341 struct trace_context
*tr_ctx
= trace_context(_pipe
);
342 struct pipe_context
*pipe
= tr_ctx
->pipe
;
344 trace_dump_call_begin("pipe_context", "delete_sampler_state");
346 trace_dump_arg(ptr
, pipe
);
347 trace_dump_arg(ptr
, state
);
349 pipe
->delete_sampler_state(pipe
, state
);
351 trace_dump_call_end();
356 trace_context_create_rasterizer_state(struct pipe_context
*_pipe
,
357 const struct pipe_rasterizer_state
*state
)
359 struct trace_context
*tr_ctx
= trace_context(_pipe
);
360 struct pipe_context
*pipe
= tr_ctx
->pipe
;
363 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
365 trace_dump_arg(ptr
, pipe
);
366 trace_dump_arg(rasterizer_state
, state
);
368 result
= pipe
->create_rasterizer_state(pipe
, state
);
370 trace_dump_ret(ptr
, result
);
372 trace_dump_call_end();
379 trace_context_bind_rasterizer_state(struct pipe_context
*_pipe
,
382 struct trace_context
*tr_ctx
= trace_context(_pipe
);
383 struct pipe_context
*pipe
= tr_ctx
->pipe
;
385 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
387 trace_dump_arg(ptr
, pipe
);
388 trace_dump_arg(ptr
, state
);
390 pipe
->bind_rasterizer_state(pipe
, state
);
392 trace_dump_call_end();
397 trace_context_delete_rasterizer_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_rasterizer_state");
405 trace_dump_arg(ptr
, pipe
);
406 trace_dump_arg(ptr
, state
);
408 pipe
->delete_rasterizer_state(pipe
, state
);
410 trace_dump_call_end();
415 trace_context_create_depth_stencil_alpha_state(struct pipe_context
*_pipe
,
416 const struct pipe_depth_stencil_alpha_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_depth_stencil_alpha_state");
424 result
= pipe
->create_depth_stencil_alpha_state(pipe
, state
);
426 trace_dump_arg(ptr
, pipe
);
427 trace_dump_arg(depth_stencil_alpha_state
, state
);
429 trace_dump_ret(ptr
, result
);
431 trace_dump_call_end();
438 trace_context_bind_depth_stencil_alpha_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_depth_stencil_alpha_state");
446 trace_dump_arg(ptr
, pipe
);
447 trace_dump_arg(ptr
, state
);
449 pipe
->bind_depth_stencil_alpha_state(pipe
, state
);
451 trace_dump_call_end();
456 trace_context_delete_depth_stencil_alpha_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_depth_stencil_alpha_state");
464 trace_dump_arg(ptr
, pipe
);
465 trace_dump_arg(ptr
, state
);
467 pipe
->delete_depth_stencil_alpha_state(pipe
, state
);
469 trace_dump_call_end();
474 trace_context_create_fs_state(struct pipe_context
*_pipe
,
475 const struct pipe_shader_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_fs_state");
483 trace_dump_arg(ptr
, pipe
);
484 trace_dump_arg(shader_state
, state
);
486 result
= pipe
->create_fs_state(pipe
, state
);
488 trace_dump_ret(ptr
, result
);
490 trace_dump_call_end();
497 trace_context_bind_fs_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_fs_state");
505 trace_dump_arg(ptr
, pipe
);
506 trace_dump_arg(ptr
, state
);
508 pipe
->bind_fs_state(pipe
, state
);
510 trace_dump_call_end();
515 trace_context_delete_fs_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_fs_state");
523 trace_dump_arg(ptr
, pipe
);
524 trace_dump_arg(ptr
, state
);
526 pipe
->delete_fs_state(pipe
, state
);
528 trace_dump_call_end();
533 trace_context_create_vs_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_vs_state");
542 trace_dump_arg(ptr
, pipe
);
543 trace_dump_arg(shader_state
, state
);
545 result
= pipe
->create_vs_state(pipe
, state
);
547 trace_dump_ret(ptr
, result
);
549 trace_dump_call_end();
556 trace_context_bind_vs_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_vs_state");
564 trace_dump_arg(ptr
, pipe
);
565 trace_dump_arg(ptr
, state
);
567 pipe
->bind_vs_state(pipe
, state
);
569 trace_dump_call_end();
574 trace_context_delete_vs_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_vs_state");
582 trace_dump_arg(ptr
, pipe
);
583 trace_dump_arg(ptr
, state
);
585 pipe
->delete_vs_state(pipe
, state
);
587 trace_dump_call_end();
592 trace_context_create_vertex_elements_state(struct pipe_context
*_pipe
,
593 unsigned num_elements
,
594 const struct pipe_vertex_element
*elements
)
596 struct trace_context
*tr_ctx
= trace_context(_pipe
);
597 struct pipe_context
*pipe
= tr_ctx
->pipe
;
600 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
602 trace_dump_arg(ptr
, pipe
);
603 trace_dump_arg(uint
, num_elements
);
605 trace_dump_arg_begin("elements");
606 trace_dump_struct_array(vertex_element
, elements
, num_elements
);
607 trace_dump_arg_end();
609 result
= pipe
->create_vertex_elements_state(pipe
, num_elements
, elements
);
611 trace_dump_ret(ptr
, result
);
613 trace_dump_call_end();
620 trace_context_bind_vertex_elements_state(struct pipe_context
*_pipe
,
623 struct trace_context
*tr_ctx
= trace_context(_pipe
);
624 struct pipe_context
*pipe
= tr_ctx
->pipe
;
626 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
628 trace_dump_arg(ptr
, pipe
);
629 trace_dump_arg(ptr
, state
);
631 pipe
->bind_vertex_elements_state(pipe
, state
);
633 trace_dump_call_end();
638 trace_context_delete_vertex_elements_state(struct pipe_context
*_pipe
,
641 struct trace_context
*tr_ctx
= trace_context(_pipe
);
642 struct pipe_context
*pipe
= tr_ctx
->pipe
;
644 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
646 trace_dump_arg(ptr
, pipe
);
647 trace_dump_arg(ptr
, state
);
649 pipe
->delete_vertex_elements_state(pipe
, state
);
651 trace_dump_call_end();
656 trace_context_set_blend_color(struct pipe_context
*_pipe
,
657 const struct pipe_blend_color
*state
)
659 struct trace_context
*tr_ctx
= trace_context(_pipe
);
660 struct pipe_context
*pipe
= tr_ctx
->pipe
;
662 trace_dump_call_begin("pipe_context", "set_blend_color");
664 trace_dump_arg(ptr
, pipe
);
665 trace_dump_arg(blend_color
, state
);
667 pipe
->set_blend_color(pipe
, state
);
669 trace_dump_call_end();
674 trace_context_set_stencil_ref(struct pipe_context
*_pipe
,
675 const struct pipe_stencil_ref
*state
)
677 struct trace_context
*tr_ctx
= trace_context(_pipe
);
678 struct pipe_context
*pipe
= tr_ctx
->pipe
;
680 trace_dump_call_begin("pipe_context", "set_stencil_ref");
682 trace_dump_arg(ptr
, pipe
);
683 trace_dump_arg(stencil_ref
, state
);
685 pipe
->set_stencil_ref(pipe
, state
);
687 trace_dump_call_end();
692 trace_context_set_clip_state(struct pipe_context
*_pipe
,
693 const struct pipe_clip_state
*state
)
695 struct trace_context
*tr_ctx
= trace_context(_pipe
);
696 struct pipe_context
*pipe
= tr_ctx
->pipe
;
698 trace_dump_call_begin("pipe_context", "set_clip_state");
700 trace_dump_arg(ptr
, pipe
);
701 trace_dump_arg(clip_state
, state
);
703 pipe
->set_clip_state(pipe
, state
);
705 trace_dump_call_end();
709 trace_context_set_sample_mask(struct pipe_context
*_pipe
,
710 unsigned sample_mask
)
712 struct trace_context
*tr_ctx
= trace_context(_pipe
);
713 struct pipe_context
*pipe
= tr_ctx
->pipe
;
715 trace_dump_call_begin("pipe_context", "set_sample_mask");
717 trace_dump_arg(ptr
, pipe
);
718 trace_dump_arg(uint
, sample_mask
);
720 pipe
->set_sample_mask(pipe
, sample_mask
);
722 trace_dump_call_end();
726 trace_context_set_constant_buffer(struct pipe_context
*_pipe
,
727 uint shader
, uint index
,
728 struct pipe_resource
*buffer
)
730 struct trace_context
*tr_ctx
= trace_context(_pipe
);
731 struct pipe_context
*pipe
= tr_ctx
->pipe
;
734 buffer
= trace_resource_unwrap(tr_ctx
, buffer
);
737 trace_dump_call_begin("pipe_context", "set_constant_buffer");
739 trace_dump_arg(ptr
, pipe
);
740 trace_dump_arg(uint
, shader
);
741 trace_dump_arg(uint
, index
);
742 trace_dump_arg(ptr
, buffer
);
744 pipe
->set_constant_buffer(pipe
, shader
, index
, buffer
);
746 trace_dump_call_end();
751 trace_context_set_framebuffer_state(struct pipe_context
*_pipe
,
752 const struct pipe_framebuffer_state
*state
)
754 struct trace_context
*tr_ctx
= trace_context(_pipe
);
755 struct pipe_context
*pipe
= tr_ctx
->pipe
;
756 struct pipe_framebuffer_state unwrapped_state
;
760 /* Unwrap the input state */
761 memcpy(&unwrapped_state
, state
, sizeof(unwrapped_state
));
762 for(i
= 0; i
< state
->nr_cbufs
; ++i
)
763 unwrapped_state
.cbufs
[i
] = trace_surface_unwrap(tr_ctx
, state
->cbufs
[i
]);
764 for(i
= state
->nr_cbufs
; i
< PIPE_MAX_COLOR_BUFS
; ++i
)
765 unwrapped_state
.cbufs
[i
] = NULL
;
766 unwrapped_state
.zsbuf
= trace_surface_unwrap(tr_ctx
, state
->zsbuf
);
767 state
= &unwrapped_state
;
769 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
771 trace_dump_arg(ptr
, pipe
);
772 trace_dump_arg(framebuffer_state
, state
);
774 pipe
->set_framebuffer_state(pipe
, state
);
776 trace_dump_call_end();
781 trace_context_set_polygon_stipple(struct pipe_context
*_pipe
,
782 const struct pipe_poly_stipple
*state
)
784 struct trace_context
*tr_ctx
= trace_context(_pipe
);
785 struct pipe_context
*pipe
= tr_ctx
->pipe
;
787 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
789 trace_dump_arg(ptr
, pipe
);
790 trace_dump_arg(poly_stipple
, state
);
792 pipe
->set_polygon_stipple(pipe
, state
);
794 trace_dump_call_end();
799 trace_context_set_scissor_state(struct pipe_context
*_pipe
,
800 const struct pipe_scissor_state
*state
)
802 struct trace_context
*tr_ctx
= trace_context(_pipe
);
803 struct pipe_context
*pipe
= tr_ctx
->pipe
;
805 trace_dump_call_begin("pipe_context", "set_scissor_state");
807 trace_dump_arg(ptr
, pipe
);
808 trace_dump_arg(scissor_state
, state
);
810 pipe
->set_scissor_state(pipe
, state
);
812 trace_dump_call_end();
817 trace_context_set_viewport_state(struct pipe_context
*_pipe
,
818 const struct pipe_viewport_state
*state
)
820 struct trace_context
*tr_ctx
= trace_context(_pipe
);
821 struct pipe_context
*pipe
= tr_ctx
->pipe
;
823 trace_dump_call_begin("pipe_context", "set_viewport_state");
825 trace_dump_arg(ptr
, pipe
);
826 trace_dump_arg(viewport_state
, state
);
828 pipe
->set_viewport_state(pipe
, state
);
830 trace_dump_call_end();
834 static struct pipe_sampler_view
*
835 trace_create_sampler_view(struct pipe_context
*_pipe
,
836 struct pipe_resource
*_resource
,
837 const struct pipe_sampler_view
*templ
)
839 struct trace_context
*tr_ctx
= trace_context(_pipe
);
840 struct trace_resource
*tr_tex
= trace_resource(_resource
);
841 struct pipe_context
*pipe
= tr_ctx
->pipe
;
842 struct pipe_resource
*texture
= tr_tex
->resource
;
843 struct pipe_sampler_view
*result
;
844 struct trace_sampler_view
*tr_view
;
846 trace_dump_call_begin("pipe_context", "create_sampler_view");
848 trace_dump_arg(ptr
, pipe
);
849 trace_dump_arg(ptr
, texture
);
850 trace_dump_arg(sampler_view_template
, templ
);
852 result
= pipe
->create_sampler_view(pipe
, texture
, templ
);
854 trace_dump_ret(ptr
, result
);
856 trace_dump_call_end();
859 * Wrap pipe_sampler_view
861 tr_view
= CALLOC_STRUCT(trace_sampler_view
);
862 tr_view
->base
= *templ
;
863 tr_view
->base
.reference
.count
= 1;
864 tr_view
->base
.texture
= NULL
;
865 pipe_resource_reference(&tr_view
->base
.texture
, _resource
);
866 tr_view
->base
.context
= _pipe
;
867 tr_view
->sampler_view
= result
;
868 result
= &tr_view
->base
;
875 trace_sampler_view_destroy(struct pipe_context
*_pipe
,
876 struct pipe_sampler_view
*_view
)
878 struct trace_context
*tr_ctx
= trace_context(_pipe
);
879 struct trace_sampler_view
*tr_view
= trace_sampler_view(_view
);
880 struct pipe_context
*pipe
= tr_ctx
->pipe
;
881 struct pipe_sampler_view
*view
= tr_view
->sampler_view
;
883 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
885 trace_dump_arg(ptr
, pipe
);
886 trace_dump_arg(ptr
, view
);
888 pipe
->sampler_view_destroy(pipe
, view
);
890 trace_dump_call_end();
892 pipe_resource_reference(&_view
->texture
, NULL
);
898 trace_context_set_fragment_sampler_views(struct pipe_context
*_pipe
,
900 struct pipe_sampler_view
**views
)
902 struct trace_context
*tr_ctx
= trace_context(_pipe
);
903 struct trace_sampler_view
*tr_view
;
904 struct pipe_context
*pipe
= tr_ctx
->pipe
;
905 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_SAMPLERS
];
908 for(i
= 0; i
< num
; ++i
) {
909 tr_view
= trace_sampler_view(views
[i
]);
910 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
912 views
= unwrapped_views
;
914 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
916 trace_dump_arg(ptr
, pipe
);
917 trace_dump_arg(uint
, num
);
918 trace_dump_arg_array(ptr
, views
, num
);
920 pipe
->set_fragment_sampler_views(pipe
, num
, views
);
922 trace_dump_call_end();
927 trace_context_set_vertex_sampler_views(struct pipe_context
*_pipe
,
929 struct pipe_sampler_view
**views
)
931 struct trace_context
*tr_ctx
= trace_context(_pipe
);
932 struct trace_sampler_view
*tr_view
;
933 struct pipe_context
*pipe
= tr_ctx
->pipe
;
934 struct pipe_sampler_view
*unwrapped_views
[PIPE_MAX_VERTEX_SAMPLERS
];
937 for(i
= 0; i
< num
; ++i
) {
938 tr_view
= trace_sampler_view(views
[i
]);
939 unwrapped_views
[i
] = tr_view
? tr_view
->sampler_view
: NULL
;
941 views
= unwrapped_views
;
943 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
945 trace_dump_arg(ptr
, pipe
);
946 trace_dump_arg(uint
, num
);
947 trace_dump_arg_array(ptr
, views
, num
);
949 pipe
->set_vertex_sampler_views(pipe
, num
, views
);
951 trace_dump_call_end();
956 trace_context_set_vertex_buffers(struct pipe_context
*_pipe
,
957 unsigned num_buffers
,
958 const struct pipe_vertex_buffer
*buffers
)
960 struct trace_context
*tr_ctx
= trace_context(_pipe
);
961 struct pipe_context
*pipe
= tr_ctx
->pipe
;
964 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
966 trace_dump_arg(ptr
, pipe
);
967 trace_dump_arg(uint
, num_buffers
);
969 trace_dump_arg_begin("buffers");
970 trace_dump_struct_array(vertex_buffer
, buffers
, num_buffers
);
971 trace_dump_arg_end();
974 struct pipe_vertex_buffer
*_buffers
= MALLOC(num_buffers
* sizeof(*_buffers
));
975 memcpy(_buffers
, buffers
, num_buffers
* sizeof(*_buffers
));
976 for (i
= 0; i
< num_buffers
; i
++)
977 _buffers
[i
].buffer
= trace_resource_unwrap(tr_ctx
, buffers
[i
].buffer
);
978 pipe
->set_vertex_buffers(pipe
, num_buffers
, _buffers
);
981 pipe
->set_vertex_buffers(pipe
, num_buffers
, NULL
);
984 trace_dump_call_end();
989 trace_context_set_index_buffer(struct pipe_context
*_pipe
,
990 const struct pipe_index_buffer
*_ib
)
992 struct trace_context
*tr_ctx
= trace_context(_pipe
);
993 struct pipe_context
*pipe
= tr_ctx
->pipe
;
994 struct pipe_index_buffer unwrapped_ib
, *ib
= NULL
;
998 unwrapped_ib
.buffer
= trace_resource_unwrap(tr_ctx
, _ib
->buffer
);
1002 trace_dump_call_begin("pipe_context", "set_index_buffer");
1004 trace_dump_arg(ptr
, pipe
);
1005 trace_dump_arg(index_buffer
, ib
);
1007 pipe
->set_index_buffer(pipe
, ib
);
1009 trace_dump_call_end();
1013 trace_context_resource_copy_region(struct pipe_context
*_pipe
,
1014 struct pipe_resource
*dst
,
1015 struct pipe_subresource subdst
,
1016 unsigned dstx
, unsigned dsty
, unsigned dstz
,
1017 struct pipe_resource
*src
,
1018 struct pipe_subresource subsrc
,
1019 unsigned srcx
, unsigned srcy
, unsigned srcz
,
1020 unsigned width
, unsigned height
)
1022 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1023 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1025 dst
= trace_resource_unwrap(tr_ctx
, dst
);
1026 src
= trace_resource_unwrap(tr_ctx
, src
);
1028 trace_dump_call_begin("pipe_context", "resource_copy_region");
1030 trace_dump_arg(ptr
, pipe
);
1031 trace_dump_arg(ptr
, dst
);
1032 trace_dump_arg_struct(subresource
, subdst
);
1033 trace_dump_arg(uint
, dstx
);
1034 trace_dump_arg(uint
, dsty
);
1035 trace_dump_arg(uint
, dstz
);
1036 trace_dump_arg(ptr
, src
);
1037 trace_dump_arg_struct(subresource
, subsrc
);
1038 trace_dump_arg(uint
, srcx
);
1039 trace_dump_arg(uint
, srcy
);
1040 trace_dump_arg(uint
, srcz
);
1041 trace_dump_arg(uint
, width
);
1042 trace_dump_arg(uint
, height
);
1044 pipe
->resource_copy_region(pipe
,
1045 dst
, subdst
, dstx
, dsty
, dstz
,
1046 src
, subsrc
, srcx
, srcy
, srcz
, width
, height
);
1048 trace_dump_call_end();
1053 trace_context_clear(struct pipe_context
*_pipe
,
1059 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1060 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1062 trace_dump_call_begin("pipe_context", "clear");
1064 trace_dump_arg(ptr
, pipe
);
1065 trace_dump_arg(uint
, buffers
);
1066 trace_dump_arg_array(float, rgba
, 4);
1067 trace_dump_arg(float, depth
);
1068 trace_dump_arg(uint
, stencil
);
1070 pipe
->clear(pipe
, buffers
, rgba
, depth
, stencil
);
1072 trace_dump_call_end();
1077 trace_context_clear_render_target(struct pipe_context
*_pipe
,
1078 struct pipe_surface
*dst
,
1080 unsigned dstx
, unsigned dsty
,
1081 unsigned width
, unsigned height
)
1083 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1084 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1086 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1088 trace_dump_call_begin("pipe_context", "clear_render_target");
1090 trace_dump_arg(ptr
, pipe
);
1091 trace_dump_arg(ptr
, dst
);
1092 trace_dump_arg_array(float, rgba
, 4);
1093 trace_dump_arg(uint
, dstx
);
1094 trace_dump_arg(uint
, dsty
);
1095 trace_dump_arg(uint
, width
);
1096 trace_dump_arg(uint
, height
);
1098 pipe
->clear_render_target(pipe
, dst
, rgba
, dstx
, dsty
, width
, height
);
1100 trace_dump_call_end();
1104 trace_context_clear_depth_stencil(struct pipe_context
*_pipe
,
1105 struct pipe_surface
*dst
,
1106 unsigned clear_flags
,
1109 unsigned dstx
, unsigned dsty
,
1110 unsigned width
, unsigned height
)
1112 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1113 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1115 dst
= trace_surface_unwrap(tr_ctx
, dst
);
1117 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1119 trace_dump_arg(ptr
, pipe
);
1120 trace_dump_arg(ptr
, dst
);
1121 trace_dump_arg(uint
, clear_flags
);
1122 trace_dump_arg(float, depth
);
1123 trace_dump_arg(uint
, stencil
);
1124 trace_dump_arg(uint
, dstx
);
1125 trace_dump_arg(uint
, dsty
);
1126 trace_dump_arg(uint
, width
);
1127 trace_dump_arg(uint
, height
);
1129 pipe
->clear_depth_stencil(pipe
, dst
, clear_flags
, depth
, stencil
,
1130 dstx
, dsty
, width
, height
);
1132 trace_dump_call_end();
1136 trace_context_flush(struct pipe_context
*_pipe
,
1138 struct pipe_fence_handle
**fence
)
1140 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1141 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1143 trace_dump_call_begin("pipe_context", "flush");
1145 trace_dump_arg(ptr
, pipe
);
1146 trace_dump_arg(uint
, flags
);
1148 pipe
->flush(pipe
, flags
, fence
);
1151 trace_dump_ret(ptr
, *fence
);
1153 trace_dump_call_end();
1158 trace_context_destroy(struct pipe_context
*_pipe
)
1160 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1161 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1163 trace_dump_call_begin("pipe_context", "destroy");
1164 trace_dump_arg(ptr
, pipe
);
1165 trace_dump_call_end();
1167 pipe
->destroy(pipe
);
1173 trace_is_resource_referenced( struct pipe_context
*_pipe
,
1174 struct pipe_resource
*_resource
,
1175 unsigned face
, unsigned level
)
1177 struct trace_context
*tr_ctx
= trace_context(_pipe
);
1178 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1179 struct pipe_context
*pipe
= tr_ctx
->pipe
;
1180 struct pipe_resource
*texture
= tr_tex
->resource
;
1181 unsigned int referenced
;
1183 trace_dump_call_begin("pipe_context", "is_resource_referenced");
1184 trace_dump_arg(ptr
, pipe
);
1185 trace_dump_arg(ptr
, texture
);
1186 trace_dump_arg(uint
, face
);
1187 trace_dump_arg(uint
, level
);
1189 referenced
= pipe
->is_resource_referenced(pipe
, texture
, face
, level
);
1191 trace_dump_ret(uint
, referenced
);
1192 trace_dump_call_end();
1198 /********************************************************************
1203 static struct pipe_transfer
*
1204 trace_context_get_transfer(struct pipe_context
*_context
,
1205 struct pipe_resource
*_resource
,
1206 struct pipe_subresource sr
,
1208 const struct pipe_box
*box
)
1210 struct trace_context
*tr_context
= trace_context(_context
);
1211 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1212 struct pipe_context
*context
= tr_context
->pipe
;
1213 struct pipe_resource
*texture
= tr_tex
->resource
;
1214 struct pipe_transfer
*result
= NULL
;
1216 assert(texture
->screen
== context
->screen
);
1219 * Map and transfers can't be serialized so we convert all write transfers
1220 * to transfer_inline_write and ignore read transfers.
1223 result
= context
->get_transfer(context
, texture
, sr
, usage
, box
);
1226 result
= trace_transfer_create(tr_context
, tr_tex
, result
);
1233 trace_context_transfer_destroy(struct pipe_context
*_context
,
1234 struct pipe_transfer
*_transfer
)
1236 struct trace_context
*tr_context
= trace_context(_context
);
1237 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1239 trace_transfer_destroy(tr_context
, tr_trans
);
1244 trace_context_transfer_map(struct pipe_context
*_context
,
1245 struct pipe_transfer
*_transfer
)
1247 struct trace_context
*tr_context
= trace_context(_context
);
1248 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1249 struct pipe_context
*context
= tr_context
->pipe
;
1250 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1253 map
= context
->transfer_map(context
, transfer
);
1255 if(transfer
->usage
& PIPE_TRANSFER_WRITE
) {
1256 assert(!tr_trans
->map
);
1257 tr_trans
->map
= map
;
1266 trace_context_transfer_flush_region( struct pipe_context
*_context
,
1267 struct pipe_transfer
*_transfer
,
1268 const struct pipe_box
*box
)
1270 struct trace_context
*tr_context
= trace_context(_context
);
1271 struct trace_transfer
*tr_transfer
= trace_transfer(_transfer
);
1272 struct pipe_context
*context
= tr_context
->pipe
;
1273 struct pipe_transfer
*transfer
= tr_transfer
->transfer
;
1275 context
->transfer_flush_region(context
,
1281 trace_context_transfer_unmap(struct pipe_context
*_context
,
1282 struct pipe_transfer
*_transfer
)
1284 struct trace_context
*tr_ctx
= trace_context(_context
);
1285 struct trace_transfer
*tr_trans
= trace_transfer(_transfer
);
1286 struct pipe_context
*context
= tr_ctx
->pipe
;
1287 struct pipe_transfer
*transfer
= tr_trans
->transfer
;
1291 * Fake a transfer_inline_write
1294 struct pipe_resource
*resource
= transfer
->resource
;
1295 struct pipe_subresource sr
= transfer
->sr
;
1296 unsigned usage
= transfer
->usage
;
1297 const struct pipe_box
*box
= &transfer
->box
;
1298 unsigned stride
= transfer
->stride
;
1299 unsigned slice_stride
= transfer
->slice_stride
;
1301 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1303 trace_dump_arg(ptr
, context
);
1304 trace_dump_arg(ptr
, resource
);
1305 trace_dump_arg_struct(subresource
, sr
);
1306 trace_dump_arg(uint
, usage
);
1307 trace_dump_arg(box
, box
);
1309 trace_dump_arg_begin("data");
1310 trace_dump_box_bytes(tr_trans
->map
,
1315 trace_dump_arg_end();
1317 trace_dump_arg(uint
, stride
);
1318 trace_dump_arg(uint
, slice_stride
);
1320 trace_dump_call_end();
1322 tr_trans
->map
= NULL
;
1325 context
->transfer_unmap(context
, transfer
);
1330 trace_context_transfer_inline_write(struct pipe_context
*_context
,
1331 struct pipe_resource
*_resource
,
1332 struct pipe_subresource sr
,
1334 const struct pipe_box
*box
,
1337 unsigned slice_stride
)
1339 struct trace_context
*tr_context
= trace_context(_context
);
1340 struct trace_resource
*tr_tex
= trace_resource(_resource
);
1341 struct pipe_context
*context
= tr_context
->pipe
;
1342 struct pipe_resource
*resource
= tr_tex
->resource
;
1344 assert(resource
->screen
== context
->screen
);
1346 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1348 trace_dump_arg(ptr
, context
);
1349 trace_dump_arg(ptr
, resource
);
1350 trace_dump_arg_struct(subresource
, sr
);
1351 trace_dump_arg(uint
, usage
);
1352 trace_dump_arg(box
, box
);
1354 trace_dump_arg_begin("data");
1355 trace_dump_box_bytes(data
,
1360 trace_dump_arg_end();
1362 trace_dump_arg(uint
, stride
);
1363 trace_dump_arg(uint
, slice_stride
);
1365 trace_dump_call_end();
1367 context
->transfer_inline_write(context
, resource
,
1368 sr
, usage
, box
, data
, stride
, slice_stride
);
1374 static const struct debug_named_value rbug_blocker_flags
[] = {
1375 {"before", 1, NULL
},
1377 DEBUG_NAMED_VALUE_END
1380 struct pipe_context
*
1381 trace_context_create(struct trace_screen
*tr_scr
,
1382 struct pipe_context
*pipe
)
1384 struct trace_context
*tr_ctx
;
1389 if(!trace_enabled())
1392 tr_ctx
= CALLOC_STRUCT(trace_context
);
1396 tr_ctx
->base
.winsys
= NULL
;
1397 tr_ctx
->base
.priv
= pipe
->priv
; /* expose wrapped priv data */
1398 tr_ctx
->base
.screen
= &tr_scr
->base
;
1400 tr_ctx
->base
.destroy
= trace_context_destroy
;
1401 tr_ctx
->base
.draw_vbo
= trace_context_draw_vbo
;
1402 tr_ctx
->base
.create_query
= trace_context_create_query
;
1403 tr_ctx
->base
.destroy_query
= trace_context_destroy_query
;
1404 tr_ctx
->base
.begin_query
= trace_context_begin_query
;
1405 tr_ctx
->base
.end_query
= trace_context_end_query
;
1406 tr_ctx
->base
.get_query_result
= trace_context_get_query_result
;
1407 tr_ctx
->base
.create_blend_state
= trace_context_create_blend_state
;
1408 tr_ctx
->base
.bind_blend_state
= trace_context_bind_blend_state
;
1409 tr_ctx
->base
.delete_blend_state
= trace_context_delete_blend_state
;
1410 tr_ctx
->base
.create_sampler_state
= trace_context_create_sampler_state
;
1411 tr_ctx
->base
.bind_fragment_sampler_states
= trace_context_bind_fragment_sampler_states
;
1412 tr_ctx
->base
.bind_vertex_sampler_states
= trace_context_bind_vertex_sampler_states
;
1413 tr_ctx
->base
.delete_sampler_state
= trace_context_delete_sampler_state
;
1414 tr_ctx
->base
.create_rasterizer_state
= trace_context_create_rasterizer_state
;
1415 tr_ctx
->base
.bind_rasterizer_state
= trace_context_bind_rasterizer_state
;
1416 tr_ctx
->base
.delete_rasterizer_state
= trace_context_delete_rasterizer_state
;
1417 tr_ctx
->base
.create_depth_stencil_alpha_state
= trace_context_create_depth_stencil_alpha_state
;
1418 tr_ctx
->base
.bind_depth_stencil_alpha_state
= trace_context_bind_depth_stencil_alpha_state
;
1419 tr_ctx
->base
.delete_depth_stencil_alpha_state
= trace_context_delete_depth_stencil_alpha_state
;
1420 tr_ctx
->base
.create_fs_state
= trace_context_create_fs_state
;
1421 tr_ctx
->base
.bind_fs_state
= trace_context_bind_fs_state
;
1422 tr_ctx
->base
.delete_fs_state
= trace_context_delete_fs_state
;
1423 tr_ctx
->base
.create_vs_state
= trace_context_create_vs_state
;
1424 tr_ctx
->base
.bind_vs_state
= trace_context_bind_vs_state
;
1425 tr_ctx
->base
.delete_vs_state
= trace_context_delete_vs_state
;
1426 tr_ctx
->base
.create_vertex_elements_state
= trace_context_create_vertex_elements_state
;
1427 tr_ctx
->base
.bind_vertex_elements_state
= trace_context_bind_vertex_elements_state
;
1428 tr_ctx
->base
.delete_vertex_elements_state
= trace_context_delete_vertex_elements_state
;
1429 tr_ctx
->base
.set_blend_color
= trace_context_set_blend_color
;
1430 tr_ctx
->base
.set_stencil_ref
= trace_context_set_stencil_ref
;
1431 tr_ctx
->base
.set_clip_state
= trace_context_set_clip_state
;
1432 tr_ctx
->base
.set_sample_mask
= trace_context_set_sample_mask
;
1433 tr_ctx
->base
.set_constant_buffer
= trace_context_set_constant_buffer
;
1434 tr_ctx
->base
.set_framebuffer_state
= trace_context_set_framebuffer_state
;
1435 tr_ctx
->base
.set_polygon_stipple
= trace_context_set_polygon_stipple
;
1436 tr_ctx
->base
.set_scissor_state
= trace_context_set_scissor_state
;
1437 tr_ctx
->base
.set_viewport_state
= trace_context_set_viewport_state
;
1438 tr_ctx
->base
.set_fragment_sampler_views
= trace_context_set_fragment_sampler_views
;
1439 tr_ctx
->base
.set_vertex_sampler_views
= trace_context_set_vertex_sampler_views
;
1440 tr_ctx
->base
.create_sampler_view
= trace_create_sampler_view
;
1441 tr_ctx
->base
.sampler_view_destroy
= trace_sampler_view_destroy
;
1442 tr_ctx
->base
.set_vertex_buffers
= trace_context_set_vertex_buffers
;
1443 tr_ctx
->base
.set_index_buffer
= trace_context_set_index_buffer
;
1444 tr_ctx
->base
.resource_copy_region
= trace_context_resource_copy_region
;
1445 tr_ctx
->base
.clear
= trace_context_clear
;
1446 tr_ctx
->base
.clear_render_target
= trace_context_clear_render_target
;
1447 tr_ctx
->base
.clear_depth_stencil
= trace_context_clear_depth_stencil
;
1448 tr_ctx
->base
.flush
= trace_context_flush
;
1449 tr_ctx
->base
.is_resource_referenced
= trace_is_resource_referenced
;
1451 tr_ctx
->base
.get_transfer
= trace_context_get_transfer
;
1452 tr_ctx
->base
.transfer_destroy
= trace_context_transfer_destroy
;
1453 tr_ctx
->base
.transfer_map
= trace_context_transfer_map
;
1454 tr_ctx
->base
.transfer_unmap
= trace_context_transfer_unmap
;
1455 tr_ctx
->base
.transfer_flush_region
= trace_context_transfer_flush_region
;
1456 tr_ctx
->base
.transfer_inline_write
= trace_context_transfer_inline_write
;
1458 tr_ctx
->pipe
= pipe
;
1460 return &tr_ctx
->base
;