trace: Match pipe_context::clear prototype.
[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 "pipe/p_screen.h"
30
31 #include "tr_dump.h"
32 #include "tr_state.h"
33 #include "tr_buffer.h"
34 #include "tr_screen.h"
35 #include "tr_texture.h"
36 #include "tr_context.h"
37
38
39 static INLINE struct pipe_buffer *
40 trace_buffer_unwrap(struct trace_context *tr_ctx,
41 struct pipe_buffer *buffer)
42 {
43 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen);
44 struct trace_buffer *tr_buf;
45
46 if(!buffer)
47 return NULL;
48
49 tr_buf = trace_buffer(tr_scr, buffer);
50
51 assert(tr_buf->buffer);
52 assert(tr_buf->buffer->screen == tr_scr->screen);
53 return tr_buf->buffer;
54 }
55
56
57 static INLINE struct pipe_texture *
58 trace_texture_unwrap(struct trace_context *tr_ctx,
59 struct pipe_texture *texture)
60 {
61 struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen);
62 struct trace_texture *tr_tex;
63
64 if(!texture)
65 return NULL;
66
67 tr_tex = trace_texture(tr_scr, texture);
68
69 assert(tr_tex->texture);
70 assert(tr_tex->texture->screen == tr_scr->screen);
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_texture *tr_tex;
81 struct trace_surface *tr_surf;
82
83 if(!surface)
84 return NULL;
85
86 assert(surface->texture);
87 if(!surface->texture)
88 return surface;
89
90 tr_tex = trace_texture(tr_scr, surface->texture);
91 tr_surf = trace_surface(tr_tex, surface);
92
93 assert(tr_surf->surface);
94 assert(tr_surf->surface->texture->screen == tr_scr->screen);
95 return tr_surf->surface;
96 }
97
98
99 static INLINE void
100 trace_context_set_edgeflags(struct pipe_context *_pipe,
101 const unsigned *bitfield)
102 {
103 struct trace_context *tr_ctx = trace_context(_pipe);
104 struct pipe_context *pipe = tr_ctx->pipe;
105
106 trace_dump_call_begin("pipe_context", "set_edgeflags");
107
108 trace_dump_arg(ptr, pipe);
109 /* FIXME: we don't know how big this array is */
110 trace_dump_arg(ptr, bitfield);
111
112 pipe->set_edgeflags(pipe, bitfield);;
113
114 trace_dump_call_end();
115 }
116
117
118 static INLINE boolean
119 trace_context_draw_arrays(struct pipe_context *_pipe,
120 unsigned mode, unsigned start, unsigned count)
121 {
122 struct trace_context *tr_ctx = trace_context(_pipe);
123 struct pipe_context *pipe = tr_ctx->pipe;
124 boolean result;
125
126 trace_dump_call_begin("pipe_context", "draw_arrays");
127
128 trace_dump_arg(ptr, pipe);
129 trace_dump_arg(uint, mode);
130 trace_dump_arg(uint, start);
131 trace_dump_arg(uint, count);
132
133 result = pipe->draw_arrays(pipe, mode, start, count);;
134
135 trace_dump_ret(bool, result);
136
137 trace_dump_call_end();
138
139 return result;
140 }
141
142
143 static INLINE boolean
144 trace_context_draw_elements(struct pipe_context *_pipe,
145 struct pipe_buffer *_indexBuffer,
146 unsigned indexSize,
147 unsigned mode, unsigned start, unsigned count)
148 {
149 struct trace_screen *tr_scr = trace_screen(_pipe->screen);
150 struct trace_context *tr_ctx = trace_context(_pipe);
151 struct trace_buffer *tr_buf = trace_buffer(tr_scr, _indexBuffer);
152 struct pipe_context *pipe = tr_ctx->pipe;
153 struct pipe_buffer *indexBuffer = tr_buf->buffer;
154 boolean result;
155
156 trace_screen_user_buffer_update(_pipe->screen, indexBuffer);
157
158 trace_dump_call_begin("pipe_context", "draw_elements");
159
160 trace_dump_arg(ptr, pipe);
161 trace_dump_arg(ptr, indexBuffer);
162 trace_dump_arg(uint, indexSize);
163 trace_dump_arg(uint, mode);
164 trace_dump_arg(uint, start);
165 trace_dump_arg(uint, count);
166
167 result = pipe->draw_elements(pipe, indexBuffer, indexSize, mode, start, count);;
168
169 trace_dump_ret(bool, result);
170
171 trace_dump_call_end();
172
173 return result;
174 }
175
176
177 static INLINE boolean
178 trace_context_draw_range_elements(struct pipe_context *_pipe,
179 struct pipe_buffer *_indexBuffer,
180 unsigned indexSize,
181 unsigned minIndex,
182 unsigned maxIndex,
183 unsigned mode,
184 unsigned start,
185 unsigned count)
186 {
187 struct trace_screen *tr_scr = trace_screen(_pipe->screen);
188 struct trace_context *tr_ctx = trace_context(_pipe);
189 struct trace_buffer *tr_buf = trace_buffer(tr_scr, _indexBuffer);
190 struct pipe_context *pipe = tr_ctx->pipe;
191 struct pipe_buffer *indexBuffer = tr_buf->buffer;
192 boolean result;
193
194 trace_screen_user_buffer_update(_pipe->screen, indexBuffer);
195
196 trace_dump_call_begin("pipe_context", "draw_range_elements");
197
198 trace_dump_arg(ptr, pipe);
199 trace_dump_arg(ptr, indexBuffer);
200 trace_dump_arg(uint, indexSize);
201 trace_dump_arg(uint, minIndex);
202 trace_dump_arg(uint, maxIndex);
203 trace_dump_arg(uint, mode);
204 trace_dump_arg(uint, start);
205 trace_dump_arg(uint, count);
206
207 result = pipe->draw_range_elements(pipe,
208 indexBuffer,
209 indexSize, minIndex, maxIndex,
210 mode, start, count);
211
212 trace_dump_ret(bool, result);
213
214 trace_dump_call_end();
215
216 return result;
217 }
218
219
220 static INLINE struct pipe_query *
221 trace_context_create_query(struct pipe_context *_pipe,
222 unsigned query_type)
223 {
224 struct trace_context *tr_ctx = trace_context(_pipe);
225 struct pipe_context *pipe = tr_ctx->pipe;
226 struct pipe_query *result;
227
228 trace_dump_call_begin("pipe_context", "create_query");
229
230 trace_dump_arg(ptr, pipe);
231 trace_dump_arg(uint, query_type);
232
233 result = pipe->create_query(pipe, query_type);;
234
235 trace_dump_ret(ptr, result);
236
237 trace_dump_call_end();
238
239 return result;
240 }
241
242
243 static INLINE void
244 trace_context_destroy_query(struct pipe_context *_pipe,
245 struct pipe_query *query)
246 {
247 struct trace_context *tr_ctx = trace_context(_pipe);
248 struct pipe_context *pipe = tr_ctx->pipe;
249
250 trace_dump_call_begin("pipe_context", "destroy_query");
251
252 trace_dump_arg(ptr, pipe);
253 trace_dump_arg(ptr, query);
254
255 pipe->destroy_query(pipe, query);;
256
257 trace_dump_call_end();
258 }
259
260
261 static INLINE void
262 trace_context_begin_query(struct pipe_context *_pipe,
263 struct pipe_query *query)
264 {
265 struct trace_context *tr_ctx = trace_context(_pipe);
266 struct pipe_context *pipe = tr_ctx->pipe;
267
268 trace_dump_call_begin("pipe_context", "begin_query");
269
270 trace_dump_arg(ptr, pipe);
271 trace_dump_arg(ptr, query);
272
273 pipe->begin_query(pipe, query);;
274
275 trace_dump_call_end();
276 }
277
278
279 static INLINE void
280 trace_context_end_query(struct pipe_context *_pipe,
281 struct pipe_query *query)
282 {
283 struct trace_context *tr_ctx = trace_context(_pipe);
284 struct pipe_context *pipe = tr_ctx->pipe;
285
286 trace_dump_call_begin("pipe_context", "end_query");
287
288 trace_dump_arg(ptr, pipe);
289 trace_dump_arg(ptr, query);
290
291 pipe->end_query(pipe, query);
292
293 trace_dump_call_end();
294 }
295
296
297 static INLINE boolean
298 trace_context_get_query_result(struct pipe_context *_pipe,
299 struct pipe_query *query,
300 boolean wait,
301 uint64_t *presult)
302 {
303 struct trace_context *tr_ctx = trace_context(_pipe);
304 struct pipe_context *pipe = tr_ctx->pipe;
305 uint64_t result;
306 boolean _result;
307
308 trace_dump_call_begin("pipe_context", "get_query_result");
309
310 trace_dump_arg(ptr, pipe);
311
312 _result = pipe->get_query_result(pipe, query, wait, presult);;
313 result = *presult;
314
315 trace_dump_arg(uint, result);
316 trace_dump_ret(bool, _result);
317
318 trace_dump_call_end();
319
320 return _result;
321 }
322
323
324 static INLINE void *
325 trace_context_create_blend_state(struct pipe_context *_pipe,
326 const struct pipe_blend_state *state)
327 {
328 struct trace_context *tr_ctx = trace_context(_pipe);
329 struct pipe_context *pipe = tr_ctx->pipe;
330 void * result;
331
332 trace_dump_call_begin("pipe_context", "create_blend_state");
333
334 trace_dump_arg(ptr, pipe);
335 trace_dump_arg(blend_state, state);
336
337 result = pipe->create_blend_state(pipe, state);;
338
339 trace_dump_ret(ptr, result);
340
341 trace_dump_call_end();
342
343 return result;
344 }
345
346
347 static INLINE void
348 trace_context_bind_blend_state(struct pipe_context *_pipe,
349 void *state)
350 {
351 struct trace_context *tr_ctx = trace_context(_pipe);
352 struct pipe_context *pipe = tr_ctx->pipe;
353
354 trace_dump_call_begin("pipe_context", "bind_blend_state");
355
356 trace_dump_arg(ptr, pipe);
357 trace_dump_arg(ptr, state);
358
359 pipe->bind_blend_state(pipe, state);;
360
361 trace_dump_call_end();
362 }
363
364
365 static INLINE void
366 trace_context_delete_blend_state(struct pipe_context *_pipe,
367 void *state)
368 {
369 struct trace_context *tr_ctx = trace_context(_pipe);
370 struct pipe_context *pipe = tr_ctx->pipe;
371
372 trace_dump_call_begin("pipe_context", "delete_blend_state");
373
374 trace_dump_arg(ptr, pipe);
375 trace_dump_arg(ptr, state);
376
377 pipe->delete_blend_state(pipe, state);;
378
379 trace_dump_call_end();
380 }
381
382
383 static INLINE void *
384 trace_context_create_sampler_state(struct pipe_context *_pipe,
385 const struct pipe_sampler_state *state)
386 {
387 struct trace_context *tr_ctx = trace_context(_pipe);
388 struct pipe_context *pipe = tr_ctx->pipe;
389 void * result;
390
391 trace_dump_call_begin("pipe_context", "create_sampler_state");
392
393 trace_dump_arg(ptr, pipe);
394 trace_dump_arg(sampler_state, state);
395
396 result = pipe->create_sampler_state(pipe, state);;
397
398 trace_dump_ret(ptr, result);
399
400 trace_dump_call_end();
401
402 return result;
403 }
404
405
406 static INLINE void
407 trace_context_bind_sampler_states(struct pipe_context *_pipe,
408 unsigned num_states, void **states)
409 {
410 struct trace_context *tr_ctx = trace_context(_pipe);
411 struct pipe_context *pipe = tr_ctx->pipe;
412
413 trace_dump_call_begin("pipe_context", "bind_sampler_states");
414
415 trace_dump_arg(ptr, pipe);
416 trace_dump_arg(uint, num_states);
417 trace_dump_arg_array(ptr, states, num_states);
418
419 pipe->bind_sampler_states(pipe, num_states, states);;
420
421 trace_dump_call_end();
422 }
423
424
425 static INLINE void
426 trace_context_delete_sampler_state(struct pipe_context *_pipe,
427 void *state)
428 {
429 struct trace_context *tr_ctx = trace_context(_pipe);
430 struct pipe_context *pipe = tr_ctx->pipe;
431
432 trace_dump_call_begin("pipe_context", "delete_sampler_state");
433
434 trace_dump_arg(ptr, pipe);
435 trace_dump_arg(ptr, state);
436
437 pipe->delete_sampler_state(pipe, state);;
438
439 trace_dump_call_end();
440 }
441
442
443 static INLINE void *
444 trace_context_create_rasterizer_state(struct pipe_context *_pipe,
445 const struct pipe_rasterizer_state *state)
446 {
447 struct trace_context *tr_ctx = trace_context(_pipe);
448 struct pipe_context *pipe = tr_ctx->pipe;
449 void * result;
450
451 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
452
453 trace_dump_arg(ptr, pipe);
454 trace_dump_arg(rasterizer_state, state);
455
456 result = pipe->create_rasterizer_state(pipe, state);;
457
458 trace_dump_ret(ptr, result);
459
460 trace_dump_call_end();
461
462 return result;
463 }
464
465
466 static INLINE void
467 trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
468 void *state)
469 {
470 struct trace_context *tr_ctx = trace_context(_pipe);
471 struct pipe_context *pipe = tr_ctx->pipe;
472
473 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
474
475 trace_dump_arg(ptr, pipe);
476 trace_dump_arg(ptr, state);
477
478 pipe->bind_rasterizer_state(pipe, state);;
479
480 trace_dump_call_end();
481 }
482
483
484 static INLINE void
485 trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
486 void *state)
487 {
488 struct trace_context *tr_ctx = trace_context(_pipe);
489 struct pipe_context *pipe = tr_ctx->pipe;
490
491 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
492
493 trace_dump_arg(ptr, pipe);
494 trace_dump_arg(ptr, state);
495
496 pipe->delete_rasterizer_state(pipe, state);;
497
498 trace_dump_call_end();
499 }
500
501
502 static INLINE void *
503 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
504 const struct pipe_depth_stencil_alpha_state *state)
505 {
506 struct trace_context *tr_ctx = trace_context(_pipe);
507 struct pipe_context *pipe = tr_ctx->pipe;
508 void * result;
509
510 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
511
512 result = pipe->create_depth_stencil_alpha_state(pipe, state);;
513
514 trace_dump_arg(ptr, pipe);
515 trace_dump_arg(depth_stencil_alpha_state, state);
516
517 trace_dump_ret(ptr, result);
518
519 trace_dump_call_end();
520
521 return result;
522 }
523
524
525 static INLINE void
526 trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
527 void *state)
528 {
529 struct trace_context *tr_ctx = trace_context(_pipe);
530 struct pipe_context *pipe = tr_ctx->pipe;
531
532 trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
533
534 trace_dump_arg(ptr, pipe);
535 trace_dump_arg(ptr, state);
536
537 pipe->bind_depth_stencil_alpha_state(pipe, state);;
538
539 trace_dump_call_end();
540 }
541
542
543 static INLINE void
544 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
545 void *state)
546 {
547 struct trace_context *tr_ctx = trace_context(_pipe);
548 struct pipe_context *pipe = tr_ctx->pipe;
549
550 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
551
552 trace_dump_arg(ptr, pipe);
553 trace_dump_arg(ptr, state);
554
555 pipe->delete_depth_stencil_alpha_state(pipe, state);;
556
557 trace_dump_call_end();
558 }
559
560
561 static INLINE void *
562 trace_context_create_fs_state(struct pipe_context *_pipe,
563 const struct pipe_shader_state *state)
564 {
565 struct trace_context *tr_ctx = trace_context(_pipe);
566 struct pipe_context *pipe = tr_ctx->pipe;
567 void * result;
568
569 trace_dump_call_begin("pipe_context", "create_fs_state");
570
571 trace_dump_arg(ptr, pipe);
572 trace_dump_arg(shader_state, state);
573
574 result = pipe->create_fs_state(pipe, state);;
575
576 trace_dump_ret(ptr, result);
577
578 trace_dump_call_end();
579
580 return result;
581 }
582
583
584 static INLINE void
585 trace_context_bind_fs_state(struct pipe_context *_pipe,
586 void *state)
587 {
588 struct trace_context *tr_ctx = trace_context(_pipe);
589 struct pipe_context *pipe = tr_ctx->pipe;
590
591 trace_dump_call_begin("pipe_context", "bind_fs_state");
592
593 trace_dump_arg(ptr, pipe);
594 trace_dump_arg(ptr, state);
595
596 pipe->bind_fs_state(pipe, state);;
597
598 trace_dump_call_end();
599 }
600
601
602 static INLINE void
603 trace_context_delete_fs_state(struct pipe_context *_pipe,
604 void *state)
605 {
606 struct trace_context *tr_ctx = trace_context(_pipe);
607 struct pipe_context *pipe = tr_ctx->pipe;
608
609 trace_dump_call_begin("pipe_context", "delete_fs_state");
610
611 trace_dump_arg(ptr, pipe);
612 trace_dump_arg(ptr, state);
613
614 pipe->delete_fs_state(pipe, state);;
615
616 trace_dump_call_end();
617 }
618
619
620 static INLINE void *
621 trace_context_create_vs_state(struct pipe_context *_pipe,
622 const struct pipe_shader_state *state)
623 {
624 struct trace_context *tr_ctx = trace_context(_pipe);
625 struct pipe_context *pipe = tr_ctx->pipe;
626 void * result;
627
628 trace_dump_call_begin("pipe_context", "create_vs_state");
629
630 trace_dump_arg(ptr, pipe);
631 trace_dump_arg(shader_state, state);
632
633 result = pipe->create_vs_state(pipe, state);;
634
635 trace_dump_ret(ptr, result);
636
637 trace_dump_call_end();
638
639 return result;
640 }
641
642
643 static INLINE void
644 trace_context_bind_vs_state(struct pipe_context *_pipe,
645 void *state)
646 {
647 struct trace_context *tr_ctx = trace_context(_pipe);
648 struct pipe_context *pipe = tr_ctx->pipe;
649
650 trace_dump_call_begin("pipe_context", "bind_vs_state");
651
652 trace_dump_arg(ptr, pipe);
653 trace_dump_arg(ptr, state);
654
655 pipe->bind_vs_state(pipe, state);;
656
657 trace_dump_call_end();
658 }
659
660
661 static INLINE void
662 trace_context_delete_vs_state(struct pipe_context *_pipe,
663 void *state)
664 {
665 struct trace_context *tr_ctx = trace_context(_pipe);
666 struct pipe_context *pipe = tr_ctx->pipe;
667
668 trace_dump_call_begin("pipe_context", "delete_vs_state");
669
670 trace_dump_arg(ptr, pipe);
671 trace_dump_arg(ptr, state);
672
673 pipe->delete_vs_state(pipe, state);;
674
675 trace_dump_call_end();
676 }
677
678
679 static INLINE void
680 trace_context_set_blend_color(struct pipe_context *_pipe,
681 const struct pipe_blend_color *state)
682 {
683 struct trace_context *tr_ctx = trace_context(_pipe);
684 struct pipe_context *pipe = tr_ctx->pipe;
685
686 trace_dump_call_begin("pipe_context", "set_blend_color");
687
688 trace_dump_arg(ptr, pipe);
689 trace_dump_arg(blend_color, state);
690
691 pipe->set_blend_color(pipe, state);;
692
693 trace_dump_call_end();
694 }
695
696
697 static INLINE void
698 trace_context_set_clip_state(struct pipe_context *_pipe,
699 const struct pipe_clip_state *state)
700 {
701 struct trace_context *tr_ctx = trace_context(_pipe);
702 struct pipe_context *pipe = tr_ctx->pipe;
703
704 trace_dump_call_begin("pipe_context", "set_clip_state");
705
706 trace_dump_arg(ptr, pipe);
707 trace_dump_arg(clip_state, state);
708
709 pipe->set_clip_state(pipe, state);;
710
711 trace_dump_call_end();
712 }
713
714
715 static INLINE void
716 trace_context_set_constant_buffer(struct pipe_context *_pipe,
717 uint shader, uint index,
718 const struct pipe_constant_buffer *buffer)
719 {
720 struct trace_context *tr_ctx = trace_context(_pipe);
721 struct pipe_context *pipe = tr_ctx->pipe;
722
723 if (buffer)
724 trace_screen_user_buffer_update(_pipe->screen, buffer->buffer);
725
726 trace_dump_call_begin("pipe_context", "set_constant_buffer");
727
728 trace_dump_arg(ptr, pipe);
729 trace_dump_arg(uint, shader);
730 trace_dump_arg(uint, index);
731 trace_dump_arg(constant_buffer, buffer);
732
733 if (buffer) {
734 struct pipe_constant_buffer _buffer;
735 _buffer.buffer = trace_buffer_unwrap(tr_ctx, buffer->buffer);
736 pipe->set_constant_buffer(pipe, shader, index, &_buffer);
737 } else {
738 pipe->set_constant_buffer(pipe, shader, index, buffer);
739 }
740
741 trace_dump_call_end();
742 }
743
744
745 static INLINE void
746 trace_context_set_framebuffer_state(struct pipe_context *_pipe,
747 const struct pipe_framebuffer_state *state)
748 {
749 struct trace_context *tr_ctx = trace_context(_pipe);
750 struct pipe_context *pipe = tr_ctx->pipe;
751 struct pipe_framebuffer_state unwrapped_state;
752 unsigned i;
753
754 /* Unwrap the input state */
755 memcpy(&unwrapped_state, state, sizeof(unwrapped_state));
756 for(i = 0; i < state->nr_cbufs; ++i)
757 unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
758 for(i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
759 unwrapped_state.cbufs[i] = NULL;
760 unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
761 state = &unwrapped_state;
762
763 trace_dump_call_begin("pipe_context", "set_framebuffer_state");
764
765 trace_dump_arg(ptr, pipe);
766 trace_dump_arg(framebuffer_state, state);
767
768 pipe->set_framebuffer_state(pipe, state);;
769
770 trace_dump_call_end();
771 }
772
773
774 static INLINE void
775 trace_context_set_polygon_stipple(struct pipe_context *_pipe,
776 const struct pipe_poly_stipple *state)
777 {
778 struct trace_context *tr_ctx = trace_context(_pipe);
779 struct pipe_context *pipe = tr_ctx->pipe;
780
781 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
782
783 trace_dump_arg(ptr, pipe);
784 trace_dump_arg(poly_stipple, state);
785
786 pipe->set_polygon_stipple(pipe, state);;
787
788 trace_dump_call_end();
789 }
790
791
792 static INLINE void
793 trace_context_set_scissor_state(struct pipe_context *_pipe,
794 const struct pipe_scissor_state *state)
795 {
796 struct trace_context *tr_ctx = trace_context(_pipe);
797 struct pipe_context *pipe = tr_ctx->pipe;
798
799 trace_dump_call_begin("pipe_context", "set_scissor_state");
800
801 trace_dump_arg(ptr, pipe);
802 trace_dump_arg(scissor_state, state);
803
804 pipe->set_scissor_state(pipe, state);;
805
806 trace_dump_call_end();
807 }
808
809
810 static INLINE void
811 trace_context_set_viewport_state(struct pipe_context *_pipe,
812 const struct pipe_viewport_state *state)
813 {
814 struct trace_context *tr_ctx = trace_context(_pipe);
815 struct pipe_context *pipe = tr_ctx->pipe;
816
817 trace_dump_call_begin("pipe_context", "set_viewport_state");
818
819 trace_dump_arg(ptr, pipe);
820 trace_dump_arg(viewport_state, state);
821
822 pipe->set_viewport_state(pipe, state);;
823
824 trace_dump_call_end();
825 }
826
827
828 static INLINE void
829 trace_context_set_sampler_textures(struct pipe_context *_pipe,
830 unsigned num_textures,
831 struct pipe_texture **textures)
832 {
833 struct trace_context *tr_ctx = trace_context(_pipe);
834 struct pipe_context *pipe = tr_ctx->pipe;
835 struct pipe_texture *unwrapped_textures[PIPE_MAX_SAMPLERS];
836 unsigned i;
837
838 for(i = 0; i < num_textures; ++i)
839 unwrapped_textures[i] = trace_texture_unwrap(tr_ctx, textures[i]);
840 textures = unwrapped_textures;
841
842 trace_dump_call_begin("pipe_context", "set_sampler_textures");
843
844 trace_dump_arg(ptr, pipe);
845 trace_dump_arg(uint, num_textures);
846 trace_dump_arg_array(ptr, textures, num_textures);
847
848 pipe->set_sampler_textures(pipe, num_textures, textures);;
849
850 trace_dump_call_end();
851 }
852
853
854 static INLINE void
855 trace_context_set_vertex_buffers(struct pipe_context *_pipe,
856 unsigned num_buffers,
857 const struct pipe_vertex_buffer *buffers)
858 {
859 struct trace_context *tr_ctx = trace_context(_pipe);
860 struct pipe_context *pipe = tr_ctx->pipe;
861 unsigned i;
862
863 for(i = 0; i < num_buffers; ++i)
864 trace_screen_user_buffer_update(_pipe->screen, buffers[i].buffer);
865
866 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
867
868 trace_dump_arg(ptr, pipe);
869 trace_dump_arg(uint, num_buffers);
870
871 trace_dump_arg_begin("buffers");
872 trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
873 trace_dump_arg_end();
874
875 if (num_buffers) {
876 struct pipe_vertex_buffer *_buffers = malloc(num_buffers * sizeof(*_buffers));
877 memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers));
878 for (i = 0; i < num_buffers; i++)
879 _buffers[i].buffer = trace_buffer_unwrap(tr_ctx, buffers[i].buffer);
880 pipe->set_vertex_buffers(pipe, num_buffers, _buffers);
881 free(_buffers);
882 } else {
883 pipe->set_vertex_buffers(pipe, num_buffers, NULL);
884 }
885
886 trace_dump_call_end();
887 }
888
889
890 static INLINE void
891 trace_context_set_vertex_elements(struct pipe_context *_pipe,
892 unsigned num_elements,
893 const struct pipe_vertex_element *elements)
894 {
895 struct trace_context *tr_ctx = trace_context(_pipe);
896 struct pipe_context *pipe = tr_ctx->pipe;
897
898 trace_dump_call_begin("pipe_context", "set_vertex_elements");
899
900 trace_dump_arg(ptr, pipe);
901 trace_dump_arg(uint, num_elements);
902
903 trace_dump_arg_begin("elements");
904 trace_dump_struct_array(vertex_element, elements, num_elements);
905 trace_dump_arg_end();
906
907 pipe->set_vertex_elements(pipe, num_elements, elements);;
908
909 trace_dump_call_end();
910 }
911
912
913 static INLINE void
914 trace_context_surface_copy(struct pipe_context *_pipe,
915 struct pipe_surface *dest,
916 unsigned destx, unsigned desty,
917 struct pipe_surface *src,
918 unsigned srcx, unsigned srcy,
919 unsigned width, unsigned height)
920 {
921 struct trace_context *tr_ctx = trace_context(_pipe);
922 struct pipe_context *pipe = tr_ctx->pipe;
923
924 dest = trace_surface_unwrap(tr_ctx, dest);
925 src = trace_surface_unwrap(tr_ctx, src);
926
927 trace_dump_call_begin("pipe_context", "surface_copy");
928
929 trace_dump_arg(ptr, pipe);
930 trace_dump_arg(ptr, dest);
931 trace_dump_arg(uint, destx);
932 trace_dump_arg(uint, desty);
933 trace_dump_arg(ptr, src);
934 trace_dump_arg(uint, srcx);
935 trace_dump_arg(uint, srcy);
936 trace_dump_arg(uint, width);
937 trace_dump_arg(uint, height);
938
939 pipe->surface_copy(pipe,
940 dest, destx, desty,
941 src, srcx, srcy, width, height);
942
943 trace_dump_call_end();
944 }
945
946
947 static INLINE void
948 trace_context_surface_fill(struct pipe_context *_pipe,
949 struct pipe_surface *dst,
950 unsigned dstx, unsigned dsty,
951 unsigned width, unsigned height,
952 unsigned value)
953 {
954 struct trace_context *tr_ctx = trace_context(_pipe);
955 struct pipe_context *pipe = tr_ctx->pipe;
956
957 dst = trace_surface_unwrap(tr_ctx, dst);
958
959 trace_dump_call_begin("pipe_context", "surface_fill");
960
961 trace_dump_arg(ptr, pipe);
962 trace_dump_arg(ptr, dst);
963 trace_dump_arg(uint, dstx);
964 trace_dump_arg(uint, dsty);
965 trace_dump_arg(uint, width);
966 trace_dump_arg(uint, height);
967
968 pipe->surface_fill(pipe, dst, dstx, dsty, width, height, value);;
969
970 trace_dump_call_end();
971 }
972
973
974 static INLINE void
975 trace_context_clear(struct pipe_context *_pipe,
976 unsigned buffers,
977 const float *rgba,
978 double depth,
979 unsigned stencil)
980 {
981 struct trace_context *tr_ctx = trace_context(_pipe);
982 struct pipe_context *pipe = tr_ctx->pipe;
983
984 trace_dump_call_begin("pipe_context", "clear");
985
986 trace_dump_arg(ptr, pipe);
987 trace_dump_arg(uint, buffers);
988 trace_dump_arg_array(float, rgba, 4);
989 trace_dump_arg(float, depth);
990 trace_dump_arg(uint, stencil);
991
992 pipe->clear(pipe, buffers, rgba, depth, stencil);
993
994 trace_dump_call_end();
995 }
996
997
998 static INLINE void
999 trace_context_flush(struct pipe_context *_pipe,
1000 unsigned flags,
1001 struct pipe_fence_handle **fence)
1002 {
1003 struct trace_context *tr_ctx = trace_context(_pipe);
1004 struct pipe_context *pipe = tr_ctx->pipe;
1005
1006 trace_dump_call_begin("pipe_context", "flush");
1007
1008 trace_dump_arg(ptr, pipe);
1009 trace_dump_arg(uint, flags);
1010
1011 pipe->flush(pipe, flags, fence);;
1012
1013 if(fence)
1014 trace_dump_ret(ptr, *fence);
1015
1016 trace_dump_call_end();
1017 }
1018
1019
1020 static INLINE void
1021 trace_context_destroy(struct pipe_context *_pipe)
1022 {
1023 struct trace_context *tr_ctx = trace_context(_pipe);
1024 struct pipe_context *pipe = tr_ctx->pipe;
1025
1026 trace_dump_call_begin("pipe_context", "destroy");
1027
1028 trace_dump_arg(ptr, pipe);
1029
1030 pipe->destroy(pipe);
1031
1032 trace_dump_call_end();
1033
1034 FREE(tr_ctx);
1035 }
1036
1037
1038 struct pipe_context *
1039 trace_context_create(struct pipe_screen *_screen,
1040 struct pipe_context *pipe)
1041 {
1042 struct trace_screen *tr_scr;
1043 struct trace_context *tr_ctx;
1044 struct pipe_screen *screen;
1045
1046 if(!pipe)
1047 goto error1;
1048
1049 if(!trace_dump_enabled())
1050 goto error1;
1051
1052 tr_scr = trace_screen(_screen);
1053 screen = tr_scr->screen;
1054
1055 tr_ctx = CALLOC_STRUCT(trace_context);
1056 if(!tr_ctx)
1057 goto error1;
1058
1059 tr_ctx->base.winsys = _screen->winsys;
1060 tr_ctx->base.screen = _screen;
1061 tr_ctx->base.destroy = trace_context_destroy;
1062 tr_ctx->base.set_edgeflags = trace_context_set_edgeflags;
1063 tr_ctx->base.draw_arrays = trace_context_draw_arrays;
1064 tr_ctx->base.draw_elements = trace_context_draw_elements;
1065 tr_ctx->base.draw_range_elements = trace_context_draw_range_elements;
1066 tr_ctx->base.create_query = trace_context_create_query;
1067 tr_ctx->base.destroy_query = trace_context_destroy_query;
1068 tr_ctx->base.begin_query = trace_context_begin_query;
1069 tr_ctx->base.end_query = trace_context_end_query;
1070 tr_ctx->base.get_query_result = trace_context_get_query_result;
1071 tr_ctx->base.create_blend_state = trace_context_create_blend_state;
1072 tr_ctx->base.bind_blend_state = trace_context_bind_blend_state;
1073 tr_ctx->base.delete_blend_state = trace_context_delete_blend_state;
1074 tr_ctx->base.create_sampler_state = trace_context_create_sampler_state;
1075 tr_ctx->base.bind_sampler_states = trace_context_bind_sampler_states;
1076 tr_ctx->base.delete_sampler_state = trace_context_delete_sampler_state;
1077 tr_ctx->base.create_rasterizer_state = trace_context_create_rasterizer_state;
1078 tr_ctx->base.bind_rasterizer_state = trace_context_bind_rasterizer_state;
1079 tr_ctx->base.delete_rasterizer_state = trace_context_delete_rasterizer_state;
1080 tr_ctx->base.create_depth_stencil_alpha_state = trace_context_create_depth_stencil_alpha_state;
1081 tr_ctx->base.bind_depth_stencil_alpha_state = trace_context_bind_depth_stencil_alpha_state;
1082 tr_ctx->base.delete_depth_stencil_alpha_state = trace_context_delete_depth_stencil_alpha_state;
1083 tr_ctx->base.create_fs_state = trace_context_create_fs_state;
1084 tr_ctx->base.bind_fs_state = trace_context_bind_fs_state;
1085 tr_ctx->base.delete_fs_state = trace_context_delete_fs_state;
1086 tr_ctx->base.create_vs_state = trace_context_create_vs_state;
1087 tr_ctx->base.bind_vs_state = trace_context_bind_vs_state;
1088 tr_ctx->base.delete_vs_state = trace_context_delete_vs_state;
1089 tr_ctx->base.set_blend_color = trace_context_set_blend_color;
1090 tr_ctx->base.set_clip_state = trace_context_set_clip_state;
1091 tr_ctx->base.set_constant_buffer = trace_context_set_constant_buffer;
1092 tr_ctx->base.set_framebuffer_state = trace_context_set_framebuffer_state;
1093 tr_ctx->base.set_polygon_stipple = trace_context_set_polygon_stipple;
1094 tr_ctx->base.set_scissor_state = trace_context_set_scissor_state;
1095 tr_ctx->base.set_viewport_state = trace_context_set_viewport_state;
1096 tr_ctx->base.set_sampler_textures = trace_context_set_sampler_textures;
1097 tr_ctx->base.set_vertex_buffers = trace_context_set_vertex_buffers;
1098 tr_ctx->base.set_vertex_elements = trace_context_set_vertex_elements;
1099 tr_ctx->base.surface_copy = trace_context_surface_copy;
1100 tr_ctx->base.surface_fill = trace_context_surface_fill;
1101 tr_ctx->base.clear = trace_context_clear;
1102 tr_ctx->base.flush = trace_context_flush;
1103
1104 tr_ctx->pipe = pipe;
1105
1106 trace_dump_call_begin("", "pipe_context_create");
1107 trace_dump_arg(ptr, screen);
1108 trace_dump_ret(ptr, pipe);
1109 trace_dump_call_end();
1110
1111 return &tr_ctx->base;
1112
1113 error1:
1114 return pipe;
1115 }