Merge remote branch 'origin/master' into nv50-compiler
[mesa.git] / src / gallium / drivers / trace / tr_context.c
1 /**************************************************************************
2 *
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
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:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
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.
25 *
26 **************************************************************************/
27
28 #include "util/u_inlines.h"
29 #include "util/u_memory.h"
30 #include "util/u_simple_list.h"
31
32 #include "pipe/p_format.h"
33 #include "pipe/p_screen.h"
34
35 #include "tr_dump.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"
41
42
43
44
45
46 static INLINE struct pipe_resource *
47 trace_resource_unwrap(struct trace_context *tr_ctx,
48 struct pipe_resource *resource)
49 {
50 struct trace_resource *tr_tex;
51
52 if(!resource)
53 return NULL;
54
55 tr_tex = trace_resource(resource);
56
57 assert(tr_tex->resource);
58 return tr_tex->resource;
59 }
60
61
62 static INLINE struct pipe_surface *
63 trace_surface_unwrap(struct trace_context *tr_ctx,
64 struct pipe_surface *surface)
65 {
66 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen);
67 struct trace_surface *tr_surf;
68
69 if(!surface)
70 return NULL;
71
72 assert(surface->texture);
73 if(!surface->texture)
74 return surface;
75
76 tr_surf = trace_surface(surface);
77
78 assert(tr_surf->surface);
79 assert(tr_surf->surface->texture->screen == tr_scr->screen);
80 (void) tr_scr;
81 return tr_surf->surface;
82 }
83
84
85 static INLINE void
86 trace_context_draw_vbo(struct pipe_context *_pipe,
87 const struct pipe_draw_info *info)
88 {
89 struct trace_context *tr_ctx = trace_context(_pipe);
90 struct pipe_context *pipe = tr_ctx->pipe;
91
92 trace_dump_call_begin("pipe_context", "draw_vbo");
93
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);
104
105 pipe->draw_vbo(pipe, info);
106
107 trace_dump_call_end();
108 }
109
110
111 static INLINE struct pipe_query *
112 trace_context_create_query(struct pipe_context *_pipe,
113 unsigned query_type)
114 {
115 struct trace_context *tr_ctx = trace_context(_pipe);
116 struct pipe_context *pipe = tr_ctx->pipe;
117 struct pipe_query *result;
118
119 trace_dump_call_begin("pipe_context", "create_query");
120
121 trace_dump_arg(ptr, pipe);
122 trace_dump_arg(uint, query_type);
123
124 result = pipe->create_query(pipe, query_type);
125
126 trace_dump_ret(ptr, result);
127
128 trace_dump_call_end();
129
130 return result;
131 }
132
133
134 static INLINE void
135 trace_context_destroy_query(struct pipe_context *_pipe,
136 struct pipe_query *query)
137 {
138 struct trace_context *tr_ctx = trace_context(_pipe);
139 struct pipe_context *pipe = tr_ctx->pipe;
140
141 trace_dump_call_begin("pipe_context", "destroy_query");
142
143 trace_dump_arg(ptr, pipe);
144 trace_dump_arg(ptr, query);
145
146 pipe->destroy_query(pipe, query);
147
148 trace_dump_call_end();
149 }
150
151
152 static INLINE void
153 trace_context_begin_query(struct pipe_context *_pipe,
154 struct pipe_query *query)
155 {
156 struct trace_context *tr_ctx = trace_context(_pipe);
157 struct pipe_context *pipe = tr_ctx->pipe;
158
159 trace_dump_call_begin("pipe_context", "begin_query");
160
161 trace_dump_arg(ptr, pipe);
162 trace_dump_arg(ptr, query);
163
164 pipe->begin_query(pipe, query);
165
166 trace_dump_call_end();
167 }
168
169
170 static INLINE void
171 trace_context_end_query(struct pipe_context *_pipe,
172 struct pipe_query *query)
173 {
174 struct trace_context *tr_ctx = trace_context(_pipe);
175 struct pipe_context *pipe = tr_ctx->pipe;
176
177 trace_dump_call_begin("pipe_context", "end_query");
178
179 trace_dump_arg(ptr, pipe);
180 trace_dump_arg(ptr, query);
181
182 pipe->end_query(pipe, query);
183
184 trace_dump_call_end();
185 }
186
187
188 static INLINE boolean
189 trace_context_get_query_result(struct pipe_context *_pipe,
190 struct pipe_query *query,
191 boolean wait,
192 void *presult)
193 {
194 struct trace_context *tr_ctx = trace_context(_pipe);
195 struct pipe_context *pipe = tr_ctx->pipe;
196 uint64_t result;
197 boolean _result;
198
199 trace_dump_call_begin("pipe_context", "get_query_result");
200
201 trace_dump_arg(ptr, pipe);
202
203 _result = pipe->get_query_result(pipe, query, wait, presult);
204 result = *((uint64_t*)presult);
205
206 trace_dump_arg(uint, result);
207 trace_dump_ret(bool, _result);
208
209 trace_dump_call_end();
210
211 return _result;
212 }
213
214
215 static INLINE void *
216 trace_context_create_blend_state(struct pipe_context *_pipe,
217 const struct pipe_blend_state *state)
218 {
219 struct trace_context *tr_ctx = trace_context(_pipe);
220 struct pipe_context *pipe = tr_ctx->pipe;
221 void * result;
222
223 trace_dump_call_begin("pipe_context", "create_blend_state");
224
225 trace_dump_arg(ptr, pipe);
226 trace_dump_arg(blend_state, state);
227
228 result = pipe->create_blend_state(pipe, state);
229
230 trace_dump_ret(ptr, result);
231
232 trace_dump_call_end();
233
234 return result;
235 }
236
237
238 static INLINE void
239 trace_context_bind_blend_state(struct pipe_context *_pipe,
240 void *state)
241 {
242 struct trace_context *tr_ctx = trace_context(_pipe);
243 struct pipe_context *pipe = tr_ctx->pipe;
244
245 trace_dump_call_begin("pipe_context", "bind_blend_state");
246
247 trace_dump_arg(ptr, pipe);
248 trace_dump_arg(ptr, state);
249
250 pipe->bind_blend_state(pipe, state);
251
252 trace_dump_call_end();
253 }
254
255
256 static INLINE void
257 trace_context_delete_blend_state(struct pipe_context *_pipe,
258 void *state)
259 {
260 struct trace_context *tr_ctx = trace_context(_pipe);
261 struct pipe_context *pipe = tr_ctx->pipe;
262
263 trace_dump_call_begin("pipe_context", "delete_blend_state");
264
265 trace_dump_arg(ptr, pipe);
266 trace_dump_arg(ptr, state);
267
268 pipe->delete_blend_state(pipe, state);
269
270 trace_dump_call_end();
271 }
272
273
274 static INLINE void *
275 trace_context_create_sampler_state(struct pipe_context *_pipe,
276 const struct pipe_sampler_state *state)
277 {
278 struct trace_context *tr_ctx = trace_context(_pipe);
279 struct pipe_context *pipe = tr_ctx->pipe;
280 void * result;
281
282 trace_dump_call_begin("pipe_context", "create_sampler_state");
283
284 trace_dump_arg(ptr, pipe);
285 trace_dump_arg(sampler_state, state);
286
287 result = pipe->create_sampler_state(pipe, state);
288
289 trace_dump_ret(ptr, result);
290
291 trace_dump_call_end();
292
293 return result;
294 }
295
296
297 static INLINE void
298 trace_context_bind_fragment_sampler_states(struct pipe_context *_pipe,
299 unsigned num_states,
300 void **states)
301 {
302 struct trace_context *tr_ctx = trace_context(_pipe);
303 struct pipe_context *pipe = tr_ctx->pipe;
304
305 trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
306
307 trace_dump_arg(ptr, pipe);
308 trace_dump_arg(uint, num_states);
309 trace_dump_arg_array(ptr, states, num_states);
310
311 pipe->bind_fragment_sampler_states(pipe, num_states, states);
312
313 trace_dump_call_end();
314 }
315
316
317 static INLINE void
318 trace_context_bind_vertex_sampler_states(struct pipe_context *_pipe,
319 unsigned num_states,
320 void **states)
321 {
322 struct trace_context *tr_ctx = trace_context(_pipe);
323 struct pipe_context *pipe = tr_ctx->pipe;
324
325 trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
326
327 trace_dump_arg(ptr, pipe);
328 trace_dump_arg(uint, num_states);
329 trace_dump_arg_array(ptr, states, num_states);
330
331 pipe->bind_vertex_sampler_states(pipe, num_states, states);
332
333 trace_dump_call_end();
334 }
335
336
337 static INLINE void
338 trace_context_delete_sampler_state(struct pipe_context *_pipe,
339 void *state)
340 {
341 struct trace_context *tr_ctx = trace_context(_pipe);
342 struct pipe_context *pipe = tr_ctx->pipe;
343
344 trace_dump_call_begin("pipe_context", "delete_sampler_state");
345
346 trace_dump_arg(ptr, pipe);
347 trace_dump_arg(ptr, state);
348
349 pipe->delete_sampler_state(pipe, state);
350
351 trace_dump_call_end();
352 }
353
354
355 static INLINE void *
356 trace_context_create_rasterizer_state(struct pipe_context *_pipe,
357 const struct pipe_rasterizer_state *state)
358 {
359 struct trace_context *tr_ctx = trace_context(_pipe);
360 struct pipe_context *pipe = tr_ctx->pipe;
361 void * result;
362
363 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
364
365 trace_dump_arg(ptr, pipe);
366 trace_dump_arg(rasterizer_state, state);
367
368 result = pipe->create_rasterizer_state(pipe, state);
369
370 trace_dump_ret(ptr, result);
371
372 trace_dump_call_end();
373
374 return result;
375 }
376
377
378 static INLINE void
379 trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
380 void *state)
381 {
382 struct trace_context *tr_ctx = trace_context(_pipe);
383 struct pipe_context *pipe = tr_ctx->pipe;
384
385 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
386
387 trace_dump_arg(ptr, pipe);
388 trace_dump_arg(ptr, state);
389
390 pipe->bind_rasterizer_state(pipe, state);
391
392 trace_dump_call_end();
393 }
394
395
396 static INLINE void
397 trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
398 void *state)
399 {
400 struct trace_context *tr_ctx = trace_context(_pipe);
401 struct pipe_context *pipe = tr_ctx->pipe;
402
403 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
404
405 trace_dump_arg(ptr, pipe);
406 trace_dump_arg(ptr, state);
407
408 pipe->delete_rasterizer_state(pipe, state);
409
410 trace_dump_call_end();
411 }
412
413
414 static INLINE void *
415 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
416 const struct pipe_depth_stencil_alpha_state *state)
417 {
418 struct trace_context *tr_ctx = trace_context(_pipe);
419 struct pipe_context *pipe = tr_ctx->pipe;
420 void * result;
421
422 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
423
424 result = pipe->create_depth_stencil_alpha_state(pipe, state);
425
426 trace_dump_arg(ptr, pipe);
427 trace_dump_arg(depth_stencil_alpha_state, state);
428
429 trace_dump_ret(ptr, result);
430
431 trace_dump_call_end();
432
433 return result;
434 }
435
436
437 static INLINE void
438 trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
439 void *state)
440 {
441 struct trace_context *tr_ctx = trace_context(_pipe);
442 struct pipe_context *pipe = tr_ctx->pipe;
443
444 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
445
446 trace_dump_arg(ptr, pipe);
447 trace_dump_arg(ptr, state);
448
449 pipe->bind_depth_stencil_alpha_state(pipe, state);
450
451 trace_dump_call_end();
452 }
453
454
455 static INLINE void
456 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
457 void *state)
458 {
459 struct trace_context *tr_ctx = trace_context(_pipe);
460 struct pipe_context *pipe = tr_ctx->pipe;
461
462 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
463
464 trace_dump_arg(ptr, pipe);
465 trace_dump_arg(ptr, state);
466
467 pipe->delete_depth_stencil_alpha_state(pipe, state);
468
469 trace_dump_call_end();
470 }
471
472
473 static INLINE void *
474 trace_context_create_fs_state(struct pipe_context *_pipe,
475 const struct pipe_shader_state *state)
476 {
477 struct trace_context *tr_ctx = trace_context(_pipe);
478 struct pipe_context *pipe = tr_ctx->pipe;
479 void * result;
480
481 trace_dump_call_begin("pipe_context", "create_fs_state");
482
483 trace_dump_arg(ptr, pipe);
484 trace_dump_arg(shader_state, state);
485
486 result = pipe->create_fs_state(pipe, state);
487
488 trace_dump_ret(ptr, result);
489
490 trace_dump_call_end();
491
492 return result;
493 }
494
495
496 static INLINE void
497 trace_context_bind_fs_state(struct pipe_context *_pipe,
498 void *state)
499 {
500 struct trace_context *tr_ctx = trace_context(_pipe);
501 struct pipe_context *pipe = tr_ctx->pipe;
502
503 trace_dump_call_begin("pipe_context", "bind_fs_state");
504
505 trace_dump_arg(ptr, pipe);
506 trace_dump_arg(ptr, state);
507
508 pipe->bind_fs_state(pipe, state);
509
510 trace_dump_call_end();
511 }
512
513
514 static INLINE void
515 trace_context_delete_fs_state(struct pipe_context *_pipe,
516 void *state)
517 {
518 struct trace_context *tr_ctx = trace_context(_pipe);
519 struct pipe_context *pipe = tr_ctx->pipe;
520
521 trace_dump_call_begin("pipe_context", "delete_fs_state");
522
523 trace_dump_arg(ptr, pipe);
524 trace_dump_arg(ptr, state);
525
526 pipe->delete_fs_state(pipe, state);
527
528 trace_dump_call_end();
529 }
530
531
532 static INLINE void *
533 trace_context_create_vs_state(struct pipe_context *_pipe,
534 const struct pipe_shader_state *state)
535 {
536 struct trace_context *tr_ctx = trace_context(_pipe);
537 struct pipe_context *pipe = tr_ctx->pipe;
538 void * result;
539
540 trace_dump_call_begin("pipe_context", "create_vs_state");
541
542 trace_dump_arg(ptr, pipe);
543 trace_dump_arg(shader_state, state);
544
545 result = pipe->create_vs_state(pipe, state);
546
547 trace_dump_ret(ptr, result);
548
549 trace_dump_call_end();
550
551 return result;
552 }
553
554
555 static INLINE void
556 trace_context_bind_vs_state(struct pipe_context *_pipe,
557 void *state)
558 {
559 struct trace_context *tr_ctx = trace_context(_pipe);
560 struct pipe_context *pipe = tr_ctx->pipe;
561
562 trace_dump_call_begin("pipe_context", "bind_vs_state");
563
564 trace_dump_arg(ptr, pipe);
565 trace_dump_arg(ptr, state);
566
567 pipe->bind_vs_state(pipe, state);
568
569 trace_dump_call_end();
570 }
571
572
573 static INLINE void
574 trace_context_delete_vs_state(struct pipe_context *_pipe,
575 void *state)
576 {
577 struct trace_context *tr_ctx = trace_context(_pipe);
578 struct pipe_context *pipe = tr_ctx->pipe;
579
580 trace_dump_call_begin("pipe_context", "delete_vs_state");
581
582 trace_dump_arg(ptr, pipe);
583 trace_dump_arg(ptr, state);
584
585 pipe->delete_vs_state(pipe, state);
586
587 trace_dump_call_end();
588 }
589
590
591 static INLINE void *
592 trace_context_create_vertex_elements_state(struct pipe_context *_pipe,
593 unsigned num_elements,
594 const struct pipe_vertex_element *elements)
595 {
596 struct trace_context *tr_ctx = trace_context(_pipe);
597 struct pipe_context *pipe = tr_ctx->pipe;
598 void * result;
599
600 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
601
602 trace_dump_arg(ptr, pipe);
603 trace_dump_arg(uint, num_elements);
604
605 trace_dump_arg_begin("elements");
606 trace_dump_struct_array(vertex_element, elements, num_elements);
607 trace_dump_arg_end();
608
609 result = pipe->create_vertex_elements_state(pipe, num_elements, elements);
610
611 trace_dump_ret(ptr, result);
612
613 trace_dump_call_end();
614
615 return result;
616 }
617
618
619 static INLINE void
620 trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,
621 void *state)
622 {
623 struct trace_context *tr_ctx = trace_context(_pipe);
624 struct pipe_context *pipe = tr_ctx->pipe;
625
626 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
627
628 trace_dump_arg(ptr, pipe);
629 trace_dump_arg(ptr, state);
630
631 pipe->bind_vertex_elements_state(pipe, state);
632
633 trace_dump_call_end();
634 }
635
636
637 static INLINE void
638 trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,
639 void *state)
640 {
641 struct trace_context *tr_ctx = trace_context(_pipe);
642 struct pipe_context *pipe = tr_ctx->pipe;
643
644 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
645
646 trace_dump_arg(ptr, pipe);
647 trace_dump_arg(ptr, state);
648
649 pipe->delete_vertex_elements_state(pipe, state);
650
651 trace_dump_call_end();
652 }
653
654
655 static INLINE void
656 trace_context_set_blend_color(struct pipe_context *_pipe,
657 const struct pipe_blend_color *state)
658 {
659 struct trace_context *tr_ctx = trace_context(_pipe);
660 struct pipe_context *pipe = tr_ctx->pipe;
661
662 trace_dump_call_begin("pipe_context", "set_blend_color");
663
664 trace_dump_arg(ptr, pipe);
665 trace_dump_arg(blend_color, state);
666
667 pipe->set_blend_color(pipe, state);
668
669 trace_dump_call_end();
670 }
671
672
673 static INLINE void
674 trace_context_set_stencil_ref(struct pipe_context *_pipe,
675 const struct pipe_stencil_ref *state)
676 {
677 struct trace_context *tr_ctx = trace_context(_pipe);
678 struct pipe_context *pipe = tr_ctx->pipe;
679
680 trace_dump_call_begin("pipe_context", "set_stencil_ref");
681
682 trace_dump_arg(ptr, pipe);
683 trace_dump_arg(stencil_ref, state);
684
685 pipe->set_stencil_ref(pipe, state);
686
687 trace_dump_call_end();
688 }
689
690
691 static INLINE void
692 trace_context_set_clip_state(struct pipe_context *_pipe,
693 const struct pipe_clip_state *state)
694 {
695 struct trace_context *tr_ctx = trace_context(_pipe);
696 struct pipe_context *pipe = tr_ctx->pipe;
697
698 trace_dump_call_begin("pipe_context", "set_clip_state");
699
700 trace_dump_arg(ptr, pipe);
701 trace_dump_arg(clip_state, state);
702
703 pipe->set_clip_state(pipe, state);
704
705 trace_dump_call_end();
706 }
707
708 static INLINE void
709 trace_context_set_sample_mask(struct pipe_context *_pipe,
710 unsigned sample_mask)
711 {
712 struct trace_context *tr_ctx = trace_context(_pipe);
713 struct pipe_context *pipe = tr_ctx->pipe;
714
715 trace_dump_call_begin("pipe_context", "set_sample_mask");
716
717 trace_dump_arg(ptr, pipe);
718 trace_dump_arg(uint, sample_mask);
719
720 pipe->set_sample_mask(pipe, sample_mask);
721
722 trace_dump_call_end();
723 }
724
725 static INLINE void
726 trace_context_set_constant_buffer(struct pipe_context *_pipe,
727 uint shader, uint index,
728 struct pipe_resource *buffer)
729 {
730 struct trace_context *tr_ctx = trace_context(_pipe);
731 struct pipe_context *pipe = tr_ctx->pipe;
732
733 if (buffer) {
734 buffer = trace_resource_unwrap(tr_ctx, buffer);
735 }
736
737 trace_dump_call_begin("pipe_context", "set_constant_buffer");
738
739 trace_dump_arg(ptr, pipe);
740 trace_dump_arg(uint, shader);
741 trace_dump_arg(uint, index);
742 trace_dump_arg(ptr, buffer);
743
744 pipe->set_constant_buffer(pipe, shader, index, buffer);
745
746 trace_dump_call_end();
747 }
748
749
750 static INLINE void
751 trace_context_set_framebuffer_state(struct pipe_context *_pipe,
752 const struct pipe_framebuffer_state *state)
753 {
754 struct trace_context *tr_ctx = trace_context(_pipe);
755 struct pipe_context *pipe = tr_ctx->pipe;
756 struct pipe_framebuffer_state unwrapped_state;
757 unsigned i;
758
759
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;
768
769 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
770
771 trace_dump_arg(ptr, pipe);
772 trace_dump_arg(framebuffer_state, state);
773
774 pipe->set_framebuffer_state(pipe, state);
775
776 trace_dump_call_end();
777 }
778
779
780 static INLINE void
781 trace_context_set_polygon_stipple(struct pipe_context *_pipe,
782 const struct pipe_poly_stipple *state)
783 {
784 struct trace_context *tr_ctx = trace_context(_pipe);
785 struct pipe_context *pipe = tr_ctx->pipe;
786
787 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
788
789 trace_dump_arg(ptr, pipe);
790 trace_dump_arg(poly_stipple, state);
791
792 pipe->set_polygon_stipple(pipe, state);
793
794 trace_dump_call_end();
795 }
796
797
798 static INLINE void
799 trace_context_set_scissor_state(struct pipe_context *_pipe,
800 const struct pipe_scissor_state *state)
801 {
802 struct trace_context *tr_ctx = trace_context(_pipe);
803 struct pipe_context *pipe = tr_ctx->pipe;
804
805 trace_dump_call_begin("pipe_context", "set_scissor_state");
806
807 trace_dump_arg(ptr, pipe);
808 trace_dump_arg(scissor_state, state);
809
810 pipe->set_scissor_state(pipe, state);
811
812 trace_dump_call_end();
813 }
814
815
816 static INLINE void
817 trace_context_set_viewport_state(struct pipe_context *_pipe,
818 const struct pipe_viewport_state *state)
819 {
820 struct trace_context *tr_ctx = trace_context(_pipe);
821 struct pipe_context *pipe = tr_ctx->pipe;
822
823 trace_dump_call_begin("pipe_context", "set_viewport_state");
824
825 trace_dump_arg(ptr, pipe);
826 trace_dump_arg(viewport_state, state);
827
828 pipe->set_viewport_state(pipe, state);
829
830 trace_dump_call_end();
831 }
832
833
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)
838 {
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;
845
846 trace_dump_call_begin("pipe_context", "create_sampler_view");
847
848 trace_dump_arg(ptr, pipe);
849 trace_dump_arg(ptr, texture);
850 trace_dump_arg(sampler_view_template, templ);
851
852 result = pipe->create_sampler_view(pipe, texture, templ);
853
854 trace_dump_ret(ptr, result);
855
856 trace_dump_call_end();
857
858 /*
859 * Wrap pipe_sampler_view
860 */
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;
869
870 return result;
871 }
872
873
874 static void
875 trace_sampler_view_destroy(struct pipe_context *_pipe,
876 struct pipe_sampler_view *_view)
877 {
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;
882
883 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
884
885 trace_dump_arg(ptr, pipe);
886 trace_dump_arg(ptr, view);
887
888 pipe_sampler_view_reference(&tr_view->sampler_view, NULL);
889
890 trace_dump_call_end();
891
892 pipe_resource_reference(&_view->texture, NULL);
893 FREE(_view);
894 }
895
896
897 static INLINE void
898 trace_context_set_fragment_sampler_views(struct pipe_context *_pipe,
899 unsigned num,
900 struct pipe_sampler_view **views)
901 {
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];
906 unsigned i;
907
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;
911 }
912 views = unwrapped_views;
913
914 trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
915
916 trace_dump_arg(ptr, pipe);
917 trace_dump_arg(uint, num);
918 trace_dump_arg_array(ptr, views, num);
919
920 pipe->set_fragment_sampler_views(pipe, num, views);
921
922 trace_dump_call_end();
923 }
924
925
926 static INLINE void
927 trace_context_set_vertex_sampler_views(struct pipe_context *_pipe,
928 unsigned num,
929 struct pipe_sampler_view **views)
930 {
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];
935 unsigned i;
936
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;
940 }
941 views = unwrapped_views;
942
943 trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
944
945 trace_dump_arg(ptr, pipe);
946 trace_dump_arg(uint, num);
947 trace_dump_arg_array(ptr, views, num);
948
949 pipe->set_vertex_sampler_views(pipe, num, views);
950
951 trace_dump_call_end();
952 }
953
954
955 static INLINE void
956 trace_context_set_vertex_buffers(struct pipe_context *_pipe,
957 unsigned num_buffers,
958 const struct pipe_vertex_buffer *buffers)
959 {
960 struct trace_context *tr_ctx = trace_context(_pipe);
961 struct pipe_context *pipe = tr_ctx->pipe;
962 unsigned i;
963
964 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
965
966 trace_dump_arg(ptr, pipe);
967 trace_dump_arg(uint, num_buffers);
968
969 trace_dump_arg_begin("buffers");
970 trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
971 trace_dump_arg_end();
972
973 if (num_buffers) {
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);
979 FREE(_buffers);
980 } else {
981 pipe->set_vertex_buffers(pipe, num_buffers, NULL);
982 }
983
984 trace_dump_call_end();
985 }
986
987
988 static INLINE void
989 trace_context_set_index_buffer(struct pipe_context *_pipe,
990 const struct pipe_index_buffer *_ib)
991 {
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;
995
996 if (_ib) {
997 unwrapped_ib = *_ib;
998 unwrapped_ib.buffer = trace_resource_unwrap(tr_ctx, _ib->buffer);
999 ib = &unwrapped_ib;
1000 }
1001
1002 trace_dump_call_begin("pipe_context", "set_index_buffer");
1003
1004 trace_dump_arg(ptr, pipe);
1005 trace_dump_arg(index_buffer, _ib);
1006
1007 pipe->set_index_buffer(pipe, ib);
1008
1009 trace_dump_call_end();
1010 }
1011
1012 static INLINE void
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)
1021 {
1022 struct trace_context *tr_ctx = trace_context(_pipe);
1023 struct pipe_context *pipe = tr_ctx->pipe;
1024
1025 dst = trace_resource_unwrap(tr_ctx, dst);
1026 src = trace_resource_unwrap(tr_ctx, src);
1027
1028 trace_dump_call_begin("pipe_context", "resource_copy_region");
1029
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);
1043
1044 pipe->resource_copy_region(pipe,
1045 dst, subdst, dstx, dsty, dstz,
1046 src, subsrc, srcx, srcy, srcz, width, height);
1047
1048 trace_dump_call_end();
1049 }
1050
1051
1052 static INLINE void
1053 trace_context_clear(struct pipe_context *_pipe,
1054 unsigned buffers,
1055 const float *rgba,
1056 double depth,
1057 unsigned stencil)
1058 {
1059 struct trace_context *tr_ctx = trace_context(_pipe);
1060 struct pipe_context *pipe = tr_ctx->pipe;
1061
1062 trace_dump_call_begin("pipe_context", "clear");
1063
1064 trace_dump_arg(ptr, pipe);
1065 trace_dump_arg(uint, buffers);
1066 if (rgba)
1067 trace_dump_arg_array(float, rgba, 4);
1068 else
1069 trace_dump_null();
1070 trace_dump_arg(float, depth);
1071 trace_dump_arg(uint, stencil);
1072
1073 pipe->clear(pipe, buffers, rgba, depth, stencil);
1074
1075 trace_dump_call_end();
1076 }
1077
1078
1079 static INLINE void
1080 trace_context_clear_render_target(struct pipe_context *_pipe,
1081 struct pipe_surface *dst,
1082 const float *rgba,
1083 unsigned dstx, unsigned dsty,
1084 unsigned width, unsigned height)
1085 {
1086 struct trace_context *tr_ctx = trace_context(_pipe);
1087 struct pipe_context *pipe = tr_ctx->pipe;
1088
1089 dst = trace_surface_unwrap(tr_ctx, dst);
1090
1091 trace_dump_call_begin("pipe_context", "clear_render_target");
1092
1093 trace_dump_arg(ptr, pipe);
1094 trace_dump_arg(ptr, dst);
1095 trace_dump_arg_array(float, rgba, 4);
1096 trace_dump_arg(uint, dstx);
1097 trace_dump_arg(uint, dsty);
1098 trace_dump_arg(uint, width);
1099 trace_dump_arg(uint, height);
1100
1101 pipe->clear_render_target(pipe, dst, rgba, dstx, dsty, width, height);
1102
1103 trace_dump_call_end();
1104 }
1105
1106 static INLINE void
1107 trace_context_clear_depth_stencil(struct pipe_context *_pipe,
1108 struct pipe_surface *dst,
1109 unsigned clear_flags,
1110 double depth,
1111 unsigned stencil,
1112 unsigned dstx, unsigned dsty,
1113 unsigned width, unsigned height)
1114 {
1115 struct trace_context *tr_ctx = trace_context(_pipe);
1116 struct pipe_context *pipe = tr_ctx->pipe;
1117
1118 dst = trace_surface_unwrap(tr_ctx, dst);
1119
1120 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1121
1122 trace_dump_arg(ptr, pipe);
1123 trace_dump_arg(ptr, dst);
1124 trace_dump_arg(uint, clear_flags);
1125 trace_dump_arg(float, depth);
1126 trace_dump_arg(uint, stencil);
1127 trace_dump_arg(uint, dstx);
1128 trace_dump_arg(uint, dsty);
1129 trace_dump_arg(uint, width);
1130 trace_dump_arg(uint, height);
1131
1132 pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1133 dstx, dsty, width, height);
1134
1135 trace_dump_call_end();
1136 }
1137
1138 static INLINE void
1139 trace_context_flush(struct pipe_context *_pipe,
1140 unsigned flags,
1141 struct pipe_fence_handle **fence)
1142 {
1143 struct trace_context *tr_ctx = trace_context(_pipe);
1144 struct pipe_context *pipe = tr_ctx->pipe;
1145
1146 trace_dump_call_begin("pipe_context", "flush");
1147
1148 trace_dump_arg(ptr, pipe);
1149 trace_dump_arg(uint, flags);
1150
1151 pipe->flush(pipe, flags, fence);
1152
1153 if(fence)
1154 trace_dump_ret(ptr, *fence);
1155
1156 trace_dump_call_end();
1157 }
1158
1159
1160 static INLINE void
1161 trace_context_destroy(struct pipe_context *_pipe)
1162 {
1163 struct trace_context *tr_ctx = trace_context(_pipe);
1164 struct pipe_context *pipe = tr_ctx->pipe;
1165
1166 trace_dump_call_begin("pipe_context", "destroy");
1167 trace_dump_arg(ptr, pipe);
1168 trace_dump_call_end();
1169
1170 pipe->destroy(pipe);
1171
1172 FREE(tr_ctx);
1173 }
1174
1175 static unsigned int
1176 trace_is_resource_referenced( struct pipe_context *_pipe,
1177 struct pipe_resource *_resource,
1178 unsigned face, unsigned level)
1179 {
1180 struct trace_context *tr_ctx = trace_context(_pipe);
1181 struct trace_resource *tr_tex = trace_resource(_resource);
1182 struct pipe_context *pipe = tr_ctx->pipe;
1183 struct pipe_resource *texture = tr_tex->resource;
1184 unsigned int referenced;
1185
1186 trace_dump_call_begin("pipe_context", "is_resource_referenced");
1187 trace_dump_arg(ptr, pipe);
1188 trace_dump_arg(ptr, texture);
1189 trace_dump_arg(uint, face);
1190 trace_dump_arg(uint, level);
1191
1192 referenced = pipe->is_resource_referenced(pipe, texture, face, level);
1193
1194 trace_dump_ret(uint, referenced);
1195 trace_dump_call_end();
1196
1197 return referenced;
1198 }
1199
1200
1201 /********************************************************************
1202 * transfer
1203 */
1204
1205
1206 static struct pipe_transfer *
1207 trace_context_get_transfer(struct pipe_context *_context,
1208 struct pipe_resource *_resource,
1209 struct pipe_subresource sr,
1210 unsigned usage,
1211 const struct pipe_box *box)
1212 {
1213 struct trace_context *tr_context = trace_context(_context);
1214 struct trace_resource *tr_tex = trace_resource(_resource);
1215 struct pipe_context *context = tr_context->pipe;
1216 struct pipe_resource *texture = tr_tex->resource;
1217 struct pipe_transfer *result = NULL;
1218
1219 assert(texture->screen == context->screen);
1220
1221 /*
1222 * Map and transfers can't be serialized so we convert all write transfers
1223 * to transfer_inline_write and ignore read transfers.
1224 */
1225
1226 result = context->get_transfer(context, texture, sr, usage, box);
1227
1228 if (result)
1229 result = trace_transfer_create(tr_context, tr_tex, result);
1230
1231 return result;
1232 }
1233
1234
1235 static void
1236 trace_context_transfer_destroy(struct pipe_context *_context,
1237 struct pipe_transfer *_transfer)
1238 {
1239 struct trace_context *tr_context = trace_context(_context);
1240 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1241
1242 trace_transfer_destroy(tr_context, tr_trans);
1243 }
1244
1245
1246 static void *
1247 trace_context_transfer_map(struct pipe_context *_context,
1248 struct pipe_transfer *_transfer)
1249 {
1250 struct trace_context *tr_context = trace_context(_context);
1251 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1252 struct pipe_context *context = tr_context->pipe;
1253 struct pipe_transfer *transfer = tr_trans->transfer;
1254 void *map;
1255
1256 map = context->transfer_map(context, transfer);
1257 if(map) {
1258 if(transfer->usage & PIPE_TRANSFER_WRITE) {
1259 assert(!tr_trans->map);
1260 tr_trans->map = map;
1261 }
1262 }
1263
1264 return map;
1265 }
1266
1267
1268 static void
1269 trace_context_transfer_flush_region( struct pipe_context *_context,
1270 struct pipe_transfer *_transfer,
1271 const struct pipe_box *box)
1272 {
1273 struct trace_context *tr_context = trace_context(_context);
1274 struct trace_transfer *tr_transfer = trace_transfer(_transfer);
1275 struct pipe_context *context = tr_context->pipe;
1276 struct pipe_transfer *transfer = tr_transfer->transfer;
1277
1278 context->transfer_flush_region(context,
1279 transfer,
1280 box);
1281 }
1282
1283 static void
1284 trace_context_transfer_unmap(struct pipe_context *_context,
1285 struct pipe_transfer *_transfer)
1286 {
1287 struct trace_context *tr_ctx = trace_context(_context);
1288 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1289 struct pipe_context *context = tr_ctx->pipe;
1290 struct pipe_transfer *transfer = tr_trans->transfer;
1291
1292 if(tr_trans->map) {
1293 /*
1294 * Fake a transfer_inline_write
1295 */
1296
1297 struct pipe_resource *resource = transfer->resource;
1298 struct pipe_subresource sr = transfer->sr;
1299 unsigned usage = transfer->usage;
1300 const struct pipe_box *box = &transfer->box;
1301 unsigned stride = transfer->stride;
1302 unsigned slice_stride = transfer->slice_stride;
1303
1304 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1305
1306 trace_dump_arg(ptr, context);
1307 trace_dump_arg(ptr, resource);
1308 trace_dump_arg_struct(subresource, sr);
1309 trace_dump_arg(uint, usage);
1310 trace_dump_arg(box, box);
1311
1312 trace_dump_arg_begin("data");
1313 trace_dump_box_bytes(tr_trans->map,
1314 resource->format,
1315 box,
1316 stride,
1317 slice_stride);
1318 trace_dump_arg_end();
1319
1320 trace_dump_arg(uint, stride);
1321 trace_dump_arg(uint, slice_stride);
1322
1323 trace_dump_call_end();
1324
1325 tr_trans->map = NULL;
1326 }
1327
1328 context->transfer_unmap(context, transfer);
1329 }
1330
1331
1332 static void
1333 trace_context_transfer_inline_write(struct pipe_context *_context,
1334 struct pipe_resource *_resource,
1335 struct pipe_subresource sr,
1336 unsigned usage,
1337 const struct pipe_box *box,
1338 const void *data,
1339 unsigned stride,
1340 unsigned slice_stride)
1341 {
1342 struct trace_context *tr_context = trace_context(_context);
1343 struct trace_resource *tr_tex = trace_resource(_resource);
1344 struct pipe_context *context = tr_context->pipe;
1345 struct pipe_resource *resource = tr_tex->resource;
1346
1347 assert(resource->screen == context->screen);
1348
1349 trace_dump_call_begin("pipe_context", "transfer_inline_write");
1350
1351 trace_dump_arg(ptr, context);
1352 trace_dump_arg(ptr, resource);
1353 trace_dump_arg_struct(subresource, sr);
1354 trace_dump_arg(uint, usage);
1355 trace_dump_arg(box, box);
1356
1357 trace_dump_arg_begin("data");
1358 trace_dump_box_bytes(data,
1359 resource->format,
1360 box,
1361 stride,
1362 slice_stride);
1363 trace_dump_arg_end();
1364
1365 trace_dump_arg(uint, stride);
1366 trace_dump_arg(uint, slice_stride);
1367
1368 trace_dump_call_end();
1369
1370 context->transfer_inline_write(context, resource,
1371 sr, usage, box, data, stride, slice_stride);
1372 }
1373
1374
1375
1376
1377 static const struct debug_named_value rbug_blocker_flags[] = {
1378 {"before", 1, NULL},
1379 {"after", 2, NULL},
1380 DEBUG_NAMED_VALUE_END
1381 };
1382
1383 struct pipe_context *
1384 trace_context_create(struct trace_screen *tr_scr,
1385 struct pipe_context *pipe)
1386 {
1387 struct trace_context *tr_ctx;
1388
1389 if(!pipe)
1390 goto error1;
1391
1392 if(!trace_enabled())
1393 goto error1;
1394
1395 tr_ctx = CALLOC_STRUCT(trace_context);
1396 if(!tr_ctx)
1397 goto error1;
1398
1399 tr_ctx->base.winsys = NULL;
1400 tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
1401 tr_ctx->base.screen = &tr_scr->base;
1402
1403 tr_ctx->base.destroy = trace_context_destroy;
1404 tr_ctx->base.draw_vbo = trace_context_draw_vbo;
1405 tr_ctx->base.create_query = trace_context_create_query;
1406 tr_ctx->base.destroy_query = trace_context_destroy_query;
1407 tr_ctx->base.begin_query = trace_context_begin_query;
1408 tr_ctx->base.end_query = trace_context_end_query;
1409 tr_ctx->base.get_query_result = trace_context_get_query_result;
1410 tr_ctx->base.create_blend_state = trace_context_create_blend_state;
1411 tr_ctx->base.bind_blend_state = trace_context_bind_blend_state;
1412 tr_ctx->base.delete_blend_state = trace_context_delete_blend_state;
1413 tr_ctx->base.create_sampler_state = trace_context_create_sampler_state;
1414 tr_ctx->base.bind_fragment_sampler_states = trace_context_bind_fragment_sampler_states;
1415 tr_ctx->base.bind_vertex_sampler_states = trace_context_bind_vertex_sampler_states;
1416 tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state;
1417 tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state;
1418 tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state;
1419 tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state;
1420 tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state;
1421 tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state;
1422 tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state;
1423 tr_ctx->base.create_fs_state = trace_context_create_fs_state;
1424 tr_ctx->base.bind_fs_state = trace_context_bind_fs_state;
1425 tr_ctx->base.delete_fs_state = trace_context_delete_fs_state;
1426 tr_ctx->base.create_vs_state = trace_context_create_vs_state;
1427 tr_ctx->base.bind_vs_state = trace_context_bind_vs_state;
1428 tr_ctx->base.delete_vs_state = trace_context_delete_vs_state;
1429 tr_ctx->base.create_vertex_elements_state = trace_context_create_vertex_elements_state;
1430 tr_ctx->base.bind_vertex_elements_state = trace_context_bind_vertex_elements_state;
1431 tr_ctx->base.delete_vertex_elements_state = trace_context_delete_vertex_elements_state;
1432 tr_ctx->base.set_blend_color = trace_context_set_blend_color;
1433 tr_ctx->base.set_stencil_ref = trace_context_set_stencil_ref;
1434 tr_ctx->base.set_clip_state = trace_context_set_clip_state;
1435 tr_ctx->base.set_sample_mask = trace_context_set_sample_mask;
1436 tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer;
1437 tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state;
1438 tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple;
1439 tr_ctx->base.set_scissor_state = trace_context_set_scissor_state;
1440 tr_ctx->base.set_viewport_state = trace_context_set_viewport_state;
1441 tr_ctx->base.set_fragment_sampler_views = trace_context_set_fragment_sampler_views;
1442 tr_ctx->base.set_vertex_sampler_views = trace_context_set_vertex_sampler_views;
1443 tr_ctx->base.create_sampler_view = trace_create_sampler_view;
1444 tr_ctx->base.sampler_view_destroy = trace_sampler_view_destroy;
1445 tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers;
1446 tr_ctx->base.set_index_buffer = trace_context_set_index_buffer;
1447 tr_ctx->base.resource_copy_region = trace_context_resource_copy_region;
1448 tr_ctx->base.clear = trace_context_clear;
1449 tr_ctx->base.clear_render_target = trace_context_clear_render_target;
1450 tr_ctx->base.clear_depth_stencil = trace_context_clear_depth_stencil;
1451 tr_ctx->base.flush = trace_context_flush;
1452 tr_ctx->base.is_resource_referenced = trace_is_resource_referenced;
1453
1454 tr_ctx->base.get_transfer = trace_context_get_transfer;
1455 tr_ctx->base.transfer_destroy = trace_context_transfer_destroy;
1456 tr_ctx->base.transfer_map = trace_context_transfer_map;
1457 tr_ctx->base.transfer_unmap = trace_context_transfer_unmap;
1458 tr_ctx->base.transfer_flush_region = trace_context_transfer_flush_region;
1459 tr_ctx->base.transfer_inline_write = trace_context_transfer_inline_write;
1460
1461 tr_ctx->pipe = pipe;
1462
1463 return &tr_ctx->base;
1464
1465 error1:
1466 return pipe;
1467 }