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