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