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