1 /**************************************************************************
2 *
3 * Copyright 2008 VMware, Inc.
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 VMWARE 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/ralloc.h"
29 #include "util/u_inlines.h"
30 #include "util/u_memory.h"
31 #include "util/u_framebuffer.h"
32
33 #include "pipe/p_format.h"
34 #include "pipe/p_screen.h"
35
36 #include "tr_dump.h"
37 #include "tr_dump_defines.h"
38 #include "tr_dump_state.h"
39 #include "tr_public.h"
40 #include "tr_screen.h"
41 #include "tr_texture.h"
42 #include "tr_context.h"
43 #include "tr_util.h"
44
45
46 struct trace_query
47 {
48 struct threaded_query base;
49 unsigned type;
50 unsigned index;
51
52 struct pipe_query *query;
53 };
54
55
56 static inline struct trace_query *
trace_query(struct pipe_query * query)57 trace_query(struct pipe_query *query)
58 {
59 return (struct trace_query *)query;
60 }
61
62
63 static inline struct pipe_query *
trace_query_unwrap(struct pipe_query * query)64 trace_query_unwrap(struct pipe_query *query)
65 {
66 if (query) {
67 return trace_query(query)->query;
68 } else {
69 return NULL;
70 }
71 }
72
73
74 static inline struct pipe_surface *
trace_surface_unwrap(struct trace_context * tr_ctx,struct pipe_surface * surface)75 trace_surface_unwrap(struct trace_context *tr_ctx,
76 struct pipe_surface *surface)
77 {
78 struct trace_surface *tr_surf;
79
80 if (!surface)
81 return NULL;
82
83 assert(surface->texture);
84 if (!surface->texture)
85 return surface;
86
87 tr_surf = trace_surface(surface);
88
89 assert(tr_surf->surface);
90 return tr_surf->surface;
91 }
92
93 static void
dump_fb_state(struct trace_context * tr_ctx,const char * method,bool deep)94 dump_fb_state(struct trace_context *tr_ctx,
95 const char *method,
96 bool deep)
97 {
98 struct pipe_context *pipe = tr_ctx->pipe;
99 struct pipe_framebuffer_state *state = &tr_ctx->unwrapped_state;
100
101 trace_dump_call_begin("pipe_context", method);
102
103 trace_dump_arg(ptr, pipe);
104 if (deep)
105 trace_dump_arg(framebuffer_state_deep, state);
106 else
107 trace_dump_arg(framebuffer_state, state);
108 trace_dump_call_end();
109
110 tr_ctx->seen_fb_state = true;
111 }
112
113 static void
trace_context_draw_vbo(struct pipe_context * _pipe,const struct pipe_draw_info * info,unsigned drawid_offset,const struct pipe_draw_indirect_info * indirect,const struct pipe_draw_start_count_bias * draws,unsigned num_draws)114 trace_context_draw_vbo(struct pipe_context *_pipe,
115 const struct pipe_draw_info *info,
116 unsigned drawid_offset,
117 const struct pipe_draw_indirect_info *indirect,
118 const struct pipe_draw_start_count_bias *draws,
119 unsigned num_draws)
120 {
121 struct trace_context *tr_ctx = trace_context(_pipe);
122 struct pipe_context *pipe = tr_ctx->pipe;
123
124 if (!tr_ctx->seen_fb_state && trace_dump_is_triggered())
125 dump_fb_state(tr_ctx, "current_framebuffer_state", true);
126
127 trace_dump_call_begin("pipe_context", "draw_vbo");
128
129 trace_dump_arg(ptr, pipe);
130 trace_dump_arg(draw_info, info);
131 trace_dump_arg(int, drawid_offset);
132 trace_dump_arg(draw_indirect_info, indirect);
133 trace_dump_arg_begin("draws");
134 trace_dump_struct_array(draw_start_count, draws, num_draws);
135 trace_dump_arg_end();
136 trace_dump_arg(uint, num_draws);
137
138 trace_dump_trace_flush();
139
140 pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);
141
142 trace_dump_call_end();
143 }
144
145
146 static void
trace_context_draw_vertex_state(struct pipe_context * _pipe,struct pipe_vertex_state * state,uint32_t partial_velem_mask,struct pipe_draw_vertex_state_info info,const struct pipe_draw_start_count_bias * draws,unsigned num_draws)147 trace_context_draw_vertex_state(struct pipe_context *_pipe,
148 struct pipe_vertex_state *state,
149 uint32_t partial_velem_mask,
150 struct pipe_draw_vertex_state_info info,
151 const struct pipe_draw_start_count_bias *draws,
152 unsigned num_draws)
153 {
154 struct trace_context *tr_ctx = trace_context(_pipe);
155 struct pipe_context *pipe = tr_ctx->pipe;
156
157 if (!tr_ctx->seen_fb_state && trace_dump_is_triggered())
158 dump_fb_state(tr_ctx, "current_framebuffer_state", true);
159
160 trace_dump_call_begin("pipe_context", "draw_vertex_state");
161
162 trace_dump_arg(ptr, pipe);
163 trace_dump_arg(ptr, state);
164 trace_dump_arg(uint, partial_velem_mask);
165 trace_dump_arg(draw_vertex_state_info, info);
166 trace_dump_arg_begin("draws");
167 trace_dump_struct_array(draw_start_count, draws, num_draws);
168 trace_dump_arg_end();
169 trace_dump_arg(uint, num_draws);
170
171 trace_dump_trace_flush();
172
173 pipe->draw_vertex_state(pipe, state, partial_velem_mask, info, draws,
174 num_draws);
175 trace_dump_call_end();
176 }
177
178
179 static struct pipe_query *
trace_context_create_query(struct pipe_context * _pipe,unsigned query_type,unsigned index)180 trace_context_create_query(struct pipe_context *_pipe,
181 unsigned query_type,
182 unsigned index)
183 {
184 struct trace_context *tr_ctx = trace_context(_pipe);
185 struct pipe_context *pipe = tr_ctx->pipe;
186 struct pipe_query *query;
187
188 trace_dump_call_begin("pipe_context", "create_query");
189
190 trace_dump_arg(ptr, pipe);
191 trace_dump_arg(query_type, query_type);
192 trace_dump_arg(int, index);
193
194 query = pipe->create_query(pipe, query_type, index);
195
196 trace_dump_ret(ptr, query);
197
198 trace_dump_call_end();
199
200 /* Wrap query object. */
201 if (query) {
202 struct trace_query *tr_query = CALLOC_STRUCT(trace_query);
203 if (tr_query) {
204 tr_query->type = query_type;
205 tr_query->query = query;
206 tr_query->index = index;
207 query = (struct pipe_query *)tr_query;
208 } else {
209 pipe->destroy_query(pipe, query);
210 query = NULL;
211 }
212 }
213
214 return query;
215 }
216
217
218 static void
trace_context_destroy_query(struct pipe_context * _pipe,struct pipe_query * _query)219 trace_context_destroy_query(struct pipe_context *_pipe,
220 struct pipe_query *_query)
221 {
222 struct trace_context *tr_ctx = trace_context(_pipe);
223 struct pipe_context *pipe = tr_ctx->pipe;
224 struct trace_query *tr_query = trace_query(_query);
225 struct pipe_query *query = tr_query->query;
226
227 FREE(tr_query);
228
229 trace_dump_call_begin("pipe_context", "destroy_query");
230
231 trace_dump_arg(ptr, pipe);
232 trace_dump_arg(ptr, query);
233
234 pipe->destroy_query(pipe, query);
235
236 trace_dump_call_end();
237 }
238
239
240 static bool
trace_context_begin_query(struct pipe_context * _pipe,struct pipe_query * query)241 trace_context_begin_query(struct pipe_context *_pipe,
242 struct pipe_query *query)
243 {
244 struct trace_context *tr_ctx = trace_context(_pipe);
245 struct pipe_context *pipe = tr_ctx->pipe;
246 bool ret;
247
248 query = trace_query_unwrap(query);
249
250 trace_dump_call_begin("pipe_context", "begin_query");
251
252 trace_dump_arg(ptr, pipe);
253 trace_dump_arg(ptr, query);
254
255 ret = pipe->begin_query(pipe, query);
256
257 trace_dump_call_end();
258 return ret;
259 }
260
261
262 static bool
trace_context_end_query(struct pipe_context * _pipe,struct pipe_query * _query)263 trace_context_end_query(struct pipe_context *_pipe,
264 struct pipe_query *_query)
265 {
266 struct trace_context *tr_ctx = trace_context(_pipe);
267 struct pipe_context *pipe = tr_ctx->pipe;
268 bool ret;
269
270 struct pipe_query *query = trace_query_unwrap(_query);
271
272 trace_dump_call_begin("pipe_context", "end_query");
273
274 trace_dump_arg(ptr, pipe);
275 trace_dump_arg(ptr, query);
276
277 if (tr_ctx->threaded)
278 threaded_query(query)->flushed = trace_query(_query)->base.flushed;
279 ret = pipe->end_query(pipe, query);
280
281 trace_dump_call_end();
282 return ret;
283 }
284
285
286 static bool
trace_context_get_query_result(struct pipe_context * _pipe,struct pipe_query * _query,bool wait,union pipe_query_result * result)287 trace_context_get_query_result(struct pipe_context *_pipe,
288 struct pipe_query *_query,
289 bool wait,
290 union pipe_query_result *result)
291 {
292 struct trace_context *tr_ctx = trace_context(_pipe);
293 struct pipe_context *pipe = tr_ctx->pipe;
294 struct trace_query *tr_query = trace_query(_query);
295 struct pipe_query *query = tr_query->query;
296 bool ret;
297
298 trace_dump_call_begin("pipe_context", "get_query_result");
299
300 trace_dump_arg(ptr, pipe);
301 trace_dump_arg(ptr, query);
302 trace_dump_arg(bool, wait);
303
304 if (tr_ctx->threaded)
305 threaded_query(query)->flushed = trace_query(_query)->base.flushed;
306
307 ret = pipe->get_query_result(pipe, query, wait, result);
308
309 trace_dump_arg_begin("result");
310 if (ret) {
311 trace_dump_query_result(tr_query->type, tr_query->index, result);
312 } else {
313 trace_dump_null();
314 }
315 trace_dump_arg_end();
316
317 trace_dump_ret(bool, ret);
318
319 trace_dump_call_end();
320
321 return ret;
322 }
323
324 static void
trace_context_get_query_result_resource(struct pipe_context * _pipe,struct pipe_query * _query,enum pipe_query_flags flags,enum pipe_query_value_type result_type,int index,struct pipe_resource * resource,unsigned offset)325 trace_context_get_query_result_resource(struct pipe_context *_pipe,
326 struct pipe_query *_query,
327 enum pipe_query_flags flags,
328 enum pipe_query_value_type result_type,
329 int index,
330 struct pipe_resource *resource,
331 unsigned offset)
332 {
333 struct trace_context *tr_ctx = trace_context(_pipe);
334 struct pipe_context *pipe = tr_ctx->pipe;
335 struct trace_query *tr_query = trace_query(_query);
336 struct pipe_query *query = tr_query->query;
337
338 trace_dump_call_begin("pipe_context", "get_query_result_resource");
339
340 trace_dump_arg(ptr, pipe);
341 trace_dump_arg(ptr, query);
342 trace_dump_arg(query_flags, flags);
343 trace_dump_arg(uint, result_type);
344 trace_dump_arg(uint, index);
345 trace_dump_arg(ptr, resource);
346 trace_dump_arg(uint, offset);
347
348 if (tr_ctx->threaded)
349 threaded_query(query)->flushed = tr_query->base.flushed;
350
351 trace_dump_call_end();
352
353 pipe->get_query_result_resource(pipe, query, flags, result_type, index, resource, offset);
354 }
355
356
357 static void
trace_context_set_active_query_state(struct pipe_context * _pipe,bool enable)358 trace_context_set_active_query_state(struct pipe_context *_pipe,
359 bool enable)
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", "set_active_query_state");
365
366 trace_dump_arg(ptr, pipe);
367 trace_dump_arg(bool, enable);
368
369 pipe->set_active_query_state(pipe, enable);
370
371 trace_dump_call_end();
372 }
373
374
375 static void *
trace_context_create_blend_state(struct pipe_context * _pipe,const struct pipe_blend_state * state)376 trace_context_create_blend_state(struct pipe_context *_pipe,
377 const struct pipe_blend_state *state)
378 {
379 struct trace_context *tr_ctx = trace_context(_pipe);
380 struct pipe_context *pipe = tr_ctx->pipe;
381 void * result;
382
383 trace_dump_call_begin("pipe_context", "create_blend_state");
384
385 trace_dump_arg(ptr, pipe);
386 trace_dump_arg(blend_state, state);
387
388 result = pipe->create_blend_state(pipe, state);
389
390 trace_dump_ret(ptr, result);
391
392 trace_dump_call_end();
393
394 struct pipe_blend_state *blend = ralloc(tr_ctx, struct pipe_blend_state);
395 if (blend) {
396 memcpy(blend, state, sizeof(struct pipe_blend_state));
397 _mesa_hash_table_insert(&tr_ctx->blend_states, result, blend);
398 }
399
400 return result;
401 }
402
403
404 static void
trace_context_bind_blend_state(struct pipe_context * _pipe,void * state)405 trace_context_bind_blend_state(struct pipe_context *_pipe,
406 void *state)
407 {
408 struct trace_context *tr_ctx = trace_context(_pipe);
409 struct pipe_context *pipe = tr_ctx->pipe;
410
411 trace_dump_call_begin("pipe_context", "bind_blend_state");
412
413 trace_dump_arg(ptr, pipe);
414 if (state && trace_dump_is_triggered()) {
415 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
416 if (he)
417 trace_dump_arg(blend_state, he->data);
418 else
419 trace_dump_arg(blend_state, NULL);
420 } else
421 trace_dump_arg(ptr, state);
422
423 pipe->bind_blend_state(pipe, state);
424
425 trace_dump_call_end();
426 }
427
428
429 static void
trace_context_delete_blend_state(struct pipe_context * _pipe,void * state)430 trace_context_delete_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", "delete_blend_state");
437
438 trace_dump_arg(ptr, pipe);
439 trace_dump_arg(ptr, state);
440
441 pipe->delete_blend_state(pipe, state);
442
443 if (state) {
444 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);
445 if (he) {
446 ralloc_free(he->data);
447 _mesa_hash_table_remove(&tr_ctx->blend_states, he);
448 }
449 }
450
451 trace_dump_call_end();
452 }
453
454
455 static void *
trace_context_create_sampler_state(struct pipe_context * _pipe,const struct pipe_sampler_state * state)456 trace_context_create_sampler_state(struct pipe_context *_pipe,
457 const struct pipe_sampler_state *state)
458 {
459 struct trace_context *tr_ctx = trace_context(_pipe);
460 struct pipe_context *pipe = tr_ctx->pipe;
461 void * result;
462
463 trace_dump_call_begin("pipe_context", "create_sampler_state");
464
465 trace_dump_arg(ptr, pipe);
466 trace_dump_arg(sampler_state, state);
467
468 result = pipe->create_sampler_state(pipe, state);
469
470 trace_dump_ret(ptr, result);
471
472 trace_dump_call_end();
473
474 return result;
475 }
476
477
478 static void
trace_context_bind_sampler_states(struct pipe_context * _pipe,enum pipe_shader_type shader,unsigned start,unsigned num_states,void ** states)479 trace_context_bind_sampler_states(struct pipe_context *_pipe,
480 enum pipe_shader_type shader,
481 unsigned start,
482 unsigned num_states,
483 void **states)
484 {
485 struct trace_context *tr_ctx = trace_context(_pipe);
486 struct pipe_context *pipe = tr_ctx->pipe;
487
488 /* remove this when we have pipe->bind_sampler_states(..., start, ...) */
489 assert(start == 0);
490
491 trace_dump_call_begin("pipe_context", "bind_sampler_states");
492
493 trace_dump_arg(ptr, pipe);
494 trace_dump_arg_enum(shader, tr_util_pipe_shader_type_name(shader));
495 trace_dump_arg(uint, start);
496 trace_dump_arg(uint, num_states);
497 trace_dump_arg_array(ptr, states, num_states);
498
499 pipe->bind_sampler_states(pipe, shader, start, num_states, states);
500
501 trace_dump_call_end();
502 }
503
504
505 static void
trace_context_delete_sampler_state(struct pipe_context * _pipe,void * state)506 trace_context_delete_sampler_state(struct pipe_context *_pipe,
507 void *state)
508 {
509 struct trace_context *tr_ctx = trace_context(_pipe);
510 struct pipe_context *pipe = tr_ctx->pipe;
511
512 trace_dump_call_begin("pipe_context", "delete_sampler_state");
513
514 trace_dump_arg(ptr, pipe);
515 trace_dump_arg(ptr, state);
516
517 pipe->delete_sampler_state(pipe, state);
518
519 trace_dump_call_end();
520 }
521
522
523 static void *
trace_context_create_rasterizer_state(struct pipe_context * _pipe,const struct pipe_rasterizer_state * state)524 trace_context_create_rasterizer_state(struct pipe_context *_pipe,
525 const struct pipe_rasterizer_state *state)
526 {
527 struct trace_context *tr_ctx = trace_context(_pipe);
528 struct pipe_context *pipe = tr_ctx->pipe;
529 void * result;
530
531 trace_dump_call_begin("pipe_context", "create_rasterizer_state");
532
533 trace_dump_arg(ptr, pipe);
534 trace_dump_arg(rasterizer_state, state);
535
536 result = pipe->create_rasterizer_state(pipe, state);
537
538 trace_dump_ret(ptr, result);
539
540 trace_dump_call_end();
541
542 struct pipe_rasterizer_state *rasterizer = ralloc(tr_ctx, struct pipe_rasterizer_state);
543 if (rasterizer) {
544 memcpy(rasterizer, state, sizeof(struct pipe_rasterizer_state));
545 _mesa_hash_table_insert(&tr_ctx->rasterizer_states, result, rasterizer);
546 }
547
548 return result;
549 }
550
551
552 static void
trace_context_bind_rasterizer_state(struct pipe_context * _pipe,void * state)553 trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
554 void *state)
555 {
556 struct trace_context *tr_ctx = trace_context(_pipe);
557 struct pipe_context *pipe = tr_ctx->pipe;
558
559 trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
560
561 trace_dump_arg(ptr, pipe);
562 if (state && trace_dump_is_triggered()) {
563 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
564 if (he)
565 trace_dump_arg(rasterizer_state, he->data);
566 else
567 trace_dump_arg(rasterizer_state, NULL);
568 } else
569 trace_dump_arg(ptr, state);
570
571 pipe->bind_rasterizer_state(pipe, state);
572
573 trace_dump_call_end();
574 }
575
576
577 static void
trace_context_delete_rasterizer_state(struct pipe_context * _pipe,void * state)578 trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
579 void *state)
580 {
581 struct trace_context *tr_ctx = trace_context(_pipe);
582 struct pipe_context *pipe = tr_ctx->pipe;
583
584 trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
585
586 trace_dump_arg(ptr, pipe);
587 trace_dump_arg(ptr, state);
588
589 pipe->delete_rasterizer_state(pipe, state);
590
591 trace_dump_call_end();
592
593 if (state) {
594 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);
595 if (he) {
596 ralloc_free(he->data);
597 _mesa_hash_table_remove(&tr_ctx->rasterizer_states, he);
598 }
599 }
600 }
601
602
603 static void *
trace_context_create_depth_stencil_alpha_state(struct pipe_context * _pipe,const struct pipe_depth_stencil_alpha_state * state)604 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
605 const struct pipe_depth_stencil_alpha_state *state)
606 {
607 struct trace_context *tr_ctx = trace_context(_pipe);
608 struct pipe_context *pipe = tr_ctx->pipe;
609 void * result;
610
611 trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
612
613 result = pipe->create_depth_stencil_alpha_state(pipe, state);
614
615 trace_dump_arg(ptr, pipe);
616 trace_dump_arg(depth_stencil_alpha_state, state);
617
618 trace_dump_ret(ptr, result);
619
620 trace_dump_call_end();
621
622 struct pipe_depth_stencil_alpha_state *depth_stencil_alpha = ralloc(tr_ctx, struct pipe_depth_stencil_alpha_state);
623 if (depth_stencil_alpha) {
624 memcpy(depth_stencil_alpha, state, sizeof(struct pipe_depth_stencil_alpha_state));
625 _mesa_hash_table_insert(&tr_ctx->depth_stencil_alpha_states, result, depth_stencil_alpha);
626 }
627
628 return result;
629 }
630
631
632 static void
trace_context_bind_depth_stencil_alpha_state(struct pipe_context * _pipe,void * state)633 trace_context_bind_depth_stencil_alpha_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", "bind_depth_stencil_alpha_state");
640
641 trace_dump_arg(ptr, pipe);
642 if (state && trace_dump_is_triggered()) {
643 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
644 if (he)
645 trace_dump_arg(depth_stencil_alpha_state, he->data);
646 else
647 trace_dump_arg(depth_stencil_alpha_state, NULL);
648 } else
649 trace_dump_arg(ptr, state);
650
651 pipe->bind_depth_stencil_alpha_state(pipe, state);
652
653 trace_dump_call_end();
654 }
655
656
657 static void
trace_context_delete_depth_stencil_alpha_state(struct pipe_context * _pipe,void * state)658 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
659 void *state)
660 {
661 struct trace_context *tr_ctx = trace_context(_pipe);
662 struct pipe_context *pipe = tr_ctx->pipe;
663
664 trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
665
666 trace_dump_arg(ptr, pipe);
667 trace_dump_arg(ptr, state);
668
669 pipe->delete_depth_stencil_alpha_state(pipe, state);
670
671 trace_dump_call_end();
672
673 if (state) {
674 struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);
675 if (he) {
676 ralloc_free(he->data);
677 _mesa_hash_table_remove(&tr_ctx->depth_stencil_alpha_states, he);
678 }
679 }
680 }
681
682
683 #define TRACE_SHADER_STATE(shader_type) \
684 static void * \
685 trace_context_create_##shader_type##_state(struct pipe_context *_pipe, \
686 const struct pipe_shader_state *state) \
687 { \
688 struct trace_context *tr_ctx = trace_context(_pipe); \
689 struct pipe_context *pipe = tr_ctx->pipe; \
690 void * result; \
691 trace_dump_call_begin("pipe_context", "create_" #shader_type "_state"); \
692 trace_dump_arg(ptr, pipe); \
693 trace_dump_arg(shader_state, state); \
694 result = pipe->create_##shader_type##_state(pipe, state); \
695 trace_dump_ret(ptr, result); \
696 trace_dump_call_end(); \
697 return result; \
698 } \
699 \
700 static void \
701 trace_context_bind_##shader_type##_state(struct pipe_context *_pipe, \
702 void *state) \
703 { \
704 struct trace_context *tr_ctx = trace_context(_pipe); \
705 struct pipe_context *pipe = tr_ctx->pipe; \
706 trace_dump_call_begin("pipe_context", "bind_" #shader_type "_state"); \
707 trace_dump_arg(ptr, pipe); \
708 trace_dump_arg(ptr, state); \
709 pipe->bind_##shader_type##_state(pipe, state); \
710 trace_dump_call_end(); \
711 } \
712 \
713 static void \
714 trace_context_delete_##shader_type##_state(struct pipe_context *_pipe, \
715 void *state) \
716 { \
717 struct trace_context *tr_ctx = trace_context(_pipe); \
718 struct pipe_context *pipe = tr_ctx->pipe; \
719 trace_dump_call_begin("pipe_context", "delete_" #shader_type "_state"); \
720 trace_dump_arg(ptr, pipe); \
721 trace_dump_arg(ptr, state); \
722 pipe->delete_##shader_type##_state(pipe, state); \
723 trace_dump_call_end(); \
724 }
725
726 TRACE_SHADER_STATE(fs)
TRACE_SHADER_STATE(vs)727 TRACE_SHADER_STATE(vs)
728 TRACE_SHADER_STATE(gs)
729 TRACE_SHADER_STATE(tcs)
730 TRACE_SHADER_STATE(tes)
731
732 #undef TRACE_SHADER_STATE
733
734 static void
735 trace_context_link_shader(struct pipe_context *_pipe, void **shaders)
736 {
737 struct trace_context *tr_ctx = trace_context(_pipe);
738 struct pipe_context *pipe = tr_ctx->pipe;
739
740 trace_dump_call_begin("pipe_context", "link_shader");
741 trace_dump_arg(ptr, pipe);
742 trace_dump_arg_array(ptr, shaders, PIPE_SHADER_TYPES);
743 pipe->link_shader(pipe, shaders);
744 trace_dump_call_end();
745 }
746
747 static inline void *
trace_context_create_compute_state(struct pipe_context * _pipe,const struct pipe_compute_state * state)748 trace_context_create_compute_state(struct pipe_context *_pipe,
749 const struct pipe_compute_state *state)
750 {
751 struct trace_context *tr_ctx = trace_context(_pipe);
752 struct pipe_context *pipe = tr_ctx->pipe;
753 void * result;
754
755 trace_dump_call_begin("pipe_context", "create_compute_state");
756 trace_dump_arg(ptr, pipe);
757 trace_dump_arg(compute_state, state);
758 result = pipe->create_compute_state(pipe, state);
759 trace_dump_ret(ptr, result);
760 trace_dump_call_end();
761 return result;
762 }
763
764 static inline void
trace_context_bind_compute_state(struct pipe_context * _pipe,void * state)765 trace_context_bind_compute_state(struct pipe_context *_pipe,
766 void *state)
767 {
768 struct trace_context *tr_ctx = trace_context(_pipe);
769 struct pipe_context *pipe = tr_ctx->pipe;
770
771 trace_dump_call_begin("pipe_context", "bind_compute_state");
772 trace_dump_arg(ptr, pipe);
773 trace_dump_arg(ptr, state);
774 pipe->bind_compute_state(pipe, state);
775 trace_dump_call_end();
776 }
777
778 static inline void
trace_context_delete_compute_state(struct pipe_context * _pipe,void * state)779 trace_context_delete_compute_state(struct pipe_context *_pipe,
780 void *state)
781 {
782 struct trace_context *tr_ctx = trace_context(_pipe);
783 struct pipe_context *pipe = tr_ctx->pipe;
784
785 trace_dump_call_begin("pipe_context", "delete_compute_state");
786 trace_dump_arg(ptr, pipe);
787 trace_dump_arg(ptr, state);
788 pipe->delete_compute_state(pipe, state);
789 trace_dump_call_end();
790 }
791
792 static void *
trace_context_create_vertex_elements_state(struct pipe_context * _pipe,unsigned num_elements,const struct pipe_vertex_element * elements)793 trace_context_create_vertex_elements_state(struct pipe_context *_pipe,
794 unsigned num_elements,
795 const struct pipe_vertex_element *elements)
796 {
797 struct trace_context *tr_ctx = trace_context(_pipe);
798 struct pipe_context *pipe = tr_ctx->pipe;
799 void * result;
800
801 trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
802
803 trace_dump_arg(ptr, pipe);
804 trace_dump_arg(uint, num_elements);
805
806 trace_dump_arg_begin("elements");
807 trace_dump_struct_array(vertex_element, elements, num_elements);
808 trace_dump_arg_end();
809
810 result = pipe->create_vertex_elements_state(pipe, num_elements, elements);
811
812 trace_dump_ret(ptr, result);
813
814 trace_dump_call_end();
815
816 return result;
817 }
818
819
820 static void
trace_context_bind_vertex_elements_state(struct pipe_context * _pipe,void * state)821 trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,
822 void *state)
823 {
824 struct trace_context *tr_ctx = trace_context(_pipe);
825 struct pipe_context *pipe = tr_ctx->pipe;
826
827 trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
828
829 trace_dump_arg(ptr, pipe);
830 trace_dump_arg(ptr, state);
831
832 pipe->bind_vertex_elements_state(pipe, state);
833
834 trace_dump_call_end();
835 }
836
837
838 static void
trace_context_delete_vertex_elements_state(struct pipe_context * _pipe,void * state)839 trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,
840 void *state)
841 {
842 struct trace_context *tr_ctx = trace_context(_pipe);
843 struct pipe_context *pipe = tr_ctx->pipe;
844
845 trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
846
847 trace_dump_arg(ptr, pipe);
848 trace_dump_arg(ptr, state);
849
850 pipe->delete_vertex_elements_state(pipe, state);
851
852 trace_dump_call_end();
853 }
854
855
856 static void
trace_context_set_blend_color(struct pipe_context * _pipe,const struct pipe_blend_color * state)857 trace_context_set_blend_color(struct pipe_context *_pipe,
858 const struct pipe_blend_color *state)
859 {
860 struct trace_context *tr_ctx = trace_context(_pipe);
861 struct pipe_context *pipe = tr_ctx->pipe;
862
863 trace_dump_call_begin("pipe_context", "set_blend_color");
864
865 trace_dump_arg(ptr, pipe);
866 trace_dump_arg(blend_color, state);
867
868 pipe->set_blend_color(pipe, state);
869
870 trace_dump_call_end();
871 }
872
873
874 static void
trace_context_set_stencil_ref(struct pipe_context * _pipe,const struct pipe_stencil_ref state)875 trace_context_set_stencil_ref(struct pipe_context *_pipe,
876 const struct pipe_stencil_ref state)
877 {
878 struct trace_context *tr_ctx = trace_context(_pipe);
879 struct pipe_context *pipe = tr_ctx->pipe;
880
881 trace_dump_call_begin("pipe_context", "set_stencil_ref");
882
883 trace_dump_arg(ptr, pipe);
884 trace_dump_arg(stencil_ref, &state);
885
886 pipe->set_stencil_ref(pipe, state);
887
888 trace_dump_call_end();
889 }
890
891
892 static void
trace_context_set_clip_state(struct pipe_context * _pipe,const struct pipe_clip_state * state)893 trace_context_set_clip_state(struct pipe_context *_pipe,
894 const struct pipe_clip_state *state)
895 {
896 struct trace_context *tr_ctx = trace_context(_pipe);
897 struct pipe_context *pipe = tr_ctx->pipe;
898
899 trace_dump_call_begin("pipe_context", "set_clip_state");
900
901 trace_dump_arg(ptr, pipe);
902 trace_dump_arg(clip_state, state);
903
904 pipe->set_clip_state(pipe, state);
905
906 trace_dump_call_end();
907 }
908
909 static void
trace_context_set_sample_mask(struct pipe_context * _pipe,unsigned sample_mask)910 trace_context_set_sample_mask(struct pipe_context *_pipe,
911 unsigned sample_mask)
912 {
913 struct trace_context *tr_ctx = trace_context(_pipe);
914 struct pipe_context *pipe = tr_ctx->pipe;
915
916 trace_dump_call_begin("pipe_context", "set_sample_mask");
917
918 trace_dump_arg(ptr, pipe);
919 trace_dump_arg(uint, sample_mask);
920
921 pipe->set_sample_mask(pipe, sample_mask);
922
923 trace_dump_call_end();
924 }
925
926 static void
trace_context_set_constant_buffer(struct pipe_context * _pipe,enum pipe_shader_type shader,uint index,bool take_ownership,const struct pipe_constant_buffer * constant_buffer)927 trace_context_set_constant_buffer(struct pipe_context *_pipe,
928 enum pipe_shader_type shader, uint index,
929 bool take_ownership,
930 const struct pipe_constant_buffer *constant_buffer)
931 {
932 struct trace_context *tr_ctx = trace_context(_pipe);
933 struct pipe_context *pipe = tr_ctx->pipe;
934
935 trace_dump_call_begin("pipe_context", "set_constant_buffer");
936
937 trace_dump_arg(ptr, pipe);
938 trace_dump_arg_enum(shader, tr_util_pipe_shader_type_name(shader));
939 trace_dump_arg(uint, index);
940 trace_dump_arg(bool, take_ownership);
941 trace_dump_arg(constant_buffer, constant_buffer);
942
943 pipe->set_constant_buffer(pipe, shader, index, take_ownership, constant_buffer);
944
945 trace_dump_call_end();
946 }
947
948
949 static void
trace_context_set_framebuffer_state(struct pipe_context * _pipe,const struct pipe_framebuffer_state * state)950 trace_context_set_framebuffer_state(struct pipe_context *_pipe,
951 const struct pipe_framebuffer_state *state)
952 {
953 struct trace_context *tr_ctx = trace_context(_pipe);
954 struct pipe_context *pipe = tr_ctx->pipe;
955 unsigned i;
956
957 /* Unwrap the input state */
958 memcpy(&tr_ctx->unwrapped_state, state, sizeof(tr_ctx->unwrapped_state));
959 for (i = 0; i < state->nr_cbufs; ++i)
960 tr_ctx->unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
961 for (i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
962 tr_ctx->unwrapped_state.cbufs[i] = NULL;
963 tr_ctx->unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
964 state = &tr_ctx->unwrapped_state;
965
966 dump_fb_state(tr_ctx, "set_framebuffer_state", trace_dump_is_triggered());
967
968 pipe->set_framebuffer_state(pipe, state);
969 }
970
971 static void
trace_context_set_inlinable_constants(struct pipe_context * _pipe,enum pipe_shader_type shader,uint num_values,uint32_t * values)972 trace_context_set_inlinable_constants(struct pipe_context *_pipe, enum pipe_shader_type shader,
973 uint num_values, uint32_t *values)
974 {
975 struct trace_context *tr_ctx = trace_context(_pipe);
976 struct pipe_context *pipe = tr_ctx->pipe;
977
978 trace_dump_call_begin("pipe_context", "set_inlinable_constants");
979
980 trace_dump_arg(ptr, pipe);
981 trace_dump_arg_enum(shader, tr_util_pipe_shader_type_name(shader));
982 trace_dump_arg(uint, num_values);
983 trace_dump_arg_array(uint, values, num_values);
984
985 pipe->set_inlinable_constants(pipe, shader, num_values, values);
986
987 trace_dump_call_end();
988 }
989
990
991 static void
trace_context_set_polygon_stipple(struct pipe_context * _pipe,const struct pipe_poly_stipple * state)992 trace_context_set_polygon_stipple(struct pipe_context *_pipe,
993 const struct pipe_poly_stipple *state)
994 {
995 struct trace_context *tr_ctx = trace_context(_pipe);
996 struct pipe_context *pipe = tr_ctx->pipe;
997
998 trace_dump_call_begin("pipe_context", "set_polygon_stipple");
999
1000 trace_dump_arg(ptr, pipe);
1001 trace_dump_arg(poly_stipple, state);
1002
1003 pipe->set_polygon_stipple(pipe, state);
1004
1005 trace_dump_call_end();
1006 }
1007
1008 static void
trace_context_set_min_samples(struct pipe_context * _pipe,unsigned min_samples)1009 trace_context_set_min_samples(struct pipe_context *_pipe,
1010 unsigned min_samples)
1011 {
1012 struct trace_context *tr_ctx = trace_context(_pipe);
1013 struct pipe_context *pipe = tr_ctx->pipe;
1014
1015 trace_dump_call_begin("pipe_context", "set_min_samples");
1016
1017 trace_dump_arg(ptr, pipe);
1018 trace_dump_arg(uint, min_samples);
1019
1020 pipe->set_min_samples(pipe, min_samples);
1021
1022 trace_dump_call_end();
1023 }
1024
1025
1026 static void
trace_context_set_scissor_states(struct pipe_context * _pipe,unsigned start_slot,unsigned num_scissors,const struct pipe_scissor_state * states)1027 trace_context_set_scissor_states(struct pipe_context *_pipe,
1028 unsigned start_slot,
1029 unsigned num_scissors,
1030 const struct pipe_scissor_state *states)
1031 {
1032 struct trace_context *tr_ctx = trace_context(_pipe);
1033 struct pipe_context *pipe = tr_ctx->pipe;
1034
1035 trace_dump_call_begin("pipe_context", "set_scissor_states");
1036
1037 trace_dump_arg(ptr, pipe);
1038 trace_dump_arg(uint, start_slot);
1039 trace_dump_arg(uint, num_scissors);
1040 trace_dump_arg(scissor_state, states);
1041
1042 pipe->set_scissor_states(pipe, start_slot, num_scissors, states);
1043
1044 trace_dump_call_end();
1045 }
1046
1047
1048 static void
trace_context_set_viewport_states(struct pipe_context * _pipe,unsigned start_slot,unsigned num_viewports,const struct pipe_viewport_state * states)1049 trace_context_set_viewport_states(struct pipe_context *_pipe,
1050 unsigned start_slot,
1051 unsigned num_viewports,
1052 const struct pipe_viewport_state *states)
1053 {
1054 struct trace_context *tr_ctx = trace_context(_pipe);
1055 struct pipe_context *pipe = tr_ctx->pipe;
1056
1057 trace_dump_call_begin("pipe_context", "set_viewport_states");
1058
1059 trace_dump_arg(ptr, pipe);
1060 trace_dump_arg(uint, start_slot);
1061 trace_dump_arg(uint, num_viewports);
1062 trace_dump_arg(viewport_state, states);
1063
1064 pipe->set_viewport_states(pipe, start_slot, num_viewports, states);
1065
1066 trace_dump_call_end();
1067 }
1068
1069
1070 static struct pipe_sampler_view *
trace_context_create_sampler_view(struct pipe_context * _pipe,struct pipe_resource * resource,const struct pipe_sampler_view * templ)1071 trace_context_create_sampler_view(struct pipe_context *_pipe,
1072 struct pipe_resource *resource,
1073 const struct pipe_sampler_view *templ)
1074 {
1075 struct trace_context *tr_ctx = trace_context(_pipe);
1076 struct pipe_context *pipe = tr_ctx->pipe;
1077 struct pipe_sampler_view *result;
1078 struct trace_sampler_view *tr_view;
1079
1080 trace_dump_call_begin("pipe_context", "create_sampler_view");
1081
1082 trace_dump_arg(ptr, pipe);
1083 trace_dump_arg(ptr, resource);
1084
1085 trace_dump_arg_begin("templ");
1086 trace_dump_sampler_view_template(templ);
1087 trace_dump_arg_end();
1088
1089 result = pipe->create_sampler_view(pipe, resource, templ);
1090
1091 trace_dump_ret(ptr, result);
1092
1093 trace_dump_call_end();
1094
1095 /*
1096 * Wrap pipe_sampler_view
1097 */
1098 tr_view = CALLOC_STRUCT(trace_sampler_view);
1099 tr_view->base = *templ;
1100 tr_view->base.reference.count = 1;
1101 tr_view->base.texture = NULL;
1102 pipe_resource_reference(&tr_view->base.texture, resource);
1103 tr_view->base.context = _pipe;
1104 tr_view->sampler_view = result;
1105 result->reference.count += 100000000;
1106 tr_view->refcount = 100000000;
1107 result = &tr_view->base;
1108
1109 return result;
1110 }
1111
1112
1113 static void
trace_context_sampler_view_destroy(struct pipe_context * _pipe,struct pipe_sampler_view * _view)1114 trace_context_sampler_view_destroy(struct pipe_context *_pipe,
1115 struct pipe_sampler_view *_view)
1116 {
1117 struct trace_context *tr_ctx = trace_context(_pipe);
1118 struct trace_sampler_view *tr_view = trace_sampler_view(_view);
1119 struct pipe_context *pipe = tr_ctx->pipe;
1120 struct pipe_sampler_view *view = tr_view->sampler_view;
1121
1122 trace_dump_call_begin("pipe_context", "sampler_view_destroy");
1123
1124 trace_dump_arg(ptr, pipe);
1125 trace_dump_arg(ptr, view);
1126
1127 p_atomic_add(&tr_view->sampler_view->reference.count, -tr_view->refcount);
1128 pipe_sampler_view_reference(&tr_view->sampler_view, NULL);
1129
1130 trace_dump_call_end();
1131
1132 pipe_resource_reference(&_view->texture, NULL);
1133 FREE(_view);
1134 }
1135
1136 /********************************************************************
1137 * surface
1138 */
1139
1140
1141 static struct pipe_surface *
trace_context_create_surface(struct pipe_context * _pipe,struct pipe_resource * resource,const struct pipe_surface * surf_tmpl)1142 trace_context_create_surface(struct pipe_context *_pipe,
1143 struct pipe_resource *resource,
1144 const struct pipe_surface *surf_tmpl)
1145 {
1146 struct trace_context *tr_ctx = trace_context(_pipe);
1147 struct pipe_context *pipe = tr_ctx->pipe;
1148 struct pipe_surface *result = NULL;
1149
1150 trace_dump_call_begin("pipe_context", "create_surface");
1151
1152 trace_dump_arg(ptr, pipe);
1153 trace_dump_arg(ptr, resource);
1154
1155 trace_dump_arg_begin("surf_tmpl");
1156 trace_dump_surface_template(surf_tmpl, resource->target);
1157 trace_dump_arg_end();
1158
1159
1160 result = pipe->create_surface(pipe, resource, surf_tmpl);
1161
1162 trace_dump_ret(ptr, result);
1163
1164 trace_dump_call_end();
1165
1166 result = trace_surf_create(tr_ctx, resource, result);
1167
1168 return result;
1169 }
1170
1171
1172 static void
trace_context_surface_destroy(struct pipe_context * _pipe,struct pipe_surface * _surface)1173 trace_context_surface_destroy(struct pipe_context *_pipe,
1174 struct pipe_surface *_surface)
1175 {
1176 struct trace_context *tr_ctx = trace_context(_pipe);
1177 struct pipe_context *pipe = tr_ctx->pipe;
1178 struct trace_surface *tr_surf = trace_surface(_surface);
1179 struct pipe_surface *surface = tr_surf->surface;
1180
1181 trace_dump_call_begin("pipe_context", "surface_destroy");
1182
1183 trace_dump_arg(ptr, pipe);
1184 trace_dump_arg(ptr, surface);
1185
1186 trace_dump_call_end();
1187
1188 trace_surf_destroy(tr_surf);
1189 }
1190
1191
1192 static void
trace_context_set_sampler_views(struct pipe_context * _pipe,enum pipe_shader_type shader,unsigned start,unsigned num,unsigned unbind_num_trailing_slots,bool take_ownership,struct pipe_sampler_view ** views)1193 trace_context_set_sampler_views(struct pipe_context *_pipe,
1194 enum pipe_shader_type shader,
1195 unsigned start,
1196 unsigned num,
1197 unsigned unbind_num_trailing_slots,
1198 bool take_ownership,
1199 struct pipe_sampler_view **views)
1200 {
1201 struct trace_context *tr_ctx = trace_context(_pipe);
1202 struct trace_sampler_view *tr_view;
1203 struct pipe_context *pipe = tr_ctx->pipe;
1204 struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
1205 unsigned i;
1206
1207 /* remove this when we have pipe->set_sampler_views(..., start, ...) */
1208 assert(start == 0);
1209
1210 for (i = 0; i < num; ++i) {
1211 tr_view = trace_sampler_view(views[i]);
1212 if (tr_view) {
1213 tr_view->refcount--;
1214 if (!tr_view->refcount) {
1215 tr_view->refcount = 100000000;
1216 p_atomic_add(&tr_view->sampler_view->reference.count, tr_view->refcount);
1217 }
1218 }
1219 unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;
1220 }
1221 views = unwrapped_views;
1222
1223 trace_dump_call_begin("pipe_context", "set_sampler_views");
1224
1225 trace_dump_arg(ptr, pipe);
1226 trace_dump_arg_enum(shader, tr_util_pipe_shader_type_name(shader));
1227 trace_dump_arg(uint, start);
1228 trace_dump_arg(uint, num);
1229 trace_dump_arg(uint, unbind_num_trailing_slots);
1230 trace_dump_arg(bool, take_ownership);
1231 trace_dump_arg_array(ptr, views, num);
1232
1233 pipe->set_sampler_views(pipe, shader, start, num,
1234 unbind_num_trailing_slots, take_ownership, views);
1235
1236 trace_dump_call_end();
1237 }
1238
1239
1240 static void
trace_context_set_vertex_buffers(struct pipe_context * _pipe,unsigned start_slot,unsigned num_buffers,unsigned unbind_num_trailing_slots,bool take_ownership,const struct pipe_vertex_buffer * buffers)1241 trace_context_set_vertex_buffers(struct pipe_context *_pipe,
1242 unsigned start_slot, unsigned num_buffers,
1243 unsigned unbind_num_trailing_slots,
1244 bool take_ownership,
1245 const struct pipe_vertex_buffer *buffers)
1246 {
1247 struct trace_context *tr_ctx = trace_context(_pipe);
1248 struct pipe_context *pipe = tr_ctx->pipe;
1249
1250 trace_dump_call_begin("pipe_context", "set_vertex_buffers");
1251
1252 trace_dump_arg(ptr, pipe);
1253 trace_dump_arg(uint, start_slot);
1254 trace_dump_arg(uint, num_buffers);
1255 trace_dump_arg(uint, unbind_num_trailing_slots);
1256 trace_dump_arg(bool, take_ownership);
1257
1258 trace_dump_arg_begin("buffers");
1259 trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
1260 trace_dump_arg_end();
1261
1262 pipe->set_vertex_buffers(pipe, start_slot, num_buffers,
1263 unbind_num_trailing_slots, take_ownership,
1264 buffers);
1265
1266 trace_dump_call_end();
1267 }
1268
1269
1270 static struct pipe_stream_output_target *
trace_context_create_stream_output_target(struct pipe_context * _pipe,struct pipe_resource * res,unsigned buffer_offset,unsigned buffer_size)1271 trace_context_create_stream_output_target(struct pipe_context *_pipe,
1272 struct pipe_resource *res,
1273 unsigned buffer_offset,
1274 unsigned buffer_size)
1275 {
1276 struct trace_context *tr_ctx = trace_context(_pipe);
1277 struct pipe_context *pipe = tr_ctx->pipe;
1278 struct pipe_stream_output_target *result;
1279
1280 trace_dump_call_begin("pipe_context", "create_stream_output_target");
1281
1282 trace_dump_arg(ptr, pipe);
1283 trace_dump_arg(ptr, res);
1284 trace_dump_arg(uint, buffer_offset);
1285 trace_dump_arg(uint, buffer_size);
1286
1287 result = pipe->create_stream_output_target(pipe,
1288 res, buffer_offset, buffer_size);
1289
1290 trace_dump_ret(ptr, result);
1291
1292 trace_dump_call_end();
1293
1294 return result;
1295 }
1296
1297
1298 static void
trace_context_stream_output_target_destroy(struct pipe_context * _pipe,struct pipe_stream_output_target * target)1299 trace_context_stream_output_target_destroy(
1300 struct pipe_context *_pipe,
1301 struct pipe_stream_output_target *target)
1302 {
1303 struct trace_context *tr_ctx = trace_context(_pipe);
1304 struct pipe_context *pipe = tr_ctx->pipe;
1305
1306 trace_dump_call_begin("pipe_context", "stream_output_target_destroy");
1307
1308 trace_dump_arg(ptr, pipe);
1309 trace_dump_arg(ptr, target);
1310
1311 pipe->stream_output_target_destroy(pipe, target);
1312
1313 trace_dump_call_end();
1314 }
1315
1316
1317 static void
trace_context_set_stream_output_targets(struct pipe_context * _pipe,unsigned num_targets,struct pipe_stream_output_target ** tgs,const unsigned * offsets)1318 trace_context_set_stream_output_targets(struct pipe_context *_pipe,
1319 unsigned num_targets,
1320 struct pipe_stream_output_target **tgs,
1321 const unsigned *offsets)
1322 {
1323 struct trace_context *tr_ctx = trace_context(_pipe);
1324 struct pipe_context *pipe = tr_ctx->pipe;
1325
1326 trace_dump_call_begin("pipe_context", "set_stream_output_targets");
1327
1328 trace_dump_arg(ptr, pipe);
1329 trace_dump_arg(uint, num_targets);
1330 trace_dump_arg_array(ptr, tgs, num_targets);
1331 trace_dump_arg_array(uint, offsets, num_targets);
1332
1333 pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets);
1334
1335 trace_dump_call_end();
1336 }
1337
1338
1339 static void
trace_context_resource_copy_region(struct pipe_context * _pipe,struct pipe_resource * dst,unsigned dst_level,unsigned dstx,unsigned dsty,unsigned dstz,struct pipe_resource * src,unsigned src_level,const struct pipe_box * src_box)1340 trace_context_resource_copy_region(struct pipe_context *_pipe,
1341 struct pipe_resource *dst,
1342 unsigned dst_level,
1343 unsigned dstx, unsigned dsty, unsigned dstz,
1344 struct pipe_resource *src,
1345 unsigned src_level,
1346 const struct pipe_box *src_box)
1347 {
1348 struct trace_context *tr_ctx = trace_context(_pipe);
1349 struct pipe_context *pipe = tr_ctx->pipe;
1350
1351 trace_dump_call_begin("pipe_context", "resource_copy_region");
1352
1353 trace_dump_arg(ptr, pipe);
1354 trace_dump_arg(ptr, dst);
1355 trace_dump_arg(uint, dst_level);
1356 trace_dump_arg(uint, dstx);
1357 trace_dump_arg(uint, dsty);
1358 trace_dump_arg(uint, dstz);
1359 trace_dump_arg(ptr, src);
1360 trace_dump_arg(uint, src_level);
1361 trace_dump_arg(box, src_box);
1362
1363 pipe->resource_copy_region(pipe,
1364 dst, dst_level, dstx, dsty, dstz,
1365 src, src_level, src_box);
1366
1367 trace_dump_call_end();
1368 }
1369
1370
1371 static void
trace_context_blit(struct pipe_context * _pipe,const struct pipe_blit_info * _info)1372 trace_context_blit(struct pipe_context *_pipe,
1373 const struct pipe_blit_info *_info)
1374 {
1375 struct trace_context *tr_ctx = trace_context(_pipe);
1376 struct pipe_context *pipe = tr_ctx->pipe;
1377 struct pipe_blit_info info = *_info;
1378
1379 trace_dump_call_begin("pipe_context", "blit");
1380
1381 trace_dump_arg(ptr, pipe);
1382 trace_dump_arg(blit_info, _info);
1383
1384 pipe->blit(pipe, &info);
1385
1386 trace_dump_call_end();
1387 }
1388
1389
1390 static void
trace_context_flush_resource(struct pipe_context * _pipe,struct pipe_resource * resource)1391 trace_context_flush_resource(struct pipe_context *_pipe,
1392 struct pipe_resource *resource)
1393 {
1394 struct trace_context *tr_ctx = trace_context(_pipe);
1395 struct pipe_context *pipe = tr_ctx->pipe;
1396
1397 trace_dump_call_begin("pipe_context", "flush_resource");
1398
1399 trace_dump_arg(ptr, pipe);
1400 trace_dump_arg(ptr, resource);
1401
1402 pipe->flush_resource(pipe, resource);
1403
1404 trace_dump_call_end();
1405 }
1406
1407
1408 static void
trace_context_clear(struct pipe_context * _pipe,unsigned buffers,const struct pipe_scissor_state * scissor_state,const union pipe_color_union * color,double depth,unsigned stencil)1409 trace_context_clear(struct pipe_context *_pipe,
1410 unsigned buffers,
1411 const struct pipe_scissor_state *scissor_state,
1412 const union pipe_color_union *color,
1413 double depth,
1414 unsigned stencil)
1415 {
1416 struct trace_context *tr_ctx = trace_context(_pipe);
1417 struct pipe_context *pipe = tr_ctx->pipe;
1418
1419 trace_dump_call_begin("pipe_context", "clear");
1420
1421 trace_dump_arg(ptr, pipe);
1422 trace_dump_arg(uint, buffers);
1423 trace_dump_arg_begin("scissor_state");
1424 trace_dump_scissor_state(scissor_state);
1425 trace_dump_arg_end();
1426 if (color)
1427 trace_dump_arg_array(uint, color->ui, 4);
1428 else
1429 trace_dump_null();
1430 trace_dump_arg(float, depth);
1431 trace_dump_arg(uint, stencil);
1432
1433 pipe->clear(pipe, buffers, scissor_state, color, depth, stencil);
1434
1435 trace_dump_call_end();
1436 }
1437
1438
1439 static void
trace_context_clear_render_target(struct pipe_context * _pipe,struct pipe_surface * dst,const union pipe_color_union * color,unsigned dstx,unsigned dsty,unsigned width,unsigned height,bool render_condition_enabled)1440 trace_context_clear_render_target(struct pipe_context *_pipe,
1441 struct pipe_surface *dst,
1442 const union pipe_color_union *color,
1443 unsigned dstx, unsigned dsty,
1444 unsigned width, unsigned height,
1445 bool render_condition_enabled)
1446 {
1447 struct trace_context *tr_ctx = trace_context(_pipe);
1448 struct pipe_context *pipe = tr_ctx->pipe;
1449
1450 dst = trace_surface_unwrap(tr_ctx, dst);
1451
1452 trace_dump_call_begin("pipe_context", "clear_render_target");
1453
1454 trace_dump_arg(ptr, pipe);
1455 trace_dump_arg(ptr, dst);
1456 trace_dump_arg_array(uint, color->ui, 4);
1457 trace_dump_arg(uint, dstx);
1458 trace_dump_arg(uint, dsty);
1459 trace_dump_arg(uint, width);
1460 trace_dump_arg(uint, height);
1461 trace_dump_arg(bool, render_condition_enabled);
1462
1463 pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height,
1464 render_condition_enabled);
1465
1466 trace_dump_call_end();
1467 }
1468
1469 static void
trace_context_clear_depth_stencil(struct pipe_context * _pipe,struct pipe_surface * dst,unsigned clear_flags,double depth,unsigned stencil,unsigned dstx,unsigned dsty,unsigned width,unsigned height,bool render_condition_enabled)1470 trace_context_clear_depth_stencil(struct pipe_context *_pipe,
1471 struct pipe_surface *dst,
1472 unsigned clear_flags,
1473 double depth,
1474 unsigned stencil,
1475 unsigned dstx, unsigned dsty,
1476 unsigned width, unsigned height,
1477 bool render_condition_enabled)
1478 {
1479 struct trace_context *tr_ctx = trace_context(_pipe);
1480 struct pipe_context *pipe = tr_ctx->pipe;
1481
1482 dst = trace_surface_unwrap(tr_ctx, dst);
1483
1484 trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1485
1486 trace_dump_arg(ptr, pipe);
1487 trace_dump_arg(ptr, dst);
1488 trace_dump_arg(uint, clear_flags);
1489 trace_dump_arg(float, depth);
1490 trace_dump_arg(uint, stencil);
1491 trace_dump_arg(uint, dstx);
1492 trace_dump_arg(uint, dsty);
1493 trace_dump_arg(uint, width);
1494 trace_dump_arg(uint, height);
1495 trace_dump_arg(bool, render_condition_enabled);
1496
1497 pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1498 dstx, dsty, width, height,
1499 render_condition_enabled);
1500
1501 trace_dump_call_end();
1502 }
1503
1504 static inline void
trace_context_clear_buffer(struct pipe_context * _pipe,struct pipe_resource * res,unsigned offset,unsigned size,const void * clear_value,int clear_value_size)1505 trace_context_clear_buffer(struct pipe_context *_pipe,
1506 struct pipe_resource *res,
1507 unsigned offset,
1508 unsigned size,
1509 const void *clear_value,
1510 int clear_value_size)
1511 {
1512 struct trace_context *tr_ctx = trace_context(_pipe);
1513 struct pipe_context *pipe = tr_ctx->pipe;
1514
1515
1516 trace_dump_call_begin("pipe_context", "clear_buffer");
1517
1518 trace_dump_arg(ptr, pipe);
1519 trace_dump_arg(ptr, res);
1520 trace_dump_arg(uint, offset);
1521 trace_dump_arg(uint, size);
1522 trace_dump_arg(ptr, clear_value);
1523 trace_dump_arg(int, clear_value_size);
1524
1525 pipe->clear_buffer(pipe, res, offset, size, clear_value, clear_value_size);
1526
1527 trace_dump_call_end();
1528 }
1529
1530 static inline void
trace_context_clear_texture(struct pipe_context * _pipe,struct pipe_resource * res,unsigned level,const struct pipe_box * box,const void * data)1531 trace_context_clear_texture(struct pipe_context *_pipe,
1532 struct pipe_resource *res,
1533 unsigned level,
1534 const struct pipe_box *box,
1535 const void *data)
1536 {
1537 struct trace_context *tr_ctx = trace_context(_pipe);
1538 const struct util_format_description *desc = util_format_description(res->format);
1539 struct pipe_context *pipe = tr_ctx->pipe;
1540 union pipe_color_union color;
1541 float depth = 0.0f;
1542 uint8_t stencil = 0;
1543
1544 trace_dump_call_begin("pipe_context", "clear_texture");
1545 trace_dump_arg(ptr, pipe);
1546 trace_dump_arg(ptr, res);
1547 trace_dump_arg(uint, level);
1548 trace_dump_arg_begin("box");
1549 trace_dump_box(box);
1550 trace_dump_arg_end();
1551 if (util_format_has_depth(desc)) {
1552 util_format_unpack_z_float(res->format, &depth, data, 1);
1553 trace_dump_arg(float, depth);
1554 }
1555 if (util_format_has_stencil(desc)) {
1556 util_format_unpack_s_8uint(res->format, &stencil, data, 1);
1557 trace_dump_arg(uint, stencil);
1558 }
1559 if (!util_format_is_depth_or_stencil(res->format)) {
1560 util_format_unpack_rgba(res->format, color.ui, data, 1);
1561 trace_dump_arg_array(uint, color.ui, 4);
1562 }
1563
1564 pipe->clear_texture(pipe, res, level, box, data);
1565
1566 trace_dump_call_end();
1567 }
1568
1569 static void
trace_context_flush(struct pipe_context * _pipe,struct pipe_fence_handle ** fence,unsigned flags)1570 trace_context_flush(struct pipe_context *_pipe,
1571 struct pipe_fence_handle **fence,
1572 unsigned flags)
1573 {
1574 struct trace_context *tr_ctx = trace_context(_pipe);
1575 struct pipe_context *pipe = tr_ctx->pipe;
1576
1577 trace_dump_call_begin("pipe_context", "flush");
1578
1579 trace_dump_arg(ptr, pipe);
1580 trace_dump_arg(uint, flags);
1581
1582 pipe->flush(pipe, fence, flags);
1583
1584 if (fence)
1585 trace_dump_ret(ptr, *fence);
1586
1587 trace_dump_call_end();
1588
1589 if (flags & PIPE_FLUSH_END_OF_FRAME) {
1590 trace_dump_check_trigger();
1591 tr_ctx->seen_fb_state = false;
1592 }
1593 }
1594
1595
1596 static void
trace_context_create_fence_fd(struct pipe_context * _pipe,struct pipe_fence_handle ** fence,int fd,enum pipe_fd_type type)1597 trace_context_create_fence_fd(struct pipe_context *_pipe,
1598 struct pipe_fence_handle **fence,
1599 int fd,
1600 enum pipe_fd_type type)
1601 {
1602 struct trace_context *tr_ctx = trace_context(_pipe);
1603 struct pipe_context *pipe = tr_ctx->pipe;
1604
1605 trace_dump_call_begin("pipe_context", "create_fence_fd");
1606
1607 trace_dump_arg(ptr, pipe);
1608 trace_dump_arg_enum(fd, tr_util_pipe_fd_type_name(fd));
1609 trace_dump_arg(uint, type);
1610
1611 pipe->create_fence_fd(pipe, fence, fd, type);
1612
1613 if (fence)
1614 trace_dump_ret(ptr, *fence);
1615
1616 trace_dump_call_end();
1617 }
1618
1619
1620 static void
trace_context_fence_server_sync(struct pipe_context * _pipe,struct pipe_fence_handle * fence)1621 trace_context_fence_server_sync(struct pipe_context *_pipe,
1622 struct pipe_fence_handle *fence)
1623 {
1624 struct trace_context *tr_ctx = trace_context(_pipe);
1625 struct pipe_context *pipe = tr_ctx->pipe;
1626
1627 trace_dump_call_begin("pipe_context", "fence_server_sync");
1628
1629 trace_dump_arg(ptr, pipe);
1630 trace_dump_arg(ptr, fence);
1631
1632 pipe->fence_server_sync(pipe, fence);
1633
1634 trace_dump_call_end();
1635 }
1636
1637
1638 static void
trace_context_fence_server_signal(struct pipe_context * _pipe,struct pipe_fence_handle * fence)1639 trace_context_fence_server_signal(struct pipe_context *_pipe,
1640 struct pipe_fence_handle *fence)
1641 {
1642 struct trace_context *tr_ctx = trace_context(_pipe);
1643 struct pipe_context *pipe = tr_ctx->pipe;
1644
1645 trace_dump_call_begin("pipe_context", "fence_server_signal");
1646
1647 trace_dump_arg(ptr, pipe);
1648 trace_dump_arg(ptr, fence);
1649
1650 pipe->fence_server_signal(pipe, fence);
1651
1652 trace_dump_call_end();
1653 }
1654
1655
1656 static inline bool
trace_context_generate_mipmap(struct pipe_context * _pipe,struct pipe_resource * res,enum pipe_format format,unsigned base_level,unsigned last_level,unsigned first_layer,unsigned last_layer)1657 trace_context_generate_mipmap(struct pipe_context *_pipe,
1658 struct pipe_resource *res,
1659 enum pipe_format format,
1660 unsigned base_level,
1661 unsigned last_level,
1662 unsigned first_layer,
1663 unsigned last_layer)
1664 {
1665 struct trace_context *tr_ctx = trace_context(_pipe);
1666 struct pipe_context *pipe = tr_ctx->pipe;
1667 bool ret;
1668
1669 trace_dump_call_begin("pipe_context", "generate_mipmap");
1670
1671 trace_dump_arg(ptr, pipe);
1672 trace_dump_arg(ptr, res);
1673
1674 trace_dump_arg(format, format);
1675 trace_dump_arg(uint, base_level);
1676 trace_dump_arg(uint, last_level);
1677 trace_dump_arg(uint, first_layer);
1678 trace_dump_arg(uint, last_layer);
1679
1680 ret = pipe->generate_mipmap(pipe, res, format, base_level, last_level,
1681 first_layer, last_layer);
1682
1683 trace_dump_ret(bool, ret);
1684 trace_dump_call_end();
1685
1686 return ret;
1687 }
1688
1689
1690 static void
trace_context_destroy(struct pipe_context * _pipe)1691 trace_context_destroy(struct pipe_context *_pipe)
1692 {
1693 struct trace_context *tr_ctx = trace_context(_pipe);
1694 struct pipe_context *pipe = tr_ctx->pipe;
1695
1696 trace_dump_call_begin("pipe_context", "destroy");
1697 trace_dump_arg(ptr, pipe);
1698 trace_dump_call_end();
1699
1700 pipe->destroy(pipe);
1701
1702 ralloc_free(tr_ctx);
1703 }
1704
1705
1706 /********************************************************************
1707 * transfer
1708 */
1709
1710
1711 static void *
trace_context_transfer_map(struct pipe_context * _context,struct pipe_resource * resource,unsigned level,unsigned usage,const struct pipe_box * box,struct pipe_transfer ** transfer)1712 trace_context_transfer_map(struct pipe_context *_context,
1713 struct pipe_resource *resource,
1714 unsigned level,
1715 unsigned usage,
1716 const struct pipe_box *box,
1717 struct pipe_transfer **transfer)
1718 {
1719 struct trace_context *tr_context = trace_context(_context);
1720 struct pipe_context *pipe = tr_context->pipe;
1721 struct pipe_transfer *xfer = NULL;
1722 void *map;
1723
1724 if (resource->target == PIPE_BUFFER)
1725 map = pipe->buffer_map(pipe, resource, level, usage, box, &xfer);
1726 else
1727 map = pipe->texture_map(pipe, resource, level, usage, box, &xfer);
1728 if (!map)
1729 return NULL;
1730 *transfer = trace_transfer_create(tr_context, resource, xfer);
1731 trace_dump_call_begin("pipe_context", resource->target == PIPE_BUFFER ? "buffer_map" : "texture_map");
1732
1733 trace_dump_arg(ptr, pipe);
1734 trace_dump_arg(ptr, resource);
1735 trace_dump_arg(uint, level);
1736 trace_dump_arg(uint, usage);
1737 trace_dump_arg(box, box);
1738
1739 trace_dump_arg(ptr, xfer);
1740 trace_dump_ret(ptr, map);
1741
1742 trace_dump_call_end();
1743
1744 if (map) {
1745 if (usage & PIPE_MAP_WRITE) {
1746 trace_transfer(*transfer)->map = map;
1747 }
1748 }
1749
1750 return *transfer ? map : NULL;
1751 }
1752
1753 static void
trace_context_transfer_flush_region(struct pipe_context * _context,struct pipe_transfer * _transfer,const struct pipe_box * box)1754 trace_context_transfer_flush_region( struct pipe_context *_context,
1755 struct pipe_transfer *_transfer,
1756 const struct pipe_box *box)
1757 {
1758 struct trace_context *tr_context = trace_context(_context);
1759 struct trace_transfer *tr_transfer = trace_transfer(_transfer);
1760 struct pipe_context *pipe = tr_context->pipe;
1761 struct pipe_transfer *transfer = tr_transfer->transfer;
1762
1763 trace_dump_call_begin("pipe_context", "transfer_flush_region");
1764
1765 trace_dump_arg(ptr, pipe);
1766 trace_dump_arg(ptr, transfer);
1767 trace_dump_arg(box, box);
1768
1769 trace_dump_call_end();
1770
1771 pipe->transfer_flush_region(pipe, transfer, box);
1772 }
1773
1774 static void
trace_context_transfer_unmap(struct pipe_context * _context,struct pipe_transfer * _transfer)1775 trace_context_transfer_unmap(struct pipe_context *_context,
1776 struct pipe_transfer *_transfer)
1777 {
1778 struct trace_context *tr_ctx = trace_context(_context);
1779 struct trace_transfer *tr_trans = trace_transfer(_transfer);
1780 struct pipe_context *context = tr_ctx->pipe;
1781 struct pipe_transfer *transfer = tr_trans->transfer;
1782
1783
1784 trace_dump_call_begin("pipe_context", "transfer_unmap");
1785
1786 trace_dump_arg(ptr, context);
1787 trace_dump_arg(ptr, transfer);
1788
1789 trace_dump_call_end();
1790
1791 if (tr_trans->map && !tr_ctx->threaded) {
1792 /*
1793 * Fake a texture/buffer_subdata
1794 */
1795
1796 struct pipe_resource *resource = transfer->resource;
1797 unsigned usage = transfer->usage;
1798 const struct pipe_box *box = &transfer->box;
1799 unsigned stride = transfer->stride;
1800 unsigned layer_stride = transfer->layer_stride;
1801
1802 if (resource->target == PIPE_BUFFER) {
1803 unsigned offset = box->x;
1804 unsigned size = box->width;
1805
1806 trace_dump_call_begin("pipe_context", "buffer_subdata");
1807
1808 trace_dump_arg(ptr, context);
1809 trace_dump_arg(ptr, resource);
1810 trace_dump_arg(uint, usage);
1811 trace_dump_arg(uint, offset);
1812 trace_dump_arg(uint, size);
1813
1814 trace_dump_arg_begin("data");
1815 trace_dump_box_bytes(tr_trans->map,
1816 resource,
1817 box,
1818 stride,
1819 layer_stride);
1820 trace_dump_arg_end();
1821
1822 trace_dump_arg(uint, stride);
1823 trace_dump_arg(uint, layer_stride);
1824
1825 trace_dump_call_end();
1826 } else {
1827 unsigned level = transfer->level;
1828
1829 trace_dump_call_begin("pipe_context", "texture_subdata");
1830
1831 trace_dump_arg(ptr, context);
1832 trace_dump_arg(ptr, resource);
1833 trace_dump_arg(uint, level);
1834 trace_dump_arg(uint, usage);
1835 trace_dump_arg(box, box);
1836
1837 trace_dump_arg_begin("data");
1838 trace_dump_box_bytes(tr_trans->map,
1839 resource,
1840 box,
1841 stride,
1842 layer_stride);
1843 trace_dump_arg_end();
1844
1845 trace_dump_arg(uint, stride);
1846 trace_dump_arg(uint, layer_stride);
1847
1848 trace_dump_call_end();
1849 }
1850
1851 tr_trans->map = NULL;
1852 }
1853
1854 if (transfer->resource->target == PIPE_BUFFER)
1855 context->buffer_unmap(context, transfer);
1856 else
1857 context->texture_unmap(context, transfer);
1858 trace_transfer_destroy(tr_ctx, tr_trans);
1859 }
1860
1861
1862 static void
trace_context_buffer_subdata(struct pipe_context * _context,struct pipe_resource * resource,unsigned usage,unsigned offset,unsigned size,const void * data)1863 trace_context_buffer_subdata(struct pipe_context *_context,
1864 struct pipe_resource *resource,
1865 unsigned usage, unsigned offset,
1866 unsigned size, const void *data)
1867 {
1868 struct trace_context *tr_context = trace_context(_context);
1869 struct pipe_context *context = tr_context->pipe;
1870 struct pipe_box box;
1871
1872 trace_dump_call_begin("pipe_context", "buffer_subdata");
1873
1874 trace_dump_arg(ptr, context);
1875 trace_dump_arg(ptr, resource);
1876 trace_dump_arg(uint, usage);
1877 trace_dump_arg(uint, offset);
1878 trace_dump_arg(uint, size);
1879
1880 trace_dump_arg_begin("data");
1881 u_box_1d(offset, size, &box);
1882 trace_dump_box_bytes(data, resource, &box, 0, 0);
1883 trace_dump_arg_end();
1884
1885 trace_dump_call_end();
1886
1887 context->buffer_subdata(context, resource, usage, offset, size, data);
1888 }
1889
1890
1891 static void
trace_context_texture_subdata(struct pipe_context * _context,struct pipe_resource * resource,unsigned level,unsigned usage,const struct pipe_box * box,const void * data,unsigned stride,unsigned layer_stride)1892 trace_context_texture_subdata(struct pipe_context *_context,
1893 struct pipe_resource *resource,
1894 unsigned level,
1895 unsigned usage,
1896 const struct pipe_box *box,
1897 const void *data,
1898 unsigned stride,
1899 unsigned layer_stride)
1900 {
1901 struct trace_context *tr_context = trace_context(_context);
1902 struct pipe_context *context = tr_context->pipe;
1903
1904 trace_dump_call_begin("pipe_context", "texture_subdata");
1905
1906 trace_dump_arg(ptr, context);
1907 trace_dump_arg(ptr, resource);
1908 trace_dump_arg(uint, level);
1909 trace_dump_arg(uint, usage);
1910 trace_dump_arg(box, box);
1911
1912 trace_dump_arg_begin("data");
1913 trace_dump_box_bytes(data,
1914 resource,
1915 box,
1916 stride,
1917 layer_stride);
1918 trace_dump_arg_end();
1919
1920 trace_dump_arg(uint, stride);
1921 trace_dump_arg(uint, layer_stride);
1922
1923 trace_dump_call_end();
1924
1925 context->texture_subdata(context, resource, level, usage, box,
1926 data, stride, layer_stride);
1927 }
1928
1929 static void
trace_context_invalidate_resource(struct pipe_context * _context,struct pipe_resource * resource)1930 trace_context_invalidate_resource(struct pipe_context *_context,
1931 struct pipe_resource *resource)
1932 {
1933 struct trace_context *tr_context = trace_context(_context);
1934 struct pipe_context *context = tr_context->pipe;
1935
1936 trace_dump_call_begin("pipe_context", "invalidate_resource");
1937
1938 trace_dump_arg(ptr, context);
1939 trace_dump_arg(ptr, resource);
1940
1941 trace_dump_call_end();
1942
1943 context->invalidate_resource(context, resource);
1944 }
1945
1946 static void
trace_context_set_context_param(struct pipe_context * _context,enum pipe_context_param param,unsigned value)1947 trace_context_set_context_param(struct pipe_context *_context,
1948 enum pipe_context_param param,
1949 unsigned value)
1950 {
1951 struct trace_context *tr_context = trace_context(_context);
1952 struct pipe_context *context = tr_context->pipe;
1953
1954 trace_dump_call_begin("pipe_context", "set_context_param");
1955
1956 trace_dump_arg(ptr, context);
1957 trace_dump_arg(uint, param);
1958 trace_dump_arg(uint, value);
1959
1960 trace_dump_call_end();
1961
1962 context->set_context_param(context, param, value);
1963 }
1964
1965 static void
trace_context_set_debug_callback(struct pipe_context * _context,const struct util_debug_callback * cb)1966 trace_context_set_debug_callback(struct pipe_context *_context, const struct util_debug_callback *cb)
1967 {
1968 struct trace_context *tr_context = trace_context(_context);
1969 struct pipe_context *context = tr_context->pipe;
1970
1971 trace_dump_call_begin("pipe_context", "set_debug_callback");
1972
1973 trace_dump_arg(ptr, context);
1974
1975 trace_dump_call_end();
1976
1977 context->set_debug_callback(context, cb);
1978 }
1979
1980 static void
trace_context_render_condition(struct pipe_context * _context,struct pipe_query * query,bool condition,enum pipe_render_cond_flag mode)1981 trace_context_render_condition(struct pipe_context *_context,
1982 struct pipe_query *query,
1983 bool condition,
1984 enum pipe_render_cond_flag mode)
1985 {
1986 struct trace_context *tr_context = trace_context(_context);
1987 struct pipe_context *context = tr_context->pipe;
1988
1989 query = trace_query_unwrap(query);
1990
1991 trace_dump_call_begin("pipe_context", "render_condition");
1992
1993 trace_dump_arg(ptr, context);
1994 trace_dump_arg(ptr, query);
1995 trace_dump_arg(bool, condition);
1996 trace_dump_arg(uint, mode);
1997
1998 trace_dump_call_end();
1999
2000 context->render_condition(context, query, condition, mode);
2001 }
2002
2003 static void
trace_context_render_condition_mem(struct pipe_context * _context,struct pipe_resource * buffer,uint32_t offset,bool condition)2004 trace_context_render_condition_mem(struct pipe_context *_context,
2005 struct pipe_resource *buffer,
2006 uint32_t offset,
2007 bool condition)
2008 {
2009 struct trace_context *tr_context = trace_context(_context);
2010 struct pipe_context *context = tr_context->pipe;
2011
2012 trace_dump_call_begin("pipe_context", "render_condition_mem");
2013
2014 trace_dump_arg(ptr, context);
2015 trace_dump_arg(ptr, buffer);
2016 trace_dump_arg(uint, offset);
2017 trace_dump_arg(bool, condition);
2018
2019 trace_dump_call_end();
2020
2021 context->render_condition_mem(context, buffer, offset, condition);
2022 }
2023
2024
2025 static void
trace_context_texture_barrier(struct pipe_context * _context,unsigned flags)2026 trace_context_texture_barrier(struct pipe_context *_context, unsigned flags)
2027 {
2028 struct trace_context *tr_context = trace_context(_context);
2029 struct pipe_context *context = tr_context->pipe;
2030
2031 trace_dump_call_begin("pipe_context", "texture_barrier");
2032
2033 trace_dump_arg(ptr, context);
2034 trace_dump_arg(uint, flags);
2035
2036 trace_dump_call_end();
2037
2038 context->texture_barrier(context, flags);
2039 }
2040
2041
2042 static void
trace_context_memory_barrier(struct pipe_context * _context,unsigned flags)2043 trace_context_memory_barrier(struct pipe_context *_context,
2044 unsigned flags)
2045 {
2046 struct trace_context *tr_context = trace_context(_context);
2047 struct pipe_context *context = tr_context->pipe;
2048
2049 trace_dump_call_begin("pipe_context", "memory_barrier");
2050 trace_dump_arg(ptr, context);
2051 trace_dump_arg(uint, flags);
2052 trace_dump_call_end();
2053
2054 context->memory_barrier(context, flags);
2055 }
2056
2057
2058 static bool
trace_context_resource_commit(struct pipe_context * _context,struct pipe_resource * resource,unsigned level,struct pipe_box * box,bool commit)2059 trace_context_resource_commit(struct pipe_context *_context,
2060 struct pipe_resource *resource,
2061 unsigned level, struct pipe_box *box, bool commit)
2062 {
2063 struct trace_context *tr_context = trace_context(_context);
2064 struct pipe_context *context = tr_context->pipe;
2065
2066 trace_dump_call_begin("pipe_context", "resource_commit");
2067 trace_dump_arg(ptr, context);
2068 trace_dump_arg(ptr, resource);
2069 trace_dump_arg(uint, level);
2070 trace_dump_arg(box, box);
2071 trace_dump_arg(bool, commit);
2072 trace_dump_call_end();
2073
2074 return context->resource_commit(context, resource, level, box, commit);
2075 }
2076
2077 static void
trace_context_set_tess_state(struct pipe_context * _context,const float default_outer_level[4],const float default_inner_level[2])2078 trace_context_set_tess_state(struct pipe_context *_context,
2079 const float default_outer_level[4],
2080 const float default_inner_level[2])
2081 {
2082 struct trace_context *tr_context = trace_context(_context);
2083 struct pipe_context *context = tr_context->pipe;
2084
2085 trace_dump_call_begin("pipe_context", "set_tess_state");
2086 trace_dump_arg(ptr, context);
2087 trace_dump_arg_array(float, default_outer_level, 4);
2088 trace_dump_arg_array(float, default_inner_level, 2);
2089 trace_dump_call_end();
2090
2091 context->set_tess_state(context, default_outer_level, default_inner_level);
2092 }
2093
2094 static void
trace_context_set_patch_vertices(struct pipe_context * _context,uint8_t patch_vertices)2095 trace_context_set_patch_vertices(struct pipe_context *_context,
2096 uint8_t patch_vertices)
2097 {
2098 struct trace_context *tr_context = trace_context(_context);
2099 struct pipe_context *context = tr_context->pipe;
2100
2101 trace_dump_call_begin("pipe_context", "set_patch_vertices");
2102 trace_dump_arg(ptr, context);
2103 trace_dump_arg(uint, patch_vertices);
2104 trace_dump_call_end();
2105
2106 context->set_patch_vertices(context, patch_vertices);
2107 }
2108
trace_context_set_shader_buffers(struct pipe_context * _context,enum pipe_shader_type shader,unsigned start,unsigned nr,const struct pipe_shader_buffer * buffers,unsigned writable_bitmask)2109 static void trace_context_set_shader_buffers(struct pipe_context *_context,
2110 enum pipe_shader_type shader,
2111 unsigned start, unsigned nr,
2112 const struct pipe_shader_buffer *buffers,
2113 unsigned writable_bitmask)
2114 {
2115 struct trace_context *tr_context = trace_context(_context);
2116 struct pipe_context *context = tr_context->pipe;
2117
2118 trace_dump_call_begin("pipe_context", "set_shader_buffers");
2119 trace_dump_arg(ptr, context);
2120 trace_dump_arg(uint, shader);
2121 trace_dump_arg(uint, start);
2122 trace_dump_arg_begin("buffers");
2123 trace_dump_struct_array(shader_buffer, buffers, nr);
2124 trace_dump_arg_end();
2125 trace_dump_arg(uint, writable_bitmask);
2126 trace_dump_call_end();
2127
2128 context->set_shader_buffers(context, shader, start, nr, buffers,
2129 writable_bitmask);
2130 }
2131
trace_context_set_shader_images(struct pipe_context * _context,enum pipe_shader_type shader,unsigned start,unsigned nr,unsigned unbind_num_trailing_slots,const struct pipe_image_view * images)2132 static void trace_context_set_shader_images(struct pipe_context *_context,
2133 enum pipe_shader_type shader,
2134 unsigned start, unsigned nr,
2135 unsigned unbind_num_trailing_slots,
2136 const struct pipe_image_view *images)
2137 {
2138 struct trace_context *tr_context = trace_context(_context);
2139 struct pipe_context *context = tr_context->pipe;
2140
2141 trace_dump_call_begin("pipe_context", "set_shader_images");
2142 trace_dump_arg(ptr, context);
2143 trace_dump_arg(uint, shader);
2144 trace_dump_arg(uint, start);
2145 trace_dump_arg_begin("images");
2146 trace_dump_struct_array(image_view, images, nr);
2147 trace_dump_arg_end();
2148 trace_dump_arg(uint, unbind_num_trailing_slots);
2149 trace_dump_call_end();
2150
2151 context->set_shader_images(context, shader, start, nr,
2152 unbind_num_trailing_slots, images);
2153 }
2154
trace_context_launch_grid(struct pipe_context * _pipe,const struct pipe_grid_info * info)2155 static void trace_context_launch_grid(struct pipe_context *_pipe,
2156 const struct pipe_grid_info *info)
2157 {
2158 struct trace_context *tr_ctx = trace_context(_pipe);
2159 struct pipe_context *pipe = tr_ctx->pipe;
2160
2161 trace_dump_call_begin("pipe_context", "launch_grid");
2162
2163 trace_dump_arg(ptr, pipe);
2164 trace_dump_arg(grid_info, info);
2165
2166 trace_dump_trace_flush();
2167
2168 pipe->launch_grid(pipe, info);
2169
2170 trace_dump_call_end();
2171 }
2172
trace_context_create_texture_handle(struct pipe_context * _pipe,struct pipe_sampler_view * view,const struct pipe_sampler_state * state)2173 static uint64_t trace_context_create_texture_handle(struct pipe_context *_pipe,
2174 struct pipe_sampler_view *view,
2175 const struct pipe_sampler_state *state)
2176 {
2177 struct trace_context *tr_ctx = trace_context(_pipe);
2178 struct pipe_context *pipe = tr_ctx->pipe;
2179 uint64_t handle;
2180
2181 trace_dump_call_begin("pipe_context", "create_texture_handle");
2182 trace_dump_arg(ptr, pipe);
2183 trace_dump_arg(ptr, view);
2184 trace_dump_arg_begin("state");
2185 trace_dump_arg(sampler_state, state);
2186 trace_dump_arg_end();
2187
2188 handle = pipe->create_texture_handle(pipe, view, state);
2189
2190 trace_dump_ret(uint, handle);
2191 trace_dump_call_end();
2192
2193 return handle;
2194 }
2195
trace_context_delete_texture_handle(struct pipe_context * _pipe,uint64_t handle)2196 static void trace_context_delete_texture_handle(struct pipe_context *_pipe,
2197 uint64_t handle)
2198 {
2199 struct trace_context *tr_ctx = trace_context(_pipe);
2200 struct pipe_context *pipe = tr_ctx->pipe;
2201
2202 trace_dump_call_begin("pipe_context", "delete_texture_handle");
2203 trace_dump_arg(ptr, pipe);
2204 trace_dump_arg(uint, handle);
2205 trace_dump_call_end();
2206
2207 pipe->delete_texture_handle(pipe, handle);
2208 }
2209
trace_context_make_texture_handle_resident(struct pipe_context * _pipe,uint64_t handle,bool resident)2210 static void trace_context_make_texture_handle_resident(struct pipe_context *_pipe,
2211 uint64_t handle,
2212 bool resident)
2213 {
2214 struct trace_context *tr_ctx = trace_context(_pipe);
2215 struct pipe_context *pipe = tr_ctx->pipe;
2216
2217 trace_dump_call_begin("pipe_context", "make_texture_handle_resident");
2218 trace_dump_arg(ptr, pipe);
2219 trace_dump_arg(uint, handle);
2220 trace_dump_arg(bool, resident);
2221 trace_dump_call_end();
2222
2223 pipe->make_texture_handle_resident(pipe, handle, resident);
2224 }
2225
trace_context_create_image_handle(struct pipe_context * _pipe,const struct pipe_image_view * image)2226 static uint64_t trace_context_create_image_handle(struct pipe_context *_pipe,
2227 const struct pipe_image_view *image)
2228 {
2229 struct trace_context *tr_ctx = trace_context(_pipe);
2230 struct pipe_context *pipe = tr_ctx->pipe;
2231 uint64_t handle;
2232
2233 trace_dump_call_begin("pipe_context", "create_image_handle");
2234 trace_dump_arg(ptr, pipe);
2235 trace_dump_arg_begin("image");
2236 trace_dump_image_view(image);
2237 trace_dump_arg_end();
2238
2239 handle = pipe->create_image_handle(pipe, image);
2240
2241 trace_dump_ret(uint, handle);
2242 trace_dump_call_end();
2243
2244 return handle;
2245 }
2246
trace_context_delete_image_handle(struct pipe_context * _pipe,uint64_t handle)2247 static void trace_context_delete_image_handle(struct pipe_context *_pipe,
2248 uint64_t handle)
2249 {
2250 struct trace_context *tr_ctx = trace_context(_pipe);
2251 struct pipe_context *pipe = tr_ctx->pipe;
2252
2253 trace_dump_call_begin("pipe_context", "delete_image_handle");
2254 trace_dump_arg(ptr, pipe);
2255 trace_dump_arg(uint, handle);
2256 trace_dump_call_end();
2257
2258 pipe->delete_image_handle(pipe, handle);
2259 }
2260
trace_context_make_image_handle_resident(struct pipe_context * _pipe,uint64_t handle,unsigned access,bool resident)2261 static void trace_context_make_image_handle_resident(struct pipe_context *_pipe,
2262 uint64_t handle,
2263 unsigned access,
2264 bool resident)
2265 {
2266 struct trace_context *tr_ctx = trace_context(_pipe);
2267 struct pipe_context *pipe = tr_ctx->pipe;
2268
2269 trace_dump_call_begin("pipe_context", "make_image_handle_resident");
2270 trace_dump_arg(ptr, pipe);
2271 trace_dump_arg(uint, handle);
2272 trace_dump_arg(uint, access);
2273 trace_dump_arg(bool, resident);
2274 trace_dump_call_end();
2275
2276 pipe->make_image_handle_resident(pipe, handle, access, resident);
2277 }
2278
2279 struct pipe_context *
trace_context_create(struct trace_screen * tr_scr,struct pipe_context * pipe)2280 trace_context_create(struct trace_screen *tr_scr,
2281 struct pipe_context *pipe)
2282 {
2283 struct trace_context *tr_ctx;
2284
2285 if (!pipe)
2286 goto error1;
2287
2288 if (!trace_enabled())
2289 goto error1;
2290
2291 tr_ctx = rzalloc(NULL, struct trace_context);
2292 if (!tr_ctx)
2293 goto error1;
2294
2295 _mesa_hash_table_init(&tr_ctx->blend_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2296 _mesa_hash_table_init(&tr_ctx->rasterizer_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2297 _mesa_hash_table_init(&tr_ctx->depth_stencil_alpha_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2298
2299 tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
2300 tr_ctx->base.screen = &tr_scr->base;
2301 tr_ctx->base.stream_uploader = pipe->stream_uploader;
2302 tr_ctx->base.const_uploader = pipe->const_uploader;
2303
2304 tr_ctx->base.destroy = trace_context_destroy;
2305
2306 #define TR_CTX_INIT(_member) \
2307 tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL
2308
2309 TR_CTX_INIT(draw_vbo);
2310 TR_CTX_INIT(draw_vertex_state);
2311 TR_CTX_INIT(render_condition);
2312 TR_CTX_INIT(render_condition_mem);
2313 TR_CTX_INIT(create_query);
2314 TR_CTX_INIT(destroy_query);
2315 TR_CTX_INIT(begin_query);
2316 TR_CTX_INIT(end_query);
2317 TR_CTX_INIT(get_query_result);
2318 TR_CTX_INIT(get_query_result_resource);
2319 TR_CTX_INIT(set_active_query_state);
2320 TR_CTX_INIT(create_blend_state);
2321 TR_CTX_INIT(bind_blend_state);
2322 TR_CTX_INIT(delete_blend_state);
2323 TR_CTX_INIT(create_sampler_state);
2324 TR_CTX_INIT(bind_sampler_states);
2325 TR_CTX_INIT(delete_sampler_state);
2326 TR_CTX_INIT(create_rasterizer_state);
2327 TR_CTX_INIT(bind_rasterizer_state);
2328 TR_CTX_INIT(delete_rasterizer_state);
2329 TR_CTX_INIT(create_depth_stencil_alpha_state);
2330 TR_CTX_INIT(bind_depth_stencil_alpha_state);
2331 TR_CTX_INIT(delete_depth_stencil_alpha_state);
2332 TR_CTX_INIT(create_fs_state);
2333 TR_CTX_INIT(bind_fs_state);
2334 TR_CTX_INIT(delete_fs_state);
2335 TR_CTX_INIT(create_vs_state);
2336 TR_CTX_INIT(bind_vs_state);
2337 TR_CTX_INIT(delete_vs_state);
2338 TR_CTX_INIT(create_gs_state);
2339 TR_CTX_INIT(bind_gs_state);
2340 TR_CTX_INIT(delete_gs_state);
2341 TR_CTX_INIT(create_tcs_state);
2342 TR_CTX_INIT(bind_tcs_state);
2343 TR_CTX_INIT(delete_tcs_state);
2344 TR_CTX_INIT(create_tes_state);
2345 TR_CTX_INIT(bind_tes_state);
2346 TR_CTX_INIT(delete_tes_state);
2347 TR_CTX_INIT(create_compute_state);
2348 TR_CTX_INIT(bind_compute_state);
2349 TR_CTX_INIT(delete_compute_state);
2350 TR_CTX_INIT(link_shader);
2351 TR_CTX_INIT(create_vertex_elements_state);
2352 TR_CTX_INIT(bind_vertex_elements_state);
2353 TR_CTX_INIT(delete_vertex_elements_state);
2354 TR_CTX_INIT(set_blend_color);
2355 TR_CTX_INIT(set_stencil_ref);
2356 TR_CTX_INIT(set_clip_state);
2357 TR_CTX_INIT(set_sample_mask);
2358 TR_CTX_INIT(set_constant_buffer);
2359 TR_CTX_INIT(set_framebuffer_state);
2360 TR_CTX_INIT(set_inlinable_constants);
2361 TR_CTX_INIT(set_polygon_stipple);
2362 TR_CTX_INIT(set_min_samples);
2363 TR_CTX_INIT(set_scissor_states);
2364 TR_CTX_INIT(set_viewport_states);
2365 TR_CTX_INIT(set_sampler_views);
2366 TR_CTX_INIT(create_sampler_view);
2367 TR_CTX_INIT(sampler_view_destroy);
2368 TR_CTX_INIT(create_surface);
2369 TR_CTX_INIT(surface_destroy);
2370 TR_CTX_INIT(set_vertex_buffers);
2371 TR_CTX_INIT(create_stream_output_target);
2372 TR_CTX_INIT(stream_output_target_destroy);
2373 TR_CTX_INIT(set_stream_output_targets);
2374 /* this is lavapipe-only and can't be traced */
2375 tr_ctx->base.stream_output_target_offset = pipe->stream_output_target_offset;
2376 TR_CTX_INIT(resource_copy_region);
2377 TR_CTX_INIT(blit);
2378 TR_CTX_INIT(flush_resource);
2379 TR_CTX_INIT(clear);
2380 TR_CTX_INIT(clear_render_target);
2381 TR_CTX_INIT(clear_depth_stencil);
2382 TR_CTX_INIT(clear_texture);
2383 TR_CTX_INIT(clear_buffer);
2384 TR_CTX_INIT(flush);
2385 TR_CTX_INIT(create_fence_fd);
2386 TR_CTX_INIT(fence_server_sync);
2387 TR_CTX_INIT(fence_server_signal);
2388 TR_CTX_INIT(generate_mipmap);
2389 TR_CTX_INIT(texture_barrier);
2390 TR_CTX_INIT(memory_barrier);
2391 TR_CTX_INIT(resource_commit);
2392 TR_CTX_INIT(set_tess_state);
2393 TR_CTX_INIT(set_patch_vertices);
2394 TR_CTX_INIT(set_shader_buffers);
2395 TR_CTX_INIT(launch_grid);
2396 TR_CTX_INIT(set_shader_images);
2397 TR_CTX_INIT(create_texture_handle);
2398 TR_CTX_INIT(delete_texture_handle);
2399 TR_CTX_INIT(make_texture_handle_resident);
2400 TR_CTX_INIT(create_image_handle);
2401 TR_CTX_INIT(delete_image_handle);
2402 TR_CTX_INIT(make_image_handle_resident);
2403
2404 tr_ctx->base.buffer_map = tr_ctx->base.texture_map = trace_context_transfer_map;
2405 tr_ctx->base.buffer_unmap = tr_ctx->base.texture_unmap = trace_context_transfer_unmap;
2406 TR_CTX_INIT(transfer_flush_region);
2407 TR_CTX_INIT(buffer_subdata);
2408 TR_CTX_INIT(texture_subdata);
2409 TR_CTX_INIT(invalidate_resource);
2410 TR_CTX_INIT(set_context_param);
2411 TR_CTX_INIT(set_debug_callback);
2412
2413 #undef TR_CTX_INIT
2414
2415 tr_ctx->pipe = pipe;
2416
2417 return &tr_ctx->base;
2418
2419 error1:
2420 return pipe;
2421 }
2422
2423
2424 /**
2425 * Sanity checker: check that the given context really is a
2426 * trace context (and not the wrapped driver's context).
2427 */
2428 void
trace_context_check(const struct pipe_context * pipe)2429 trace_context_check(const struct pipe_context *pipe)
2430 {
2431 ASSERTED struct trace_context *tr_ctx = (struct trace_context *) pipe;
2432 assert(tr_ctx->base.destroy == trace_context_destroy);
2433 }
2434
2435 /**
2436 * Threaded context is not wrapped, and so it may call fence functions directly
2437 */
2438 struct pipe_context *
trace_get_possibly_threaded_context(struct pipe_context * pipe)2439 trace_get_possibly_threaded_context(struct pipe_context *pipe)
2440 {
2441 return pipe->destroy == trace_context_destroy ? ((struct trace_context*)pipe)->pipe : pipe;
2442 }
2443