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