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