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_res;
55 tr_res = trace_resource(resource);
57 assert(tr_res->resource);
58 return tr_res->resource;
62 static INLINE struct pipe_surface *
63 trace_surface_unwrap(struct trace_context *tr_ctx,
64 struct pipe_surface *surface)
66 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen);
67 struct trace_surface *tr_surf;
72 assert(surface->texture);
76 tr_surf = trace_surface(surface);
78 assert(tr_surf->surface);
79 assert(tr_surf->surface->texture->screen == tr_scr->screen);
81 return tr_surf->surface;
86 trace_context_draw_vbo(struct pipe_context *_pipe,
87 const struct pipe_draw_info *info)
89 struct trace_context *tr_ctx = trace_context(_pipe);
90 struct pipe_context *pipe = tr_ctx->pipe;
92 trace_dump_call_begin("pipe_context", "draw_vbo");
94 trace_dump_arg(ptr, pipe);
95 trace_dump_arg(draw_info, info);
97 pipe->draw_vbo(pipe, info);
99 trace_dump_call_end();
103 static INLINE struct pipe_query *
104 trace_context_create_query(struct pipe_context *_pipe,
107 struct trace_context *tr_ctx = trace_context(_pipe);
108 struct pipe_context *pipe = tr_ctx->pipe;
109 struct pipe_query *result;
111 trace_dump_call_begin("pipe_context", "create_query");
113 trace_dump_arg(ptr, pipe);
114 trace_dump_arg(uint, query_type);
116 result = pipe->create_query(pipe, query_type);
118 trace_dump_ret(ptr, result);
120 trace_dump_call_end();
127 trace_context_destroy_query(struct pipe_context *_pipe,
128 struct pipe_query *query)
130 struct trace_context *tr_ctx = trace_context(_pipe);
131 struct pipe_context *pipe = tr_ctx->pipe;
133 trace_dump_call_begin("pipe_context", "destroy_query");
135 trace_dump_arg(ptr, pipe);
136 trace_dump_arg(ptr, query);
138 pipe->destroy_query(pipe, query);
140 trace_dump_call_end();
145 trace_context_begin_query(struct pipe_context *_pipe,
146 struct pipe_query *query)
148 struct trace_context *tr_ctx = trace_context(_pipe);
149 struct pipe_context *pipe = tr_ctx->pipe;
151 trace_dump_call_begin("pipe_context", "begin_query");
153 trace_dump_arg(ptr, pipe);
154 trace_dump_arg(ptr, query);
156 pipe->begin_query(pipe, query);
158 trace_dump_call_end();
163 trace_context_end_query(struct pipe_context *_pipe,
164 struct pipe_query *query)
166 struct trace_context *tr_ctx = trace_context(_pipe);
167 struct pipe_context *pipe = tr_ctx->pipe;
169 trace_dump_call_begin("pipe_context", "end_query");
171 trace_dump_arg(ptr, pipe);
172 trace_dump_arg(ptr, query);
174 pipe->end_query(pipe, query);
176 trace_dump_call_end();
180 static INLINE boolean
181 trace_context_get_query_result(struct pipe_context *_pipe,
182 struct pipe_query *query,
186 struct trace_context *tr_ctx = trace_context(_pipe);
187 struct pipe_context *pipe = tr_ctx->pipe;
191 trace_dump_call_begin("pipe_context", "get_query_result");
193 trace_dump_arg(ptr, pipe);
195 _result = pipe->get_query_result(pipe, query, wait, presult);
196 result = *((uint64_t*)presult);
198 trace_dump_arg(uint, result);
199 trace_dump_ret(bool, _result);
201 trace_dump_call_end();
208 trace_context_create_blend_state(struct pipe_context *_pipe,
209 const struct pipe_blend_state *state)
211 struct trace_context *tr_ctx = trace_context(_pipe);
212 struct pipe_context *pipe = tr_ctx->pipe;
215 trace_dump_call_begin("pipe_context", "create_blend_state");
217 trace_dump_arg(ptr, pipe);
218 trace_dump_arg(blend_state, state);
220 result = pipe->create_blend_state(pipe, state);
222 trace_dump_ret(ptr, result);
224 trace_dump_call_end();
231 trace_context_bind_blend_state(struct pipe_context *_pipe,
234 struct trace_context *tr_ctx = trace_context(_pipe);
235 struct pipe_context *pipe = tr_ctx->pipe;
237 trace_dump_call_begin("pipe_context", "bind_blend_state");
239 trace_dump_arg(ptr, pipe);
240 trace_dump_arg(ptr, state);
242 pipe->bind_blend_state(pipe, state);
244 trace_dump_call_end();
249 trace_context_delete_blend_state(struct pipe_context *_pipe,
252 struct trace_context *tr_ctx = trace_context(_pipe);
253 struct pipe_context *pipe = tr_ctx->pipe;
255 trace_dump_call_begin("pipe_context", "delete_blend_state");
257 trace_dump_arg(ptr, pipe);
258 trace_dump_arg(ptr, state);
260 pipe->delete_blend_state(pipe, state);
262 trace_dump_call_end();
267 trace_context_create_sampler_state(struct pipe_context *_pipe,
268 const struct pipe_sampler_state *state)
270 struct trace_context *tr_ctx = trace_context(_pipe);
271 struct pipe_context *pipe = tr_ctx->pipe;
274 trace_dump_call_begin("pipe_context", "create_sampler_state");
276 trace_dump_arg(ptr, pipe);
277 trace_dump_arg(sampler_state, state);
279 result = pipe->create_sampler_state(pipe, state);
281 trace_dump_ret(ptr, result);
283 trace_dump_call_end();
290 trace_context_bind_fragment_sampler_states(struct pipe_context *_pipe,
294 struct trace_context *tr_ctx = trace_context(_pipe);
295 struct pipe_context *pipe = tr_ctx->pipe;
297 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
299 trace_dump_arg(ptr, pipe);
300 trace_dump_arg(uint, num_states);
301 trace_dump_arg_array(ptr, states, num_states);
303 pipe->bind_fragment_sampler_states(pipe, num_states, states);
305 trace_dump_call_end();
310 trace_context_bind_vertex_sampler_states(struct pipe_context *_pipe,
314 struct trace_context *tr_ctx = trace_context(_pipe);
315 struct pipe_context *pipe = tr_ctx->pipe;
317 if (!pipe->bind_vertex_sampler_states)
320 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
322 trace_dump_arg(ptr, pipe);
323 trace_dump_arg(uint, num_states);
324 trace_dump_arg_array(ptr, states, num_states);
326 pipe->bind_vertex_sampler_states(pipe, num_states, states);
328 trace_dump_call_end();
333 trace_context_delete_sampler_state(struct pipe_context *_pipe,
336 struct trace_context *tr_ctx = trace_context(_pipe);
337 struct pipe_context *pipe = tr_ctx->pipe;
339 trace_dump_call_begin("pipe_context", "delete_sampler_state");
341 trace_dump_arg(ptr, pipe);
342 trace_dump_arg(ptr, state);
344 pipe->delete_sampler_state(pipe, state);
346 trace_dump_call_end();
351 trace_context_create_rasterizer_state(struct pipe_context *_pipe,
352 const struct pipe_rasterizer_state *state)
354 struct trace_context *tr_ctx = trace_context(_pipe);
355 struct pipe_context *pipe = tr_ctx->pipe;
358 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
360 trace_dump_arg(ptr, pipe);
361 trace_dump_arg(rasterizer_state, state);
363 result = pipe->create_rasterizer_state(pipe, state);
365 trace_dump_ret(ptr, result);
367 trace_dump_call_end();
374 trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
377 struct trace_context *tr_ctx = trace_context(_pipe);
378 struct pipe_context *pipe = tr_ctx->pipe;
380 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
382 trace_dump_arg(ptr, pipe);
383 trace_dump_arg(ptr, state);
385 pipe->bind_rasterizer_state(pipe, state);
387 trace_dump_call_end();
392 trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
395 struct trace_context *tr_ctx = trace_context(_pipe);
396 struct pipe_context *pipe = tr_ctx->pipe;
398 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
400 trace_dump_arg(ptr, pipe);
401 trace_dump_arg(ptr, state);
403 pipe->delete_rasterizer_state(pipe, state);
405 trace_dump_call_end();
410 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
411 const struct pipe_depth_stencil_alpha_state *state)
413 struct trace_context *tr_ctx = trace_context(_pipe);
414 struct pipe_context *pipe = tr_ctx->pipe;
417 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
419 result = pipe->create_depth_stencil_alpha_state(pipe, state);
421 trace_dump_arg(ptr, pipe);
422 trace_dump_arg(depth_stencil_alpha_state, state);
424 trace_dump_ret(ptr, result);
426 trace_dump_call_end();
433 trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
436 struct trace_context *tr_ctx = trace_context(_pipe);
437 struct pipe_context *pipe = tr_ctx->pipe;
439 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
441 trace_dump_arg(ptr, pipe);
442 trace_dump_arg(ptr, state);
444 pipe->bind_depth_stencil_alpha_state(pipe, state);
446 trace_dump_call_end();
451 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
454 struct trace_context *tr_ctx = trace_context(_pipe);
455 struct pipe_context *pipe = tr_ctx->pipe;
457 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
459 trace_dump_arg(ptr, pipe);
460 trace_dump_arg(ptr, state);
462 pipe->delete_depth_stencil_alpha_state(pipe, state);
464 trace_dump_call_end();
469 trace_context_create_fs_state(struct pipe_context *_pipe,
470 const struct pipe_shader_state *state)
472 struct trace_context *tr_ctx = trace_context(_pipe);
473 struct pipe_context *pipe = tr_ctx->pipe;
476 trace_dump_call_begin("pipe_context", "create_fs_state");
478 trace_dump_arg(ptr, pipe);
479 trace_dump_arg(shader_state, state);
481 result = pipe->create_fs_state(pipe, state);
483 trace_dump_ret(ptr, result);
485 trace_dump_call_end();
492 trace_context_bind_fs_state(struct pipe_context *_pipe,
495 struct trace_context *tr_ctx = trace_context(_pipe);
496 struct pipe_context *pipe = tr_ctx->pipe;
498 trace_dump_call_begin("pipe_context", "bind_fs_state");
500 trace_dump_arg(ptr, pipe);
501 trace_dump_arg(ptr, state);
503 pipe->bind_fs_state(pipe, state);
505 trace_dump_call_end();
510 trace_context_delete_fs_state(struct pipe_context *_pipe,
513 struct trace_context *tr_ctx = trace_context(_pipe);
514 struct pipe_context *pipe = tr_ctx->pipe;
516 trace_dump_call_begin("pipe_context", "delete_fs_state");
518 trace_dump_arg(ptr, pipe);
519 trace_dump_arg(ptr, state);
521 pipe->delete_fs_state(pipe, state);
523 trace_dump_call_end();
528 trace_context_create_vs_state(struct pipe_context *_pipe,
529 const struct pipe_shader_state *state)
531 struct trace_context *tr_ctx = trace_context(_pipe);
532 struct pipe_context *pipe = tr_ctx->pipe;
535 trace_dump_call_begin("pipe_context", "create_vs_state");
537 trace_dump_arg(ptr, pipe);
538 trace_dump_arg(shader_state, state);
540 result = pipe->create_vs_state(pipe, state);
542 trace_dump_ret(ptr, result);
544 trace_dump_call_end();
551 trace_context_bind_vs_state(struct pipe_context *_pipe,
554 struct trace_context *tr_ctx = trace_context(_pipe);
555 struct pipe_context *pipe = tr_ctx->pipe;
557 trace_dump_call_begin("pipe_context", "bind_vs_state");
559 trace_dump_arg(ptr, pipe);
560 trace_dump_arg(ptr, state);
562 pipe->bind_vs_state(pipe, state);
564 trace_dump_call_end();
569 trace_context_delete_vs_state(struct pipe_context *_pipe,
572 struct trace_context *tr_ctx = trace_context(_pipe);
573 struct pipe_context *pipe = tr_ctx->pipe;
575 trace_dump_call_begin("pipe_context", "delete_vs_state");
577 trace_dump_arg(ptr, pipe);
578 trace_dump_arg(ptr, state);
580 pipe->delete_vs_state(pipe, state);
582 trace_dump_call_end();
587 trace_context_create_vertex_elements_state(struct pipe_context *_pipe,
588 unsigned num_elements,
589 const struct pipe_vertex_element *elements)
591 struct trace_context *tr_ctx = trace_context(_pipe);
592 struct pipe_context *pipe = tr_ctx->pipe;
595 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
597 trace_dump_arg(ptr, pipe);
598 trace_dump_arg(uint, num_elements);
600 trace_dump_arg_begin("elements");
601 trace_dump_struct_array(vertex_element, elements, num_elements);
602 trace_dump_arg_end();
604 result = pipe->create_vertex_elements_state(pipe, num_elements, elements);
606 trace_dump_ret(ptr, result);
608 trace_dump_call_end();
615 trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,
618 struct trace_context *tr_ctx = trace_context(_pipe);
619 struct pipe_context *pipe = tr_ctx->pipe;
621 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
623 trace_dump_arg(ptr, pipe);
624 trace_dump_arg(ptr, state);
626 pipe->bind_vertex_elements_state(pipe, state);
628 trace_dump_call_end();
633 trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,
636 struct trace_context *tr_ctx = trace_context(_pipe);
637 struct pipe_context *pipe = tr_ctx->pipe;
639 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
641 trace_dump_arg(ptr, pipe);
642 trace_dump_arg(ptr, state);
644 pipe->delete_vertex_elements_state(pipe, state);
646 trace_dump_call_end();
651 trace_context_set_blend_color(struct pipe_context *_pipe,
652 const struct pipe_blend_color *state)
654 struct trace_context *tr_ctx = trace_context(_pipe);
655 struct pipe_context *pipe = tr_ctx->pipe;
657 trace_dump_call_begin("pipe_context", "set_blend_color");
659 trace_dump_arg(ptr, pipe);
660 trace_dump_arg(blend_color, state);
662 pipe->set_blend_color(pipe, state);
664 trace_dump_call_end();
669 trace_context_set_stencil_ref(struct pipe_context *_pipe,
670 const struct pipe_stencil_ref *state)
672 struct trace_context *tr_ctx = trace_context(_pipe);
673 struct pipe_context *pipe = tr_ctx->pipe;
675 trace_dump_call_begin("pipe_context", "set_stencil_ref");
677 trace_dump_arg(ptr, pipe);
678 trace_dump_arg(stencil_ref, state);
680 pipe->set_stencil_ref(pipe, state);
682 trace_dump_call_end();
687 trace_context_set_clip_state(struct pipe_context *_pipe,
688 const struct pipe_clip_state *state)
690 struct trace_context *tr_ctx = trace_context(_pipe);
691 struct pipe_context *pipe = tr_ctx->pipe;
693 trace_dump_call_begin("pipe_context", "set_clip_state");
695 trace_dump_arg(ptr, pipe);
696 trace_dump_arg(clip_state, state);
698 pipe->set_clip_state(pipe, state);
700 trace_dump_call_end();
704 trace_context_set_sample_mask(struct pipe_context *_pipe,
705 unsigned sample_mask)
707 struct trace_context *tr_ctx = trace_context(_pipe);
708 struct pipe_context *pipe = tr_ctx->pipe;
710 trace_dump_call_begin("pipe_context", "set_sample_mask");
712 trace_dump_arg(ptr, pipe);
713 trace_dump_arg(uint, sample_mask);
715 pipe->set_sample_mask(pipe, sample_mask);
717 trace_dump_call_end();
721 trace_context_set_constant_buffer(struct pipe_context *_pipe,
722 uint shader, uint index,
723 struct pipe_resource *buffer)
725 struct trace_context *tr_ctx = trace_context(_pipe);
726 struct pipe_context *pipe = tr_ctx->pipe;
729 buffer = trace_resource_unwrap(tr_ctx, buffer);
732 trace_dump_call_begin("pipe_context", "set_constant_buffer");
734 trace_dump_arg(ptr, pipe);
735 trace_dump_arg(uint, shader);
736 trace_dump_arg(uint, index);
737 trace_dump_arg(ptr, buffer);
739 pipe->set_constant_buffer(pipe, shader, index, buffer);
741 trace_dump_call_end();
746 trace_context_set_framebuffer_state(struct pipe_context *_pipe,
747 const struct pipe_framebuffer_state *state)
749 struct trace_context *tr_ctx = trace_context(_pipe);
750 struct pipe_context *pipe = tr_ctx->pipe;
751 struct pipe_framebuffer_state unwrapped_state;
755 /* Unwrap the input state */
756 memcpy(&unwrapped_state, state, sizeof(unwrapped_state));
757 for(i = 0; i < state->nr_cbufs; ++i)
758 unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
759 for(i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
760 unwrapped_state.cbufs[i] = NULL;
761 unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
762 state = &unwrapped_state;
764 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
766 trace_dump_arg(ptr, pipe);
767 trace_dump_arg(framebuffer_state, state);
769 pipe->set_framebuffer_state(pipe, state);
771 trace_dump_call_end();
776 trace_context_set_polygon_stipple(struct pipe_context *_pipe,
777 const struct pipe_poly_stipple *state)
779 struct trace_context *tr_ctx = trace_context(_pipe);
780 struct pipe_context *pipe = tr_ctx->pipe;
782 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
784 trace_dump_arg(ptr, pipe);
785 trace_dump_arg(poly_stipple, state);
787 pipe->set_polygon_stipple(pipe, state);
789 trace_dump_call_end();
794 trace_context_set_scissor_state(struct pipe_context *_pipe,
795 const struct pipe_scissor_state *state)
797 struct trace_context *tr_ctx = trace_context(_pipe);
798 struct pipe_context *pipe = tr_ctx->pipe;
800 trace_dump_call_begin("pipe_context", "set_scissor_state");
802 trace_dump_arg(ptr, pipe);
803 trace_dump_arg(scissor_state, state);
805 pipe->set_scissor_state(pipe, state);
807 trace_dump_call_end();
812 trace_context_set_viewport_state(struct pipe_context *_pipe,
813 const struct pipe_viewport_state *state)
815 struct trace_context *tr_ctx = trace_context(_pipe);
816 struct pipe_context *pipe = tr_ctx->pipe;
818 trace_dump_call_begin("pipe_context", "set_viewport_state");
820 trace_dump_arg(ptr, pipe);
821 trace_dump_arg(viewport_state, state);
823 pipe->set_viewport_state(pipe, state);
825 trace_dump_call_end();
829 static struct pipe_sampler_view *
830 trace_create_sampler_view(struct pipe_context *_pipe,
831 struct pipe_resource *_resource,
832 const struct pipe_sampler_view *templ)
834 struct trace_context *tr_ctx = trace_context(_pipe);
835 struct trace_resource *tr_res = trace_resource(_resource);
836 struct pipe_context *pipe = tr_ctx->pipe;
837 struct pipe_resource *resource = tr_res->resource;
838 struct pipe_sampler_view *result;
839 struct trace_sampler_view *tr_view;
841 trace_dump_call_begin("pipe_context", "create_sampler_view");
843 trace_dump_arg(ptr, pipe);
844 trace_dump_arg(ptr, resource);
846 trace_dump_arg_begin("templ");
847 trace_dump_sampler_view_template(templ, resource->target);
848 trace_dump_arg_end();
850 result = pipe->create_sampler_view(pipe, resource, templ);
852 trace_dump_ret(ptr, result);
854 trace_dump_call_end();
857 * Wrap pipe_sampler_view
859 tr_view = CALLOC_STRUCT(trace_sampler_view);
860 tr_view->base = *templ;
861 tr_view->base.reference.count = 1;
862 tr_view->base.texture = NULL;
863 pipe_resource_reference(&tr_view->base.texture, _resource);
864 tr_view->base.context = _pipe;
865 tr_view->sampler_view = result;
866 result = &tr_view->base;
873 trace_sampler_view_destroy(struct pipe_context *_pipe,
874 struct pipe_sampler_view *_view)
876 struct trace_context *tr_ctx = trace_context(_pipe);
877 struct trace_sampler_view *tr_view = trace_sampler_view(_view);
878 struct pipe_context *pipe = tr_ctx->pipe;
879 struct pipe_sampler_view *view = tr_view->sampler_view;
881 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
883 trace_dump_arg(ptr, pipe);
884 trace_dump_arg(ptr, view);
886 pipe_sampler_view_reference(&tr_view->sampler_view, NULL);
888 trace_dump_call_end();
890 pipe_resource_reference(&_view->texture, NULL);
894 /********************************************************************
899 static struct pipe_surface *
900 trace_create_surface(struct pipe_context *_pipe,
901 struct pipe_resource *_resource,
902 const struct pipe_surface *surf_tmpl)
904 struct trace_context *tr_ctx = trace_context(_pipe);
905 struct trace_resource *tr_res = trace_resource(_resource);
906 struct pipe_context *pipe = tr_ctx->pipe;
907 struct pipe_resource *resource = tr_res->resource;
908 struct pipe_surface *result = NULL;
910 trace_dump_call_begin("pipe_context", "create_surface");
912 trace_dump_arg(ptr, pipe);
913 trace_dump_arg(ptr, resource);
915 trace_dump_arg_begin("surf_tmpl");
916 trace_dump_surface_template(surf_tmpl, resource->target);
917 trace_dump_arg_end();
920 result = pipe->create_surface(pipe, resource, surf_tmpl);
922 trace_dump_ret(ptr, result);
924 trace_dump_call_end();
926 result = trace_surf_create(tr_res, result);
933 trace_surface_destroy(struct pipe_context *_pipe,
934 struct pipe_surface *_surface)
936 struct trace_context *tr_ctx = trace_context(_pipe);
937 struct pipe_context *pipe = tr_ctx->pipe;
938 struct trace_surface *tr_surf = trace_surface(_surface);
939 struct pipe_surface *surface = tr_surf->surface;
941 trace_dump_call_begin("pipe_context", "surface_destroy");
943 trace_dump_arg(ptr, pipe);
944 trace_dump_arg(ptr, surface);
946 trace_dump_call_end();
948 trace_surf_destroy(tr_surf);
953 trace_context_set_fragment_sampler_views(struct pipe_context *_pipe,
955 struct pipe_sampler_view **views)
957 struct trace_context *tr_ctx = trace_context(_pipe);
958 struct trace_sampler_view *tr_view;
959 struct pipe_context *pipe = tr_ctx->pipe;
960 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
963 for(i = 0; i < num; ++i) {
964 tr_view = trace_sampler_view(views[i]);
965 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;
967 views = unwrapped_views;
969 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
971 trace_dump_arg(ptr, pipe);
972 trace_dump_arg(uint, num);
973 trace_dump_arg_array(ptr, views, num);
975 pipe->set_fragment_sampler_views(pipe, num, views);
977 trace_dump_call_end();
982 trace_context_set_vertex_sampler_views(struct pipe_context *_pipe,
984 struct pipe_sampler_view **views)
986 struct trace_context *tr_ctx = trace_context(_pipe);
987 struct trace_sampler_view *tr_view;
988 struct pipe_context *pipe = tr_ctx->pipe;
989 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS];
992 if (!pipe->set_vertex_sampler_views)
995 for(i = 0; i < num; ++i) {
996 tr_view = trace_sampler_view(views[i]);
997 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;
999 views = unwrapped_views;
1001 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
1003 trace_dump_arg(ptr, pipe);
1004 trace_dump_arg(uint, num);
1005 trace_dump_arg_array(ptr, views, num);
1007 pipe->set_vertex_sampler_views(pipe, num, views);
1009 trace_dump_call_end();
1014 trace_context_set_vertex_buffers(struct pipe_context *_pipe,
1015 unsigned num_buffers,
1016 const struct pipe_vertex_buffer *buffers)
1018 struct trace_context *tr_ctx = trace_context(_pipe);
1019 struct pipe_context *pipe = tr_ctx->pipe;
1022 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
1024 trace_dump_arg(ptr, pipe);
1025 trace_dump_arg(uint, num_buffers);
1027 trace_dump_arg_begin("buffers");
1028 trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
1029 trace_dump_arg_end();
1032 struct pipe_vertex_buffer *_buffers = MALLOC(num_buffers * sizeof(*_buffers));
1033 memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers));
1034 for (i = 0; i < num_buffers; i++)
1035 _buffers[i].buffer = trace_resource_unwrap(tr_ctx, buffers[i].buffer);
1036 pipe->set_vertex_buffers(pipe, num_buffers, _buffers);
1039 pipe->set_vertex_buffers(pipe, num_buffers, NULL);
1042 trace_dump_call_end();
1047 trace_context_set_index_buffer(struct pipe_context *_pipe,
1048 const struct pipe_index_buffer *ib)
1050 struct trace_context *tr_ctx = trace_context(_pipe);
1051 struct pipe_context *pipe = tr_ctx->pipe;
1053 trace_dump_call_begin("pipe_context", "set_index_buffer");
1055 trace_dump_arg(ptr, pipe);
1056 trace_dump_arg(index_buffer, ib);
1059 struct pipe_index_buffer _ib;
1061 _ib.buffer = trace_resource_unwrap(tr_ctx, ib->buffer);
1062 pipe->set_index_buffer(pipe, &_ib);
1064 pipe->set_index_buffer(pipe, NULL);
1067 trace_dump_call_end();
1071 trace_context_resource_copy_region(struct pipe_context *_pipe,
1072 struct pipe_resource *dst,
1074 unsigned dstx, unsigned dsty, unsigned dstz,
1075 struct pipe_resource *src,
1077 const struct pipe_box *src_box)
1079 struct trace_context *tr_ctx = trace_context(_pipe);
1080 struct pipe_context *pipe = tr_ctx->pipe;
1082 dst = trace_resource_unwrap(tr_ctx, dst);
1083 src = trace_resource_unwrap(tr_ctx, src);
1085 trace_dump_call_begin("pipe_context", "resource_copy_region");
1087 trace_dump_arg(ptr, pipe);
1088 trace_dump_arg(ptr, dst);
1089 trace_dump_arg(uint, dst_level);
1090 trace_dump_arg(uint, dstx);
1091 trace_dump_arg(uint, dsty);
1092 trace_dump_arg(uint, dstz);
1093 trace_dump_arg(ptr, src);
1094 trace_dump_arg(uint, src_level);
1095 trace_dump_arg(box, src_box);
1097 pipe->resource_copy_region(pipe,
1098 dst, dst_level, dstx, dsty, dstz,
1099 src, src_level, src_box);
1101 trace_dump_call_end();
1106 trace_context_clear(struct pipe_context *_pipe,
1112 struct trace_context *tr_ctx = trace_context(_pipe);
1113 struct pipe_context *pipe = tr_ctx->pipe;
1115 trace_dump_call_begin("pipe_context", "clear");
1117 trace_dump_arg(ptr, pipe);
1118 trace_dump_arg(uint, buffers);
1120 trace_dump_arg_array(float, rgba, 4);
1123 trace_dump_arg(float, depth);
1124 trace_dump_arg(uint, stencil);
1126 pipe->clear(pipe, buffers, rgba, depth, stencil);
1128 trace_dump_call_end();
1133 trace_context_clear_render_target(struct pipe_context *_pipe,
1134 struct pipe_surface *dst,
1136 unsigned dstx, unsigned dsty,
1137 unsigned width, unsigned height)
1139 struct trace_context *tr_ctx = trace_context(_pipe);
1140 struct pipe_context *pipe = tr_ctx->pipe;
1142 dst = trace_surface_unwrap(tr_ctx, dst);
1144 trace_dump_call_begin("pipe_context", "clear_render_target");
1146 trace_dump_arg(ptr, pipe);
1147 trace_dump_arg(ptr, dst);
1148 trace_dump_arg_array(float, rgba, 4);
1149 trace_dump_arg(uint, dstx);
1150 trace_dump_arg(uint, dsty);
1151 trace_dump_arg(uint, width);
1152 trace_dump_arg(uint, height);
1154 pipe->clear_render_target(pipe, dst, rgba, dstx, dsty, width, height);
1156 trace_dump_call_end();
1160 trace_context_clear_depth_stencil(struct pipe_context *_pipe,
1161 struct pipe_surface *dst,
1162 unsigned clear_flags,
1165 unsigned dstx, unsigned dsty,
1166 unsigned width, unsigned height)
1168 struct trace_context *tr_ctx = trace_context(_pipe);
1169 struct pipe_context *pipe = tr_ctx->pipe;
1171 dst = trace_surface_unwrap(tr_ctx, dst);
1173 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1175 trace_dump_arg(ptr, pipe);
1176 trace_dump_arg(ptr, dst);
1177 trace_dump_arg(uint, clear_flags);
1178 trace_dump_arg(float, depth);
1179 trace_dump_arg(uint, stencil);
1180 trace_dump_arg(uint, dstx);
1181 trace_dump_arg(uint, dsty);
1182 trace_dump_arg(uint, width);
1183 trace_dump_arg(uint, height);
1185 pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1186 dstx, dsty, width, height);
1188 trace_dump_call_end();
1192 trace_context_flush(struct pipe_context *_pipe,
1193 struct pipe_fence_handle **fence)
1195 struct trace_context *tr_ctx = trace_context(_pipe);
1196 struct pipe_context *pipe = tr_ctx->pipe;
1198 trace_dump_call_begin("pipe_context", "flush");
1200 trace_dump_arg(ptr, pipe);
1202 pipe->flush(pipe, fence);
1205 trace_dump_ret(ptr, *fence);
1207 trace_dump_call_end();
1212 trace_context_destroy(struct pipe_context *_pipe)
1214 struct trace_context *tr_ctx = trace_context(_pipe);
1215 struct pipe_context *pipe = tr_ctx->pipe;
1217 trace_dump_call_begin("pipe_context", "destroy");
1218 trace_dump_arg(ptr, pipe);
1219 trace_dump_call_end();
1221 pipe->destroy(pipe);
1227 /********************************************************************
1232 static struct pipe_transfer *
1233 trace_context_get_transfer(struct pipe_context *_context,
1234 struct pipe_resource *_resource,
1237 const struct pipe_box *box)
1239 struct trace_context *tr_context = trace_context(_context);
1240 struct trace_resource *tr_res = trace_resource(_resource);
1241 struct pipe_context *context = tr_context->pipe;
1242 struct pipe_resource *texture = tr_res->resource;
1243 struct pipe_transfer *result = NULL;
1245 assert(texture->screen == context->screen);
1248 * Map and transfers can't be serialized so we convert all write transfers
1249 * to transfer_inline_write and ignore read transfers.
1252 result = context->get_transfer(context, texture, level, usage, box);
1255 result = trace_transfer_create(tr_context, tr_res, result);
1262 trace_context_transfer_destroy(struct pipe_context *_context,
1263 struct pipe_transfer *_transfer)
1265 struct trace_context *tr_context = trace_context(_context);
1266 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1268 trace_transfer_destroy(tr_context, tr_trans);
1273 trace_context_transfer_map(struct pipe_context *_context,
1274 struct pipe_transfer *_transfer)
1276 struct trace_context *tr_context = trace_context(_context);
1277 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1278 struct pipe_context *context = tr_context->pipe;
1279 struct pipe_transfer *transfer = tr_trans->transfer;
1282 map = context->transfer_map(context, transfer);
1284 if(transfer->usage & PIPE_TRANSFER_WRITE) {
1285 assert(!tr_trans->map);
1286 tr_trans->map = map;
1295 trace_context_transfer_flush_region( struct pipe_context *_context,
1296 struct pipe_transfer *_transfer,
1297 const struct pipe_box *box)
1299 struct trace_context *tr_context = trace_context(_context);
1300 struct trace_transfer *tr_transfer = trace_transfer(_transfer);
1301 struct pipe_context *context = tr_context->pipe;
1302 struct pipe_transfer *transfer = tr_transfer->transfer;
1304 context->transfer_flush_region(context,
1310 trace_context_transfer_unmap(struct pipe_context *_context,
1311 struct pipe_transfer *_transfer)
1313 struct trace_context *tr_ctx = trace_context(_context);
1314 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1315 struct pipe_context *context = tr_ctx->pipe;
1316 struct pipe_transfer *transfer = tr_trans->transfer;
1320 * Fake a transfer_inline_write
1323 struct pipe_resource *resource = transfer->resource;
1324 unsigned level = transfer->level;
1325 unsigned usage = transfer->usage;
1326 const struct pipe_box *box = &transfer->box;
1327 unsigned stride = transfer->stride;
1328 unsigned layer_stride = transfer->layer_stride;
1330 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1332 trace_dump_arg(ptr, context);
1333 trace_dump_arg(ptr, resource);
1334 trace_dump_arg(uint, level);
1335 trace_dump_arg(uint, usage);
1336 trace_dump_arg(box, box);
1338 trace_dump_arg_begin("data");
1339 trace_dump_box_bytes(tr_trans->map,
1344 trace_dump_arg_end();
1346 trace_dump_arg(uint, stride);
1347 trace_dump_arg(uint, layer_stride);
1349 trace_dump_call_end();
1351 tr_trans->map = NULL;
1354 context->transfer_unmap(context, transfer);
1359 trace_context_transfer_inline_write(struct pipe_context *_context,
1360 struct pipe_resource *_resource,
1363 const struct pipe_box *box,
1366 unsigned layer_stride)
1368 struct trace_context *tr_context = trace_context(_context);
1369 struct trace_resource *tr_res = trace_resource(_resource);
1370 struct pipe_context *context = tr_context->pipe;
1371 struct pipe_resource *resource = tr_res->resource;
1373 assert(resource->screen == context->screen);
1375 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1377 trace_dump_arg(ptr, context);
1378 trace_dump_arg(ptr, resource);
1379 trace_dump_arg(uint, level);
1380 trace_dump_arg(uint, usage);
1381 trace_dump_arg(box, box);
1383 trace_dump_arg_begin("data");
1384 trace_dump_box_bytes(data,
1389 trace_dump_arg_end();
1391 trace_dump_arg(uint, stride);
1392 trace_dump_arg(uint, layer_stride);
1394 trace_dump_call_end();
1396 context->transfer_inline_write(context, resource,
1397 level, usage, box, data, stride, layer_stride);
1401 static void trace_redefine_user_buffer(struct pipe_context *_context,
1402 struct pipe_resource *_resource,
1403 unsigned offset, unsigned size)
1405 struct trace_context *tr_context = trace_context(_context);
1406 struct trace_resource *tr_res = trace_resource(_resource);
1407 struct pipe_context *context = tr_context->pipe;
1408 struct pipe_resource *resource = tr_res->resource;
1410 assert(resource->screen == context->screen);
1412 trace_dump_call_begin("pipe_context", "redefine_user_buffer");
1414 trace_dump_arg(ptr, context);
1415 trace_dump_arg(ptr, resource);
1416 trace_dump_arg(uint, offset);
1417 trace_dump_arg(uint, size);
1419 trace_dump_call_end();
1421 context->redefine_user_buffer(context, resource, offset, size);
1425 static void trace_render_condition(struct pipe_context *_context,
1426 struct pipe_query *query,
1429 struct trace_context *tr_context = trace_context(_context);
1430 struct pipe_context *context = tr_context->pipe;
1432 trace_dump_call_begin("pipe_context", "render_condition");
1434 trace_dump_arg(ptr, context);
1435 trace_dump_arg(ptr, query);
1436 trace_dump_arg(uint, mode);
1438 trace_dump_call_end();
1440 context->render_condition(context, query, mode);
1444 static void trace_texture_barrier(struct pipe_context *_context)
1446 struct trace_context *tr_context = trace_context(_context);
1447 struct pipe_context *context = tr_context->pipe;
1449 trace_dump_call_begin("pipe_context", "texture_barrier");
1451 trace_dump_arg(ptr, context);
1453 trace_dump_call_end();
1455 context->texture_barrier(context);
1459 static const struct debug_named_value rbug_blocker_flags[] = {
1460 {"before", 1, NULL},
1462 DEBUG_NAMED_VALUE_END
1465 struct pipe_context *
1466 trace_context_create(struct trace_screen *tr_scr,
1467 struct pipe_context *pipe)
1469 struct trace_context *tr_ctx;
1474 if(!trace_enabled())
1477 tr_ctx = CALLOC_STRUCT(trace_context);
1481 tr_ctx->base.winsys = NULL;
1482 tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
1483 tr_ctx->base.screen = &tr_scr->base;
1485 tr_ctx->base.destroy = trace_context_destroy;
1486 tr_ctx->base.draw_vbo = trace_context_draw_vbo;
1487 tr_ctx->base.create_query = trace_context_create_query;
1488 tr_ctx->base.destroy_query = trace_context_destroy_query;
1489 tr_ctx->base.begin_query = trace_context_begin_query;
1490 tr_ctx->base.end_query = trace_context_end_query;
1491 tr_ctx->base.get_query_result = trace_context_get_query_result;
1492 tr_ctx->base.create_blend_state = trace_context_create_blend_state;
1493 tr_ctx->base.bind_blend_state = trace_context_bind_blend_state;
1494 tr_ctx->base.delete_blend_state = trace_context_delete_blend_state;
1495 tr_ctx->base.create_sampler_state = trace_context_create_sampler_state;
1496 tr_ctx->base.bind_fragment_sampler_states = trace_context_bind_fragment_sampler_states;
1497 tr_ctx->base.bind_vertex_sampler_states = trace_context_bind_vertex_sampler_states;
1498 tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state;
1499 tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state;
1500 tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state;
1501 tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state;
1502 tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state;
1503 tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state;
1504 tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state;
1505 tr_ctx->base.create_fs_state = trace_context_create_fs_state;
1506 tr_ctx->base.bind_fs_state = trace_context_bind_fs_state;
1507 tr_ctx->base.delete_fs_state = trace_context_delete_fs_state;
1508 tr_ctx->base.create_vs_state = trace_context_create_vs_state;
1509 tr_ctx->base.bind_vs_state = trace_context_bind_vs_state;
1510 tr_ctx->base.delete_vs_state = trace_context_delete_vs_state;
1511 tr_ctx->base.create_vertex_elements_state = trace_context_create_vertex_elements_state;
1512 tr_ctx->base.bind_vertex_elements_state = trace_context_bind_vertex_elements_state;
1513 tr_ctx->base.delete_vertex_elements_state = trace_context_delete_vertex_elements_state;
1514 tr_ctx->base.set_blend_color = trace_context_set_blend_color;
1515 tr_ctx->base.set_stencil_ref = trace_context_set_stencil_ref;
1516 tr_ctx->base.set_clip_state = trace_context_set_clip_state;
1517 tr_ctx->base.set_sample_mask = trace_context_set_sample_mask;
1518 tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer;
1519 tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state;
1520 tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple;
1521 tr_ctx->base.set_scissor_state = trace_context_set_scissor_state;
1522 tr_ctx->base.set_viewport_state = trace_context_set_viewport_state;
1523 tr_ctx->base.set_fragment_sampler_views = trace_context_set_fragment_sampler_views;
1524 tr_ctx->base.set_vertex_sampler_views = trace_context_set_vertex_sampler_views;
1525 tr_ctx->base.create_sampler_view = trace_create_sampler_view;
1526 tr_ctx->base.sampler_view_destroy = trace_sampler_view_destroy;
1527 tr_ctx->base.create_surface = trace_create_surface;
1528 tr_ctx->base.surface_destroy = trace_surface_destroy;
1529 tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers;
1530 tr_ctx->base.set_index_buffer = trace_context_set_index_buffer;
1531 tr_ctx->base.resource_copy_region = trace_context_resource_copy_region;
1532 tr_ctx->base.clear = trace_context_clear;
1533 tr_ctx->base.clear_render_target = trace_context_clear_render_target;
1534 tr_ctx->base.clear_depth_stencil = trace_context_clear_depth_stencil;
1535 tr_ctx->base.flush = trace_context_flush;
1536 tr_ctx->base.render_condition = pipe->render_condition ? trace_render_condition : NULL;
1537 tr_ctx->base.texture_barrier = pipe->texture_barrier ? trace_texture_barrier : NULL;
1539 tr_ctx->base.get_transfer = trace_context_get_transfer;
1540 tr_ctx->base.transfer_destroy = trace_context_transfer_destroy;
1541 tr_ctx->base.transfer_map = trace_context_transfer_map;
1542 tr_ctx->base.transfer_unmap = trace_context_transfer_unmap;
1543 tr_ctx->base.transfer_flush_region = trace_context_transfer_flush_region;
1544 tr_ctx->base.transfer_inline_write = trace_context_transfer_inline_write;
1545 tr_ctx->base.redefine_user_buffer = trace_redefine_user_buffer;
1547 tr_ctx->pipe = pipe;
1549 return &tr_ctx->base;