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