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/format/u_format.h"
29 #include "util/u_memory.h"
30 #include "util/hash_table.h"
31
32 #include "tr_dump.h"
33 #include "tr_dump_defines.h"
34 #include "tr_dump_state.h"
35 #include "tr_texture.h"
36 #include "tr_context.h"
37 #include "tr_screen.h"
38 #include "tr_public.h"
39 #include "tr_util.h"
40
41
42 static bool trace = false;
43 static struct hash_table *trace_screens;
44
45 static const char *
trace_screen_get_name(struct pipe_screen * _screen)46 trace_screen_get_name(struct pipe_screen *_screen)
47 {
48 struct trace_screen *tr_scr = trace_screen(_screen);
49 struct pipe_screen *screen = tr_scr->screen;
50 const char *result;
51
52 trace_dump_call_begin("pipe_screen", "get_name");
53
54 trace_dump_arg(ptr, screen);
55
56 result = screen->get_name(screen);
57
58 trace_dump_ret(string, result);
59
60 trace_dump_call_end();
61
62 return result;
63 }
64
65
66 static const char *
trace_screen_get_vendor(struct pipe_screen * _screen)67 trace_screen_get_vendor(struct pipe_screen *_screen)
68 {
69 struct trace_screen *tr_scr = trace_screen(_screen);
70 struct pipe_screen *screen = tr_scr->screen;
71 const char *result;
72
73 trace_dump_call_begin("pipe_screen", "get_vendor");
74
75 trace_dump_arg(ptr, screen);
76
77 result = screen->get_vendor(screen);
78
79 trace_dump_ret(string, result);
80
81 trace_dump_call_end();
82
83 return result;
84 }
85
86
87 static const char *
trace_screen_get_device_vendor(struct pipe_screen * _screen)88 trace_screen_get_device_vendor(struct pipe_screen *_screen)
89 {
90 struct trace_screen *tr_scr = trace_screen(_screen);
91 struct pipe_screen *screen = tr_scr->screen;
92 const char *result;
93
94 trace_dump_call_begin("pipe_screen", "get_device_vendor");
95
96 trace_dump_arg(ptr, screen);
97
98 result = screen->get_device_vendor(screen);
99
100 trace_dump_ret(string, result);
101
102 trace_dump_call_end();
103
104 return result;
105 }
106
107
108 static const void *
trace_screen_get_compiler_options(struct pipe_screen * _screen,enum pipe_shader_ir ir,enum pipe_shader_type shader)109 trace_screen_get_compiler_options(struct pipe_screen *_screen,
110 enum pipe_shader_ir ir,
111 enum pipe_shader_type shader)
112 {
113 struct trace_screen *tr_scr = trace_screen(_screen);
114 struct pipe_screen *screen = tr_scr->screen;
115 const void *result;
116
117 trace_dump_call_begin("pipe_screen", "get_compiler_options");
118
119 trace_dump_arg(ptr, screen);
120 trace_dump_arg_enum(pipe_shader_ir, ir);
121 trace_dump_arg_enum(pipe_shader_type, shader);
122
123 result = screen->get_compiler_options(screen, ir, shader);
124
125 trace_dump_ret(ptr, result);
126
127 trace_dump_call_end();
128
129 return result;
130 }
131
132
133 static struct disk_cache *
trace_screen_get_disk_shader_cache(struct pipe_screen * _screen)134 trace_screen_get_disk_shader_cache(struct pipe_screen *_screen)
135 {
136 struct trace_screen *tr_scr = trace_screen(_screen);
137 struct pipe_screen *screen = tr_scr->screen;
138
139 trace_dump_call_begin("pipe_screen", "get_disk_shader_cache");
140
141 trace_dump_arg(ptr, screen);
142
143 struct disk_cache *result = screen->get_disk_shader_cache(screen);
144
145 trace_dump_ret(ptr, result);
146
147 trace_dump_call_end();
148
149 return result;
150 }
151
152
153 static int
trace_screen_get_param(struct pipe_screen * _screen,enum pipe_cap param)154 trace_screen_get_param(struct pipe_screen *_screen,
155 enum pipe_cap param)
156 {
157 struct trace_screen *tr_scr = trace_screen(_screen);
158 struct pipe_screen *screen = tr_scr->screen;
159 int result;
160
161 trace_dump_call_begin("pipe_screen", "get_param");
162
163 trace_dump_arg(ptr, screen);
164 trace_dump_arg_enum(pipe_cap, param);
165
166 result = screen->get_param(screen, param);
167
168 trace_dump_ret(int, result);
169
170 trace_dump_call_end();
171
172 return result;
173 }
174
175
176 static int
trace_screen_get_shader_param(struct pipe_screen * _screen,enum pipe_shader_type shader,enum pipe_shader_cap param)177 trace_screen_get_shader_param(struct pipe_screen *_screen,
178 enum pipe_shader_type shader,
179 enum pipe_shader_cap param)
180 {
181 struct trace_screen *tr_scr = trace_screen(_screen);
182 struct pipe_screen *screen = tr_scr->screen;
183 int result;
184
185 trace_dump_call_begin("pipe_screen", "get_shader_param");
186
187 trace_dump_arg(ptr, screen);
188 trace_dump_arg_enum(pipe_shader_type, shader);
189 trace_dump_arg_enum(pipe_shader_cap, param);
190
191 result = screen->get_shader_param(screen, shader, param);
192
193 trace_dump_ret(int, result);
194
195 trace_dump_call_end();
196
197 return result;
198 }
199
200
201 static float
trace_screen_get_paramf(struct pipe_screen * _screen,enum pipe_capf param)202 trace_screen_get_paramf(struct pipe_screen *_screen,
203 enum pipe_capf param)
204 {
205 struct trace_screen *tr_scr = trace_screen(_screen);
206 struct pipe_screen *screen = tr_scr->screen;
207 float result;
208
209 trace_dump_call_begin("pipe_screen", "get_paramf");
210
211 trace_dump_arg(ptr, screen);
212 trace_dump_arg_enum(pipe_capf, param);
213
214 result = screen->get_paramf(screen, param);
215
216 trace_dump_ret(float, result);
217
218 trace_dump_call_end();
219
220 return result;
221 }
222
223
224 static int
trace_screen_get_compute_param(struct pipe_screen * _screen,enum pipe_shader_ir ir_type,enum pipe_compute_cap param,void * data)225 trace_screen_get_compute_param(struct pipe_screen *_screen,
226 enum pipe_shader_ir ir_type,
227 enum pipe_compute_cap param,
228 void *data)
229 {
230 struct trace_screen *tr_scr = trace_screen(_screen);
231 struct pipe_screen *screen = tr_scr->screen;
232 int result;
233
234 trace_dump_call_begin("pipe_screen", "get_compute_param");
235
236 trace_dump_arg(ptr, screen);
237 trace_dump_arg_enum(pipe_shader_ir, ir_type);
238 trace_dump_arg_enum(pipe_compute_cap, param);
239 trace_dump_arg(ptr, data);
240
241 result = screen->get_compute_param(screen, ir_type, param, data);
242
243 trace_dump_ret(int, result);
244
245 trace_dump_call_end();
246
247 return result;
248 }
249
250 static int
trace_screen_get_video_param(struct pipe_screen * _screen,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint,enum pipe_video_cap param)251 trace_screen_get_video_param(struct pipe_screen *_screen,
252 enum pipe_video_profile profile,
253 enum pipe_video_entrypoint entrypoint,
254 enum pipe_video_cap param)
255 {
256 struct trace_screen *tr_scr = trace_screen(_screen);
257 struct pipe_screen *screen = tr_scr->screen;
258 int result;
259
260 trace_dump_call_begin("pipe_screen", "get_video_param");
261
262 trace_dump_arg(ptr, screen);
263 trace_dump_arg_enum(pipe_video_profile, profile);
264 trace_dump_arg_enum(pipe_video_entrypoint, entrypoint);
265 trace_dump_arg_enum(pipe_video_cap, param);
266
267 result = screen->get_video_param(screen, profile, entrypoint, param);
268
269 trace_dump_ret(int, result);
270
271 trace_dump_call_end();
272
273 return result;
274 }
275
276 static bool
trace_screen_is_format_supported(struct pipe_screen * _screen,enum pipe_format format,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned tex_usage)277 trace_screen_is_format_supported(struct pipe_screen *_screen,
278 enum pipe_format format,
279 enum pipe_texture_target target,
280 unsigned sample_count,
281 unsigned storage_sample_count,
282 unsigned tex_usage)
283 {
284 struct trace_screen *tr_scr = trace_screen(_screen);
285 struct pipe_screen *screen = tr_scr->screen;
286 bool result;
287
288 trace_dump_call_begin("pipe_screen", "is_format_supported");
289
290 trace_dump_arg(ptr, screen);
291 trace_dump_arg(format, format);
292 trace_dump_arg_enum(pipe_texture_target, target);
293 trace_dump_arg(uint, sample_count);
294 trace_dump_arg(uint, storage_sample_count);
295 trace_dump_arg(uint, tex_usage);
296
297 result = screen->is_format_supported(screen, format, target, sample_count,
298 storage_sample_count, tex_usage);
299
300 trace_dump_ret(bool, result);
301
302 trace_dump_call_end();
303
304 return result;
305 }
306
307 static bool
trace_screen_is_video_format_supported(struct pipe_screen * _screen,enum pipe_format format,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint)308 trace_screen_is_video_format_supported(struct pipe_screen *_screen,
309 enum pipe_format format,
310 enum pipe_video_profile profile,
311 enum pipe_video_entrypoint entrypoint)
312 {
313 struct trace_screen *tr_scr = trace_screen(_screen);
314 struct pipe_screen *screen = tr_scr->screen;
315 bool result;
316
317 trace_dump_call_begin("pipe_screen", "is_video_format_supported");
318
319 trace_dump_arg(ptr, screen);
320 trace_dump_arg(format, format);
321 trace_dump_arg_enum(pipe_video_profile, profile);
322 trace_dump_arg_enum(pipe_video_entrypoint, entrypoint);
323
324 result = screen->is_video_format_supported(screen, format, profile, entrypoint);
325
326 trace_dump_ret(bool, result);
327
328 trace_dump_call_end();
329
330 return result;
331 }
332
333 static void
trace_screen_driver_thread_add_job(struct pipe_screen * _screen,void * data,struct util_queue_fence * fence,pipe_driver_thread_func execute,pipe_driver_thread_func cleanup,const size_t job_size)334 trace_screen_driver_thread_add_job(struct pipe_screen *_screen,
335 void *data, struct util_queue_fence *fence,
336 pipe_driver_thread_func execute,
337 pipe_driver_thread_func cleanup,
338 const size_t job_size)
339 {
340 struct trace_screen *tr_scr = trace_screen(_screen);
341 struct pipe_screen *screen = tr_scr->screen;
342
343 trace_dump_call_begin("pipe_screen", "driver_thread_add_job");
344
345 trace_dump_arg(ptr, screen);
346 trace_dump_arg(ptr, data);
347 trace_dump_arg(ptr, fence);
348
349 screen->driver_thread_add_job(screen, data, fence, execute, cleanup, job_size);
350
351 trace_dump_call_end();
352 }
353
354 static void
trace_context_replace_buffer_storage(struct pipe_context * _pipe,struct pipe_resource * dst,struct pipe_resource * src,unsigned num_rebinds,uint32_t rebind_mask,unsigned delete_buffer_id)355 trace_context_replace_buffer_storage(struct pipe_context *_pipe,
356 struct pipe_resource *dst,
357 struct pipe_resource *src,
358 unsigned num_rebinds,
359 uint32_t rebind_mask,
360 unsigned delete_buffer_id)
361 {
362 struct trace_context *tr_ctx = trace_context(_pipe);
363 struct pipe_context *pipe = tr_ctx->pipe;
364
365 trace_dump_call_begin("pipe_context", "replace_buffer_storage");
366
367 trace_dump_arg(ptr, pipe);
368 trace_dump_arg(ptr, dst);
369 trace_dump_arg(ptr, src);
370 trace_dump_arg(uint, num_rebinds);
371 trace_dump_arg(uint, rebind_mask);
372 trace_dump_arg(uint, delete_buffer_id);
373 trace_dump_call_end();
374
375 tr_ctx->replace_buffer_storage(pipe, dst, src, num_rebinds, rebind_mask, delete_buffer_id);
376 }
377
378 static struct pipe_fence_handle *
trace_context_create_fence(struct pipe_context * _pipe,struct tc_unflushed_batch_token * token)379 trace_context_create_fence(struct pipe_context *_pipe, struct tc_unflushed_batch_token *token)
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", "create_fence");
385
386 trace_dump_arg(ptr, pipe);
387 trace_dump_arg(ptr, token);
388
389 struct pipe_fence_handle *ret = tr_ctx->create_fence(pipe, token);
390 trace_dump_ret(ptr, ret);
391 trace_dump_call_end();
392
393 return ret;
394 }
395
396 static bool
trace_context_is_resource_busy(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned usage)397 trace_context_is_resource_busy(struct pipe_screen *_screen,
398 struct pipe_resource *resource,
399 unsigned usage)
400 {
401 struct trace_screen *tr_scr = trace_screen(_screen);
402 struct pipe_screen *screen = tr_scr->screen;
403 bool result;
404
405 trace_dump_call_begin("pipe_screen", "is_resource_busy");
406
407 trace_dump_arg(ptr, screen);
408 trace_dump_arg(ptr, resource);
409 trace_dump_arg(uint, usage);
410
411 result = tr_scr->is_resource_busy(screen, resource, usage);
412
413 trace_dump_ret(bool, result);
414
415 trace_dump_call_end();
416
417 return result;
418 }
419
420 struct pipe_context *
trace_context_create_threaded(struct pipe_screen * screen,struct pipe_context * pipe,tc_replace_buffer_storage_func * replace_buffer,struct threaded_context_options * options)421 trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,
422 tc_replace_buffer_storage_func *replace_buffer,
423 struct threaded_context_options *options)
424 {
425 if (!trace_screens)
426 return pipe;
427
428 struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
429 if (!he)
430 return pipe;
431 struct trace_screen *tr_scr = trace_screen(he->data);
432
433 if (tr_scr->trace_tc)
434 return pipe;
435
436 struct pipe_context *ctx = trace_context_create(tr_scr, pipe);
437 if (!ctx)
438 return pipe;
439
440 struct trace_context *tr_ctx = trace_context(ctx);
441 tr_ctx->replace_buffer_storage = *replace_buffer;
442 tr_ctx->create_fence = options->create_fence;
443 tr_scr->is_resource_busy = options->is_resource_busy;
444 tr_ctx->threaded = true;
445 *replace_buffer = trace_context_replace_buffer_storage;
446 if (options->create_fence)
447 options->create_fence = trace_context_create_fence;
448 if (options->is_resource_busy)
449 options->is_resource_busy = trace_context_is_resource_busy;
450 return ctx;
451 }
452
453 static struct pipe_context *
trace_screen_context_create(struct pipe_screen * _screen,void * priv,unsigned flags)454 trace_screen_context_create(struct pipe_screen *_screen, void *priv,
455 unsigned flags)
456 {
457 struct trace_screen *tr_scr = trace_screen(_screen);
458 struct pipe_screen *screen = tr_scr->screen;
459 struct pipe_context *result;
460
461 result = screen->context_create(screen, priv, flags);
462
463 trace_dump_call_begin("pipe_screen", "context_create");
464
465 trace_dump_arg(ptr, screen);
466 trace_dump_arg(ptr, priv);
467 trace_dump_arg(uint, flags);
468
469 trace_dump_ret(ptr, result);
470
471 trace_dump_call_end();
472
473 if (result && (tr_scr->trace_tc || result->draw_vbo != tc_draw_vbo))
474 result = trace_context_create(tr_scr, result);
475
476 return result;
477 }
478
479
480 static void
trace_screen_flush_frontbuffer(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,unsigned level,unsigned layer,void * context_private,struct pipe_box * sub_box)481 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
482 struct pipe_context *_pipe,
483 struct pipe_resource *resource,
484 unsigned level, unsigned layer,
485 void *context_private,
486 struct pipe_box *sub_box)
487 {
488 struct trace_screen *tr_scr = trace_screen(_screen);
489 struct pipe_screen *screen = tr_scr->screen;
490 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
491
492 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
493
494 trace_dump_arg(ptr, screen);
495 trace_dump_arg(ptr, resource);
496 trace_dump_arg(uint, level);
497 trace_dump_arg(uint, layer);
498 /* XXX: hide, as there is nothing we can do with this
499 trace_dump_arg(ptr, context_private);
500 */
501
502 trace_dump_call_end();
503
504 screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, sub_box);
505 }
506
507
508 static void
trace_screen_get_driver_uuid(struct pipe_screen * _screen,char * uuid)509 trace_screen_get_driver_uuid(struct pipe_screen *_screen, char *uuid)
510 {
511 struct pipe_screen *screen = trace_screen(_screen)->screen;
512
513 trace_dump_call_begin("pipe_screen", "get_driver_uuid");
514 trace_dump_arg(ptr, screen);
515
516 screen->get_driver_uuid(screen, uuid);
517
518 trace_dump_ret(string, uuid);
519 trace_dump_call_end();
520 }
521
522 static void
trace_screen_get_device_uuid(struct pipe_screen * _screen,char * uuid)523 trace_screen_get_device_uuid(struct pipe_screen *_screen, char *uuid)
524 {
525 struct pipe_screen *screen = trace_screen(_screen)->screen;
526
527 trace_dump_call_begin("pipe_screen", "get_device_uuid");
528 trace_dump_arg(ptr, screen);
529
530 screen->get_device_uuid(screen, uuid);
531
532 trace_dump_ret(string, uuid);
533 trace_dump_call_end();
534 }
535
536 static void
trace_screen_get_device_luid(struct pipe_screen * _screen,char * luid)537 trace_screen_get_device_luid(struct pipe_screen *_screen, char *luid)
538 {
539 struct pipe_screen *screen = trace_screen(_screen)->screen;
540
541 trace_dump_call_begin("pipe_screen", "get_device_luid");
542 trace_dump_arg(ptr, screen);
543
544 screen->get_device_luid(screen, luid);
545
546 trace_dump_ret(string, luid);
547 trace_dump_call_end();
548 }
549
550 static uint32_t
trace_screen_get_device_node_mask(struct pipe_screen * _screen)551 trace_screen_get_device_node_mask(struct pipe_screen *_screen)
552 {
553 struct pipe_screen *screen = trace_screen(_screen)->screen;
554 uint32_t result;
555
556 trace_dump_call_begin("pipe_screen", "get_device_node_mask");
557 trace_dump_arg(ptr, screen);
558
559 result = screen->get_device_node_mask(screen);
560
561 trace_dump_ret(uint, result);
562 trace_dump_call_end();
563
564 return result;
565 }
566
567
568 /********************************************************************
569 * texture
570 */
571
572 static void *
trace_screen_map_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)573 trace_screen_map_memory(struct pipe_screen *_screen,
574 struct pipe_memory_allocation *pmem)
575 {
576 struct trace_screen *tr_scr = trace_screen(_screen);
577 struct pipe_screen *screen = tr_scr->screen;
578 void *result;
579
580 trace_dump_call_begin("pipe_screen", "map_memory");
581
582 trace_dump_arg(ptr, screen);
583 trace_dump_arg(ptr, pmem);
584
585 result = screen->map_memory(screen, pmem);
586
587 trace_dump_ret(ptr, result);
588
589 trace_dump_call_end();
590
591 return result;
592 }
593
594 static void
trace_screen_unmap_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)595 trace_screen_unmap_memory(struct pipe_screen *_screen,
596 struct pipe_memory_allocation *pmem)
597 {
598 struct trace_screen *tr_scr = trace_screen(_screen);
599 struct pipe_screen *screen = tr_scr->screen;
600
601 trace_dump_call_begin("pipe_screen", "unmap_memory");
602
603 trace_dump_arg(ptr, screen);
604 trace_dump_arg(ptr, pmem);
605
606 screen->unmap_memory(screen, pmem);
607
608
609 trace_dump_call_end();
610 }
611
612 static struct pipe_memory_allocation *
trace_screen_allocate_memory(struct pipe_screen * _screen,uint64_t size)613 trace_screen_allocate_memory(struct pipe_screen *_screen,
614 uint64_t size)
615 {
616 struct trace_screen *tr_scr = trace_screen(_screen);
617 struct pipe_screen *screen = tr_scr->screen;
618 struct pipe_memory_allocation *result;
619
620 trace_dump_call_begin("pipe_screen", "allocate_memory");
621
622 trace_dump_arg(ptr, screen);
623 trace_dump_arg(uint, size);
624
625 result = screen->allocate_memory(screen, size);
626
627 trace_dump_ret(ptr, result);
628
629 trace_dump_call_end();
630
631 return result;
632 }
633
634 static struct pipe_memory_allocation *
trace_screen_allocate_memory_fd(struct pipe_screen * _screen,uint64_t size,int * fd)635 trace_screen_allocate_memory_fd(struct pipe_screen *_screen,
636 uint64_t size,
637 int *fd)
638 {
639 struct trace_screen *tr_scr = trace_screen(_screen);
640 struct pipe_screen *screen = tr_scr->screen;
641 struct pipe_memory_allocation *result;
642
643 trace_dump_call_begin("pipe_screen", "allocate_memory_fd");
644
645 trace_dump_arg(ptr, screen);
646 trace_dump_arg(uint, size);
647 trace_dump_arg(ptr, fd);
648
649 result = screen->allocate_memory_fd(screen, size, fd);
650
651 trace_dump_ret(ptr, result);
652
653 trace_dump_call_end();
654
655 return result;
656 }
657
658 static void
trace_screen_free_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)659 trace_screen_free_memory(struct pipe_screen *_screen,
660 struct pipe_memory_allocation *pmem)
661 {
662 struct trace_screen *tr_scr = trace_screen(_screen);
663 struct pipe_screen *screen = tr_scr->screen;
664
665 trace_dump_call_begin("pipe_screen", "free_memory");
666
667 trace_dump_arg(ptr, screen);
668 trace_dump_arg(ptr, pmem);
669
670 screen->free_memory(screen, pmem);
671
672
673 trace_dump_call_end();
674 }
675
676 static void
trace_screen_free_memory_fd(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)677 trace_screen_free_memory_fd(struct pipe_screen *_screen,
678 struct pipe_memory_allocation *pmem)
679 {
680 struct trace_screen *tr_scr = trace_screen(_screen);
681 struct pipe_screen *screen = tr_scr->screen;
682
683 trace_dump_call_begin("pipe_screen", "free_memory_fd");
684
685 trace_dump_arg(ptr, screen);
686 trace_dump_arg(ptr, pmem);
687
688 screen->free_memory_fd(screen, pmem);
689
690
691 trace_dump_call_end();
692 }
693
694 static bool
trace_screen_resource_bind_backing(struct pipe_screen * _screen,struct pipe_resource * resource,struct pipe_memory_allocation * pmem,uint64_t offset)695 trace_screen_resource_bind_backing(struct pipe_screen *_screen,
696 struct pipe_resource *resource,
697 struct pipe_memory_allocation *pmem,
698 uint64_t offset)
699 {
700 struct trace_screen *tr_scr = trace_screen(_screen);
701 struct pipe_screen *screen = tr_scr->screen;
702 bool result;
703
704 trace_dump_call_begin("pipe_screen", "resource_bind_backing");
705
706 trace_dump_arg(ptr, screen);
707 trace_dump_arg(ptr, resource);
708 trace_dump_arg(ptr, pmem);
709 trace_dump_arg(uint, offset);
710
711 result = screen->resource_bind_backing(screen, resource, pmem, offset);
712
713 trace_dump_ret(bool, result);
714
715 trace_dump_call_end();
716
717 return result;
718 }
719
720 static struct pipe_resource *
trace_screen_resource_create_unbacked(struct pipe_screen * _screen,const struct pipe_resource * templat,uint64_t * size_required)721 trace_screen_resource_create_unbacked(struct pipe_screen *_screen,
722 const struct pipe_resource *templat,
723 uint64_t *size_required)
724 {
725 struct trace_screen *tr_scr = trace_screen(_screen);
726 struct pipe_screen *screen = tr_scr->screen;
727 struct pipe_resource *result;
728
729 trace_dump_call_begin("pipe_screen", "resource_create_unbacked");
730
731 trace_dump_arg(ptr, screen);
732 trace_dump_arg(resource_template, templat);
733
734 result = screen->resource_create_unbacked(screen, templat, size_required);
735
736 trace_dump_ret_begin();
737 trace_dump_uint(*size_required);
738 trace_dump_ret_end();
739 trace_dump_ret(ptr, result);
740
741 trace_dump_call_end();
742
743 if (result)
744 result->screen = _screen;
745 return result;
746 }
747
748 static struct pipe_resource *
trace_screen_resource_create(struct pipe_screen * _screen,const struct pipe_resource * templat)749 trace_screen_resource_create(struct pipe_screen *_screen,
750 const struct pipe_resource *templat)
751 {
752 struct trace_screen *tr_scr = trace_screen(_screen);
753 struct pipe_screen *screen = tr_scr->screen;
754 struct pipe_resource *result;
755
756 trace_dump_call_begin("pipe_screen", "resource_create");
757
758 trace_dump_arg(ptr, screen);
759 trace_dump_arg(resource_template, templat);
760
761 result = screen->resource_create(screen, templat);
762
763 trace_dump_ret(ptr, result);
764
765 trace_dump_call_end();
766
767 if (result)
768 result->screen = _screen;
769 return result;
770 }
771
772 static struct pipe_resource *
trace_screen_resource_create_drawable(struct pipe_screen * _screen,const struct pipe_resource * templat,const void * loader_data)773 trace_screen_resource_create_drawable(struct pipe_screen *_screen,
774 const struct pipe_resource *templat,
775 const void *loader_data)
776 {
777 struct trace_screen *tr_scr = trace_screen(_screen);
778 struct pipe_screen *screen = tr_scr->screen;
779 struct pipe_resource *result;
780
781 trace_dump_call_begin("pipe_screen", "resource_create_drawable");
782
783 trace_dump_arg(ptr, screen);
784 trace_dump_arg(resource_template, templat);
785 trace_dump_arg(ptr, loader_data);
786
787 result = screen->resource_create_drawable(screen, templat, loader_data);
788
789 trace_dump_ret(ptr, result);
790
791 trace_dump_call_end();
792
793 if (result)
794 result->screen = _screen;
795 return result;
796 }
797
798 static struct pipe_resource *
trace_screen_resource_create_with_modifiers(struct pipe_screen * _screen,const struct pipe_resource * templat,const uint64_t * modifiers,int modifiers_count)799 trace_screen_resource_create_with_modifiers(struct pipe_screen *_screen, const struct pipe_resource *templat,
800 const uint64_t *modifiers, int modifiers_count)
801 {
802 struct trace_screen *tr_scr = trace_screen(_screen);
803 struct pipe_screen *screen = tr_scr->screen;
804 struct pipe_resource *result;
805
806 trace_dump_call_begin("pipe_screen", "resource_create_with_modifiers");
807
808 trace_dump_arg(ptr, screen);
809 trace_dump_arg(resource_template, templat);
810 trace_dump_arg_array(uint, modifiers, modifiers_count);
811
812 result = screen->resource_create_with_modifiers(screen, templat, modifiers, modifiers_count);
813
814 trace_dump_ret(ptr, result);
815
816 trace_dump_call_end();
817
818 if (result)
819 result->screen = _screen;
820 return result;
821 }
822
823 static struct pipe_resource *
trace_screen_resource_from_handle(struct pipe_screen * _screen,const struct pipe_resource * templ,struct winsys_handle * handle,unsigned usage)824 trace_screen_resource_from_handle(struct pipe_screen *_screen,
825 const struct pipe_resource *templ,
826 struct winsys_handle *handle,
827 unsigned usage)
828 {
829 struct trace_screen *tr_screen = trace_screen(_screen);
830 struct pipe_screen *screen = tr_screen->screen;
831 struct pipe_resource *result;
832
833 trace_dump_call_begin("pipe_screen", "resource_from_handle");
834
835 trace_dump_arg(ptr, screen);
836 trace_dump_arg(resource_template, templ);
837 trace_dump_arg(winsys_handle, handle);
838 trace_dump_arg(uint, usage);
839
840 result = screen->resource_from_handle(screen, templ, handle, usage);
841
842 trace_dump_ret(ptr, result);
843
844 trace_dump_call_end();
845
846 if (result)
847 result->screen = _screen;
848 return result;
849 }
850
851 static bool
trace_screen_check_resource_capability(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned bind)852 trace_screen_check_resource_capability(struct pipe_screen *_screen,
853 struct pipe_resource *resource,
854 unsigned bind)
855 {
856 struct pipe_screen *screen = trace_screen(_screen)->screen;
857
858 return screen->check_resource_capability(screen, resource, bind);
859 }
860
861 static bool
trace_screen_resource_get_handle(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,struct winsys_handle * handle,unsigned usage)862 trace_screen_resource_get_handle(struct pipe_screen *_screen,
863 struct pipe_context *_pipe,
864 struct pipe_resource *resource,
865 struct winsys_handle *handle,
866 unsigned usage)
867 {
868 struct trace_screen *tr_screen = trace_screen(_screen);
869 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
870 struct pipe_screen *screen = tr_screen->screen;
871 bool result;
872
873 trace_dump_call_begin("pipe_screen", "resource_get_handle");
874
875 trace_dump_arg(ptr, screen);
876 trace_dump_arg(ptr, resource);
877 trace_dump_arg(uint, usage);
878
879 result = screen->resource_get_handle(screen, pipe, resource, handle, usage);
880
881 trace_dump_arg(winsys_handle, handle);
882 trace_dump_ret(bool, result);
883
884 trace_dump_call_end();
885
886 return result;
887 }
888
889 static bool
trace_screen_resource_get_param(struct pipe_screen * _screen,struct pipe_context * _pipe,struct pipe_resource * resource,unsigned plane,unsigned layer,unsigned level,enum pipe_resource_param param,unsigned handle_usage,uint64_t * value)890 trace_screen_resource_get_param(struct pipe_screen *_screen,
891 struct pipe_context *_pipe,
892 struct pipe_resource *resource,
893 unsigned plane,
894 unsigned layer,
895 unsigned level,
896 enum pipe_resource_param param,
897 unsigned handle_usage,
898 uint64_t *value)
899 {
900 struct trace_screen *tr_screen = trace_screen(_screen);
901 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
902 struct pipe_screen *screen = tr_screen->screen;
903 bool result;
904
905 trace_dump_call_begin("pipe_screen", "resource_get_param");
906
907 trace_dump_arg(ptr, screen);
908 trace_dump_arg(ptr, resource);
909 trace_dump_arg(uint, plane);
910 trace_dump_arg(uint, layer);
911 trace_dump_arg(uint, level);
912 trace_dump_arg_enum(pipe_resource_param, param);
913 trace_dump_arg(uint, handle_usage);
914
915 result = screen->resource_get_param(screen, pipe,
916 resource, plane, layer, level, param,
917 handle_usage, value);
918
919 trace_dump_arg(uint, *value);
920 trace_dump_ret(bool, result);
921
922 trace_dump_call_end();
923
924 return result;
925 }
926
927 static void
trace_screen_resource_get_info(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned * stride,unsigned * offset)928 trace_screen_resource_get_info(struct pipe_screen *_screen,
929 struct pipe_resource *resource,
930 unsigned *stride,
931 unsigned *offset)
932 {
933 struct trace_screen *tr_screen = trace_screen(_screen);
934 struct pipe_screen *screen = tr_screen->screen;
935
936 trace_dump_call_begin("pipe_screen", "resource_get_info");
937 trace_dump_arg(ptr, screen);
938 trace_dump_arg(ptr, resource);
939
940 screen->resource_get_info(screen, resource, stride, offset);
941
942 trace_dump_arg(uint, *stride);
943 trace_dump_arg(uint, *offset);
944
945 trace_dump_call_end();
946 }
947
948 static struct pipe_resource *
trace_screen_resource_from_memobj(struct pipe_screen * _screen,const struct pipe_resource * templ,struct pipe_memory_object * memobj,uint64_t offset)949 trace_screen_resource_from_memobj(struct pipe_screen *_screen,
950 const struct pipe_resource *templ,
951 struct pipe_memory_object *memobj,
952 uint64_t offset)
953 {
954 struct pipe_screen *screen = trace_screen(_screen)->screen;
955
956 trace_dump_call_begin("pipe_screen", "resource_from_memobj");
957 trace_dump_arg(ptr, screen);
958 trace_dump_arg(resource_template, templ);
959 trace_dump_arg(ptr, memobj);
960 trace_dump_arg(uint, offset);
961
962 struct pipe_resource *res =
963 screen->resource_from_memobj(screen, templ, memobj, offset);
964
965 if (!res)
966 return NULL;
967 res->screen = _screen;
968
969 trace_dump_ret(ptr, res);
970 trace_dump_call_end();
971 return res;
972 }
973
974 static void
trace_screen_resource_changed(struct pipe_screen * _screen,struct pipe_resource * resource)975 trace_screen_resource_changed(struct pipe_screen *_screen,
976 struct pipe_resource *resource)
977 {
978 struct trace_screen *tr_scr = trace_screen(_screen);
979 struct pipe_screen *screen = tr_scr->screen;
980
981 trace_dump_call_begin("pipe_screen", "resource_changed");
982
983 trace_dump_arg(ptr, screen);
984 trace_dump_arg(ptr, resource);
985
986 if (screen->resource_changed)
987 screen->resource_changed(screen, resource);
988
989 trace_dump_call_end();
990 }
991
992 static void
trace_screen_resource_destroy(struct pipe_screen * _screen,struct pipe_resource * resource)993 trace_screen_resource_destroy(struct pipe_screen *_screen,
994 struct pipe_resource *resource)
995 {
996 struct trace_screen *tr_scr = trace_screen(_screen);
997 struct pipe_screen *screen = tr_scr->screen;
998
999 /* Don't trace this, because due to the lack of pipe_resource wrapping,
1000 * we can get this call from inside of driver calls, which would try
1001 * to lock an already-locked mutex.
1002 */
1003 screen->resource_destroy(screen, resource);
1004 }
1005
1006
1007 /********************************************************************
1008 * fence
1009 */
1010
1011
1012 static void
trace_screen_fence_reference(struct pipe_screen * _screen,struct pipe_fence_handle ** pdst,struct pipe_fence_handle * src)1013 trace_screen_fence_reference(struct pipe_screen *_screen,
1014 struct pipe_fence_handle **pdst,
1015 struct pipe_fence_handle *src)
1016 {
1017 struct trace_screen *tr_scr = trace_screen(_screen);
1018 struct pipe_screen *screen = tr_scr->screen;
1019 struct pipe_fence_handle *dst;
1020
1021 assert(pdst);
1022 dst = *pdst;
1023
1024 trace_dump_call_begin("pipe_screen", "fence_reference");
1025
1026 trace_dump_arg(ptr, screen);
1027 trace_dump_arg(ptr, dst);
1028 trace_dump_arg(ptr, src);
1029
1030 screen->fence_reference(screen, pdst, src);
1031
1032 trace_dump_call_end();
1033 }
1034
1035
1036 static int
trace_screen_fence_get_fd(struct pipe_screen * _screen,struct pipe_fence_handle * fence)1037 trace_screen_fence_get_fd(struct pipe_screen *_screen,
1038 struct pipe_fence_handle *fence)
1039 {
1040 struct trace_screen *tr_scr = trace_screen(_screen);
1041 struct pipe_screen *screen = tr_scr->screen;
1042 int result;
1043
1044 trace_dump_call_begin("pipe_screen", "fence_get_fd");
1045
1046 trace_dump_arg(ptr, screen);
1047 trace_dump_arg(ptr, fence);
1048
1049 result = screen->fence_get_fd(screen, fence);
1050
1051 trace_dump_ret(int, result);
1052
1053 trace_dump_call_end();
1054
1055 return result;
1056 }
1057
1058 static void
trace_screen_create_fence_win32(struct pipe_screen * _screen,struct pipe_fence_handle ** fence,void * handle,const void * name,enum pipe_fd_type type)1059 trace_screen_create_fence_win32(struct pipe_screen *_screen,
1060 struct pipe_fence_handle **fence,
1061 void *handle,
1062 const void *name,
1063 enum pipe_fd_type type)
1064 {
1065 struct trace_screen *tr_scr = trace_screen(_screen);
1066 struct pipe_screen *screen = tr_scr->screen;
1067
1068 trace_dump_call_begin("pipe_screen", "create_fence_win32");
1069
1070 trace_dump_arg(ptr, screen);
1071 if (fence)
1072 trace_dump_arg(ptr, *fence);
1073 trace_dump_arg(ptr, handle);
1074 trace_dump_arg(ptr, name);
1075 trace_dump_arg_enum(pipe_fd_type, type);
1076
1077 trace_dump_call_end();
1078
1079 screen->create_fence_win32(screen, fence, handle, name, type);
1080 }
1081
1082
1083 static bool
trace_screen_fence_finish(struct pipe_screen * _screen,struct pipe_context * _ctx,struct pipe_fence_handle * fence,uint64_t timeout)1084 trace_screen_fence_finish(struct pipe_screen *_screen,
1085 struct pipe_context *_ctx,
1086 struct pipe_fence_handle *fence,
1087 uint64_t timeout)
1088 {
1089 struct trace_screen *tr_scr = trace_screen(_screen);
1090 struct pipe_screen *screen = tr_scr->screen;
1091 struct pipe_context *ctx = _ctx ? trace_get_possibly_threaded_context(_ctx) : NULL;
1092 int result;
1093
1094 result = screen->fence_finish(screen, ctx, fence, timeout);
1095
1096
1097 trace_dump_call_begin("pipe_screen", "fence_finish");
1098
1099 trace_dump_arg(ptr, screen);
1100 trace_dump_arg(ptr, ctx);
1101 trace_dump_arg(ptr, fence);
1102 trace_dump_arg(uint, timeout);
1103
1104 trace_dump_ret(bool, result);
1105
1106 trace_dump_call_end();
1107
1108 return result;
1109 }
1110
1111
1112 /********************************************************************
1113 * memobj
1114 */
1115
1116 static struct pipe_memory_object *
trace_screen_memobj_create_from_handle(struct pipe_screen * _screen,struct winsys_handle * handle,bool dedicated)1117 trace_screen_memobj_create_from_handle(struct pipe_screen *_screen,
1118 struct winsys_handle *handle,
1119 bool dedicated)
1120 {
1121 struct pipe_screen *screen = trace_screen(_screen)->screen;
1122
1123 trace_dump_call_begin("pipe_screen", "memobj_create_from_handle");
1124 trace_dump_arg(ptr, screen);
1125 trace_dump_arg(ptr, handle);
1126 trace_dump_arg(bool, dedicated);
1127
1128 struct pipe_memory_object *res =
1129 screen->memobj_create_from_handle(screen, handle, dedicated);
1130
1131 trace_dump_ret(ptr, res);
1132 trace_dump_call_end();
1133
1134 return res;
1135 }
1136
1137 static void
trace_screen_memobj_destroy(struct pipe_screen * _screen,struct pipe_memory_object * memobj)1138 trace_screen_memobj_destroy(struct pipe_screen *_screen,
1139 struct pipe_memory_object *memobj)
1140 {
1141 struct pipe_screen *screen = trace_screen(_screen)->screen;
1142
1143 trace_dump_call_begin("pipe_screen", "memobj_destroy");
1144 trace_dump_arg(ptr, screen);
1145 trace_dump_arg(ptr, memobj);
1146 trace_dump_call_end();
1147
1148 screen->memobj_destroy(screen, memobj);
1149 }
1150
1151
1152 /********************************************************************
1153 * screen
1154 */
1155
1156 static uint64_t
trace_screen_get_timestamp(struct pipe_screen * _screen)1157 trace_screen_get_timestamp(struct pipe_screen *_screen)
1158 {
1159 struct trace_screen *tr_scr = trace_screen(_screen);
1160 struct pipe_screen *screen = tr_scr->screen;
1161 uint64_t result;
1162
1163 trace_dump_call_begin("pipe_screen", "get_timestamp");
1164 trace_dump_arg(ptr, screen);
1165
1166 result = screen->get_timestamp(screen);
1167
1168 trace_dump_ret(uint, result);
1169 trace_dump_call_end();
1170
1171 return result;
1172 }
1173
1174 static char *
trace_screen_finalize_nir(struct pipe_screen * _screen,void * nir)1175 trace_screen_finalize_nir(struct pipe_screen *_screen, void *nir)
1176 {
1177 struct pipe_screen *screen = trace_screen(_screen)->screen;
1178
1179 return screen->finalize_nir(screen, nir);
1180 }
1181
1182 static void
trace_screen_destroy(struct pipe_screen * _screen)1183 trace_screen_destroy(struct pipe_screen *_screen)
1184 {
1185 struct trace_screen *tr_scr = trace_screen(_screen);
1186 struct pipe_screen *screen = tr_scr->screen;
1187
1188 trace_dump_call_begin("pipe_screen", "destroy");
1189 trace_dump_arg(ptr, screen);
1190 trace_dump_call_end();
1191
1192 if (trace_screens) {
1193 struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
1194 if (he) {
1195 _mesa_hash_table_remove(trace_screens, he);
1196 if (!_mesa_hash_table_num_entries(trace_screens)) {
1197 _mesa_hash_table_destroy(trace_screens, NULL);
1198 trace_screens = NULL;
1199 }
1200 }
1201 }
1202
1203 screen->destroy(screen);
1204
1205 FREE(tr_scr);
1206 }
1207
1208 static void
trace_screen_query_memory_info(struct pipe_screen * _screen,struct pipe_memory_info * info)1209 trace_screen_query_memory_info(struct pipe_screen *_screen, struct pipe_memory_info *info)
1210 {
1211 struct trace_screen *tr_scr = trace_screen(_screen);
1212 struct pipe_screen *screen = tr_scr->screen;
1213
1214 trace_dump_call_begin("pipe_screen", "query_memory_info");
1215
1216 trace_dump_arg(ptr, screen);
1217
1218 screen->query_memory_info(screen, info);
1219
1220 trace_dump_ret(memory_info, info);
1221
1222 trace_dump_call_end();
1223 }
1224
1225 static void
trace_screen_query_dmabuf_modifiers(struct pipe_screen * _screen,enum pipe_format format,int max,uint64_t * modifiers,unsigned int * external_only,int * count)1226 trace_screen_query_dmabuf_modifiers(struct pipe_screen *_screen, enum pipe_format format, int max, uint64_t *modifiers, unsigned int *external_only, int *count)
1227 {
1228 struct trace_screen *tr_scr = trace_screen(_screen);
1229 struct pipe_screen *screen = tr_scr->screen;
1230
1231 trace_dump_call_begin("pipe_screen", "query_dmabuf_modifiers");
1232
1233 trace_dump_arg(ptr, screen);
1234 trace_dump_arg(format, format);
1235 trace_dump_arg(int, max);
1236
1237 screen->query_dmabuf_modifiers(screen, format, max, modifiers, external_only, count);
1238
1239 if (max)
1240 trace_dump_arg_array(uint, modifiers, *count);
1241 else
1242 trace_dump_arg_array(uint, modifiers, max);
1243 trace_dump_arg_array(uint, external_only, max);
1244 trace_dump_ret_begin();
1245 trace_dump_uint(*count);
1246 trace_dump_ret_end();
1247
1248 trace_dump_call_end();
1249 }
1250
1251 static bool
trace_screen_is_compute_copy_faster(struct pipe_screen * _screen,enum pipe_format src_format,enum pipe_format dst_format,unsigned width,unsigned height,unsigned depth,bool cpu)1252 trace_screen_is_compute_copy_faster(struct pipe_screen *_screen, enum pipe_format src_format,
1253 enum pipe_format dst_format, unsigned width, unsigned height,
1254 unsigned depth, bool cpu)
1255 {
1256 struct trace_screen *tr_scr = trace_screen(_screen);
1257 struct pipe_screen *screen = tr_scr->screen;
1258
1259 trace_dump_call_begin("pipe_screen", "is_compute_copy_faster");
1260
1261 trace_dump_arg(ptr, screen);
1262 trace_dump_arg(format, src_format);
1263 trace_dump_arg(format, dst_format);
1264 trace_dump_arg(uint, width);
1265 trace_dump_arg(uint, height);
1266 trace_dump_arg(uint, depth);
1267 trace_dump_arg(bool, cpu);
1268
1269 bool ret = screen->is_compute_copy_faster(screen, src_format, dst_format, width, height, depth, cpu);
1270
1271 trace_dump_ret(bool, ret);
1272
1273 trace_dump_call_end();
1274 return ret;
1275 }
1276
1277 static bool
trace_screen_is_dmabuf_modifier_supported(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format,bool * external_only)1278 trace_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format, bool *external_only)
1279 {
1280 struct trace_screen *tr_scr = trace_screen(_screen);
1281 struct pipe_screen *screen = tr_scr->screen;
1282
1283 trace_dump_call_begin("pipe_screen", "is_dmabuf_modifier_supported");
1284
1285 trace_dump_arg(ptr, screen);
1286 trace_dump_arg(uint, modifier);
1287 trace_dump_arg(format, format);
1288
1289 bool ret = screen->is_dmabuf_modifier_supported(screen, modifier, format, external_only);
1290
1291 trace_dump_arg_begin("external_only");
1292 trace_dump_bool(external_only ? *external_only : false);
1293 trace_dump_arg_end();
1294
1295 trace_dump_ret(bool, ret);
1296
1297 trace_dump_call_end();
1298 return ret;
1299 }
1300
1301 static unsigned int
trace_screen_get_dmabuf_modifier_planes(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format)1302 trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format)
1303 {
1304 struct trace_screen *tr_scr = trace_screen(_screen);
1305 struct pipe_screen *screen = tr_scr->screen;
1306
1307 trace_dump_call_begin("pipe_screen", "get_dmabuf_modifier_planes");
1308
1309 trace_dump_arg(ptr, screen);
1310 trace_dump_arg(uint, modifier);
1311 trace_dump_arg(format, format);
1312
1313 unsigned ret = screen->get_dmabuf_modifier_planes(screen, modifier, format);
1314
1315 trace_dump_ret(uint, ret);
1316
1317 trace_dump_call_end();
1318 return ret;
1319 }
1320
1321 static int
trace_screen_get_sparse_texture_virtual_page_size(struct pipe_screen * _screen,enum pipe_texture_target target,bool multi_sample,enum pipe_format format,unsigned offset,unsigned size,int * x,int * y,int * z)1322 trace_screen_get_sparse_texture_virtual_page_size(struct pipe_screen *_screen,
1323 enum pipe_texture_target target,
1324 bool multi_sample,
1325 enum pipe_format format,
1326 unsigned offset, unsigned size,
1327 int *x, int *y, int *z)
1328 {
1329 struct trace_screen *tr_scr = trace_screen(_screen);
1330 struct pipe_screen *screen = tr_scr->screen;
1331
1332 trace_dump_call_begin("pipe_screen", "get_sparse_texture_virtual_page_size");
1333
1334 trace_dump_arg(ptr, screen);
1335 trace_dump_arg_enum(pipe_texture_target, target);
1336 trace_dump_arg(format, format);
1337 trace_dump_arg(uint, offset);
1338 trace_dump_arg(uint, size);
1339
1340 int ret = screen->get_sparse_texture_virtual_page_size(screen, target, multi_sample,
1341 format, offset, size, x, y, z);
1342
1343 if (x)
1344 trace_dump_arg(uint, *x);
1345 else
1346 trace_dump_arg(ptr, x);
1347 if (y)
1348 trace_dump_arg(uint, *y);
1349 else
1350 trace_dump_arg(ptr, y);
1351 if (z)
1352 trace_dump_arg(uint, *z);
1353 else
1354 trace_dump_arg(ptr, z);
1355
1356 trace_dump_ret(int, ret);
1357
1358 trace_dump_call_end();
1359 return ret;
1360 }
1361
1362 static struct pipe_vertex_state *
trace_screen_create_vertex_state(struct pipe_screen * _screen,struct pipe_vertex_buffer * buffer,const struct pipe_vertex_element * elements,unsigned num_elements,struct pipe_resource * indexbuf,uint32_t full_velem_mask)1363 trace_screen_create_vertex_state(struct pipe_screen *_screen,
1364 struct pipe_vertex_buffer *buffer,
1365 const struct pipe_vertex_element *elements,
1366 unsigned num_elements,
1367 struct pipe_resource *indexbuf,
1368 uint32_t full_velem_mask)
1369 {
1370 struct trace_screen *tr_scr = trace_screen(_screen);
1371 struct pipe_screen *screen = tr_scr->screen;
1372
1373 trace_dump_call_begin("pipe_screen", "create_vertex_state");
1374
1375 trace_dump_arg(ptr, screen);
1376 trace_dump_arg(ptr, buffer->buffer.resource);
1377 trace_dump_arg(vertex_buffer, buffer);
1378 trace_dump_arg_begin("elements");
1379 trace_dump_struct_array(vertex_element, elements, num_elements);
1380 trace_dump_arg_end();
1381 trace_dump_arg(uint, num_elements);
1382 trace_dump_arg(ptr, indexbuf);
1383 trace_dump_arg(uint, full_velem_mask);
1384
1385 struct pipe_vertex_state *vstate =
1386 screen->create_vertex_state(screen, buffer, elements, num_elements,
1387 indexbuf, full_velem_mask);
1388 trace_dump_ret(ptr, vstate);
1389 trace_dump_call_end();
1390 return vstate;
1391 }
1392
trace_screen_vertex_state_destroy(struct pipe_screen * _screen,struct pipe_vertex_state * state)1393 static void trace_screen_vertex_state_destroy(struct pipe_screen *_screen,
1394 struct pipe_vertex_state *state)
1395 {
1396 struct trace_screen *tr_scr = trace_screen(_screen);
1397 struct pipe_screen *screen = tr_scr->screen;
1398
1399 trace_dump_call_begin("pipe_screen", "vertex_state_destroy");
1400 trace_dump_arg(ptr, screen);
1401 trace_dump_arg(ptr, state);
1402 trace_dump_call_end();
1403
1404 screen->vertex_state_destroy(screen, state);
1405 }
1406
trace_screen_set_fence_timeline_value(struct pipe_screen * _screen,struct pipe_fence_handle * fence,uint64_t value)1407 static void trace_screen_set_fence_timeline_value(struct pipe_screen *_screen,
1408 struct pipe_fence_handle *fence,
1409 uint64_t value)
1410 {
1411 struct trace_screen *tr_scr = trace_screen(_screen);
1412 struct pipe_screen *screen = tr_scr->screen;
1413
1414 trace_dump_call_begin("pipe_screen", "set_fence_timeline_value");
1415 trace_dump_arg(ptr, screen);
1416 trace_dump_arg(ptr, fence);
1417 trace_dump_arg(uint, value);
1418 trace_dump_call_end();
1419
1420 screen->set_fence_timeline_value(screen, fence, value);
1421 }
1422
1423 bool
trace_enabled(void)1424 trace_enabled(void)
1425 {
1426 static bool firstrun = true;
1427
1428 if (!firstrun)
1429 return trace;
1430 firstrun = false;
1431
1432 if(trace_dump_trace_begin()) {
1433 trace_dumping_start();
1434 trace = true;
1435 }
1436
1437 return trace;
1438 }
1439
1440 struct pipe_screen *
trace_screen_create(struct pipe_screen * screen)1441 trace_screen_create(struct pipe_screen *screen)
1442 {
1443 struct trace_screen *tr_scr;
1444
1445 /* if zink+lavapipe is enabled, ensure that only one driver is traced */
1446 const char *driver = debug_get_option("MESA_LOADER_DRIVER_OVERRIDE", NULL);
1447 if (driver && !strcmp(driver, "zink")) {
1448 /* the user wants zink: check whether they want to trace zink or lavapipe */
1449 bool trace_lavapipe = debug_get_bool_option("ZINK_TRACE_LAVAPIPE", false);
1450 if (!strncmp(screen->get_name(screen), "zink", 4)) {
1451 /* this is the zink screen: only trace if lavapipe tracing is disabled */
1452 if (trace_lavapipe)
1453 return screen;
1454 } else {
1455 /* this is the llvmpipe screen: only trace if lavapipe tracing is enabled */
1456 if (!trace_lavapipe)
1457 return screen;
1458 }
1459 }
1460
1461 if (!trace_enabled())
1462 goto error1;
1463
1464 trace_dump_call_begin("", "pipe_screen_create");
1465
1466 tr_scr = CALLOC_STRUCT(trace_screen);
1467 if (!tr_scr)
1468 goto error2;
1469
1470 #define SCR_INIT(_member) \
1471 tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL
1472
1473 tr_scr->base.destroy = trace_screen_destroy;
1474 tr_scr->base.get_name = trace_screen_get_name;
1475 tr_scr->base.get_vendor = trace_screen_get_vendor;
1476 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
1477 SCR_INIT(get_compiler_options);
1478 SCR_INIT(get_disk_shader_cache);
1479 tr_scr->base.get_param = trace_screen_get_param;
1480 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
1481 tr_scr->base.get_paramf = trace_screen_get_paramf;
1482 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
1483 SCR_INIT(get_video_param);
1484 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
1485 SCR_INIT(is_video_format_supported);
1486 assert(screen->context_create);
1487 tr_scr->base.context_create = trace_screen_context_create;
1488 tr_scr->base.resource_create = trace_screen_resource_create;
1489 SCR_INIT(resource_create_with_modifiers);
1490 tr_scr->base.resource_create_unbacked = trace_screen_resource_create_unbacked;
1491 SCR_INIT(resource_create_drawable);
1492 tr_scr->base.resource_bind_backing = trace_screen_resource_bind_backing;
1493 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
1494 tr_scr->base.allocate_memory = trace_screen_allocate_memory;
1495 SCR_INIT(allocate_memory_fd);
1496 tr_scr->base.free_memory = trace_screen_free_memory;
1497 SCR_INIT(free_memory_fd);
1498 tr_scr->base.map_memory = trace_screen_map_memory;
1499 tr_scr->base.unmap_memory = trace_screen_unmap_memory;
1500 SCR_INIT(query_memory_info);
1501 SCR_INIT(query_dmabuf_modifiers);
1502 SCR_INIT(is_compute_copy_faster);
1503 SCR_INIT(is_dmabuf_modifier_supported);
1504 SCR_INIT(get_dmabuf_modifier_planes);
1505 SCR_INIT(check_resource_capability);
1506 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
1507 SCR_INIT(resource_get_param);
1508 SCR_INIT(resource_get_info);
1509 SCR_INIT(resource_from_memobj);
1510 SCR_INIT(resource_changed);
1511 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
1512 tr_scr->base.fence_reference = trace_screen_fence_reference;
1513 SCR_INIT(fence_get_fd);
1514 SCR_INIT(create_fence_win32);
1515 tr_scr->base.fence_finish = trace_screen_fence_finish;
1516 SCR_INIT(memobj_create_from_handle);
1517 SCR_INIT(memobj_destroy);
1518 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
1519 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
1520 SCR_INIT(get_driver_uuid);
1521 SCR_INIT(get_device_uuid);
1522 SCR_INIT(get_device_luid);
1523 SCR_INIT(get_device_node_mask);
1524 SCR_INIT(finalize_nir);
1525 SCR_INIT(create_vertex_state);
1526 SCR_INIT(vertex_state_destroy);
1527 tr_scr->base.transfer_helper = screen->transfer_helper;
1528 SCR_INIT(get_sparse_texture_virtual_page_size);
1529 SCR_INIT(set_fence_timeline_value);
1530 SCR_INIT(driver_thread_add_job);
1531
1532 tr_scr->screen = screen;
1533
1534 trace_dump_ret(ptr, screen);
1535 trace_dump_call_end();
1536
1537 if (!trace_screens)
1538 trace_screens = _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
1539 _mesa_hash_table_insert(trace_screens, screen, tr_scr);
1540
1541 tr_scr->trace_tc = debug_get_bool_option("GALLIUM_TRACE_TC", false);
1542
1543 return &tr_scr->base;
1544
1545 error2:
1546 trace_dump_ret(ptr, screen);
1547 trace_dump_call_end();
1548 error1:
1549 return screen;
1550 }
1551
1552
1553 struct trace_screen *
trace_screen(struct pipe_screen * screen)1554 trace_screen(struct pipe_screen *screen)
1555 {
1556 assert(screen);
1557 assert(screen->destroy == trace_screen_destroy);
1558 return (struct trace_screen *)screen;
1559 }
1560
1561 struct pipe_screen *
trace_screen_unwrap(struct pipe_screen * _screen)1562 trace_screen_unwrap(struct pipe_screen *_screen)
1563 {
1564 if (_screen->destroy != trace_screen_destroy)
1565 return _screen;
1566 struct trace_screen *tr_scr = trace_screen(_screen);
1567 return tr_scr->screen;
1568 }
1569