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,unsigned nboxes,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 unsigned nboxes,
487 struct pipe_box *sub_box)
488 {
489 struct trace_screen *tr_scr = trace_screen(_screen);
490 struct pipe_screen *screen = tr_scr->screen;
491 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
492
493 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
494
495 trace_dump_arg(ptr, screen);
496 trace_dump_arg(ptr, resource);
497 trace_dump_arg(uint, level);
498 trace_dump_arg(uint, layer);
499 /* XXX: hide, as there is nothing we can do with this
500 trace_dump_arg(ptr, context_private);
501 */
502
503 trace_dump_call_end();
504
505 screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, nboxes, sub_box);
506 }
507
508
509 static void
trace_screen_get_driver_uuid(struct pipe_screen * _screen,char * uuid)510 trace_screen_get_driver_uuid(struct pipe_screen *_screen, char *uuid)
511 {
512 struct pipe_screen *screen = trace_screen(_screen)->screen;
513
514 trace_dump_call_begin("pipe_screen", "get_driver_uuid");
515 trace_dump_arg(ptr, screen);
516
517 screen->get_driver_uuid(screen, uuid);
518
519 trace_dump_ret(string, uuid);
520 trace_dump_call_end();
521 }
522
523 static void
trace_screen_get_device_uuid(struct pipe_screen * _screen,char * uuid)524 trace_screen_get_device_uuid(struct pipe_screen *_screen, char *uuid)
525 {
526 struct pipe_screen *screen = trace_screen(_screen)->screen;
527
528 trace_dump_call_begin("pipe_screen", "get_device_uuid");
529 trace_dump_arg(ptr, screen);
530
531 screen->get_device_uuid(screen, uuid);
532
533 trace_dump_ret(string, uuid);
534 trace_dump_call_end();
535 }
536
537 static void
trace_screen_get_device_luid(struct pipe_screen * _screen,char * luid)538 trace_screen_get_device_luid(struct pipe_screen *_screen, char *luid)
539 {
540 struct pipe_screen *screen = trace_screen(_screen)->screen;
541
542 trace_dump_call_begin("pipe_screen", "get_device_luid");
543 trace_dump_arg(ptr, screen);
544
545 screen->get_device_luid(screen, luid);
546
547 trace_dump_ret(string, luid);
548 trace_dump_call_end();
549 }
550
551 static uint32_t
trace_screen_get_device_node_mask(struct pipe_screen * _screen)552 trace_screen_get_device_node_mask(struct pipe_screen *_screen)
553 {
554 struct pipe_screen *screen = trace_screen(_screen)->screen;
555 uint32_t result;
556
557 trace_dump_call_begin("pipe_screen", "get_device_node_mask");
558 trace_dump_arg(ptr, screen);
559
560 result = screen->get_device_node_mask(screen);
561
562 trace_dump_ret(uint, result);
563 trace_dump_call_end();
564
565 return result;
566 }
567
568
569 /********************************************************************
570 * texture
571 */
572
573 static void *
trace_screen_map_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)574 trace_screen_map_memory(struct pipe_screen *_screen,
575 struct pipe_memory_allocation *pmem)
576 {
577 struct trace_screen *tr_scr = trace_screen(_screen);
578 struct pipe_screen *screen = tr_scr->screen;
579 void *result;
580
581 trace_dump_call_begin("pipe_screen", "map_memory");
582
583 trace_dump_arg(ptr, screen);
584 trace_dump_arg(ptr, pmem);
585
586 result = screen->map_memory(screen, pmem);
587
588 trace_dump_ret(ptr, result);
589
590 trace_dump_call_end();
591
592 return result;
593 }
594
595 static void
trace_screen_unmap_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)596 trace_screen_unmap_memory(struct pipe_screen *_screen,
597 struct pipe_memory_allocation *pmem)
598 {
599 struct trace_screen *tr_scr = trace_screen(_screen);
600 struct pipe_screen *screen = tr_scr->screen;
601
602 trace_dump_call_begin("pipe_screen", "unmap_memory");
603
604 trace_dump_arg(ptr, screen);
605 trace_dump_arg(ptr, pmem);
606
607 screen->unmap_memory(screen, pmem);
608
609
610 trace_dump_call_end();
611 }
612
613 static struct pipe_memory_allocation *
trace_screen_allocate_memory(struct pipe_screen * _screen,uint64_t size)614 trace_screen_allocate_memory(struct pipe_screen *_screen,
615 uint64_t size)
616 {
617 struct trace_screen *tr_scr = trace_screen(_screen);
618 struct pipe_screen *screen = tr_scr->screen;
619 struct pipe_memory_allocation *result;
620
621 trace_dump_call_begin("pipe_screen", "allocate_memory");
622
623 trace_dump_arg(ptr, screen);
624 trace_dump_arg(uint, size);
625
626 result = screen->allocate_memory(screen, size);
627
628 trace_dump_ret(ptr, result);
629
630 trace_dump_call_end();
631
632 return result;
633 }
634
635 static struct pipe_memory_allocation *
trace_screen_allocate_memory_fd(struct pipe_screen * _screen,uint64_t size,int * fd,bool dmabuf)636 trace_screen_allocate_memory_fd(struct pipe_screen *_screen,
637 uint64_t size,
638 int *fd,
639 bool dmabuf)
640 {
641 struct trace_screen *tr_scr = trace_screen(_screen);
642 struct pipe_screen *screen = tr_scr->screen;
643 struct pipe_memory_allocation *result;
644
645 trace_dump_call_begin("pipe_screen", "allocate_memory_fd");
646
647 trace_dump_arg(ptr, screen);
648 trace_dump_arg(uint, size);
649 trace_dump_arg(ptr, fd);
650 trace_dump_arg(bool, dmabuf);
651
652 result = screen->allocate_memory_fd(screen, size, fd, dmabuf);
653
654 trace_dump_ret(ptr, result);
655
656 trace_dump_call_end();
657
658 return result;
659 }
660
661 static void
trace_screen_free_memory(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)662 trace_screen_free_memory(struct pipe_screen *_screen,
663 struct pipe_memory_allocation *pmem)
664 {
665 struct trace_screen *tr_scr = trace_screen(_screen);
666 struct pipe_screen *screen = tr_scr->screen;
667
668 trace_dump_call_begin("pipe_screen", "free_memory");
669
670 trace_dump_arg(ptr, screen);
671 trace_dump_arg(ptr, pmem);
672
673 screen->free_memory(screen, pmem);
674
675
676 trace_dump_call_end();
677 }
678
679 static void
trace_screen_free_memory_fd(struct pipe_screen * _screen,struct pipe_memory_allocation * pmem)680 trace_screen_free_memory_fd(struct pipe_screen *_screen,
681 struct pipe_memory_allocation *pmem)
682 {
683 struct trace_screen *tr_scr = trace_screen(_screen);
684 struct pipe_screen *screen = tr_scr->screen;
685
686 trace_dump_call_begin("pipe_screen", "free_memory_fd");
687
688 trace_dump_arg(ptr, screen);
689 trace_dump_arg(ptr, pmem);
690
691 screen->free_memory_fd(screen, pmem);
692
693
694 trace_dump_call_end();
695 }
696
697 static bool
trace_screen_resource_bind_backing(struct pipe_screen * _screen,struct pipe_resource * resource,struct pipe_memory_allocation * pmem,uint64_t fd_offset,uint64_t size,uint64_t offset)698 trace_screen_resource_bind_backing(struct pipe_screen *_screen,
699 struct pipe_resource *resource,
700 struct pipe_memory_allocation *pmem,
701 uint64_t fd_offset,
702 uint64_t size,
703 uint64_t offset)
704 {
705 struct trace_screen *tr_scr = trace_screen(_screen);
706 struct pipe_screen *screen = tr_scr->screen;
707 bool result;
708
709 trace_dump_call_begin("pipe_screen", "resource_bind_backing");
710
711 trace_dump_arg(ptr, screen);
712 trace_dump_arg(ptr, resource);
713 trace_dump_arg(ptr, pmem);
714 trace_dump_arg(uint, fd_offset);
715 trace_dump_arg(uint, size);
716 trace_dump_arg(uint, offset);
717
718 result = screen->resource_bind_backing(screen, resource, pmem, fd_offset, size, offset);
719
720 trace_dump_ret(bool, result);
721
722 trace_dump_call_end();
723
724 return result;
725 }
726
727 static struct pipe_resource *
trace_screen_resource_create_unbacked(struct pipe_screen * _screen,const struct pipe_resource * templat,uint64_t * size_required)728 trace_screen_resource_create_unbacked(struct pipe_screen *_screen,
729 const struct pipe_resource *templat,
730 uint64_t *size_required)
731 {
732 struct trace_screen *tr_scr = trace_screen(_screen);
733 struct pipe_screen *screen = tr_scr->screen;
734 struct pipe_resource *result;
735
736 trace_dump_call_begin("pipe_screen", "resource_create_unbacked");
737
738 trace_dump_arg(ptr, screen);
739 trace_dump_arg(resource_template, templat);
740
741 result = screen->resource_create_unbacked(screen, templat, size_required);
742
743 trace_dump_ret_begin();
744 trace_dump_uint(*size_required);
745 trace_dump_ret_end();
746 trace_dump_ret(ptr, result);
747
748 trace_dump_call_end();
749
750 if (result)
751 result->screen = _screen;
752 return result;
753 }
754
755 static struct pipe_resource *
trace_screen_resource_create(struct pipe_screen * _screen,const struct pipe_resource * templat)756 trace_screen_resource_create(struct pipe_screen *_screen,
757 const struct pipe_resource *templat)
758 {
759 struct trace_screen *tr_scr = trace_screen(_screen);
760 struct pipe_screen *screen = tr_scr->screen;
761 struct pipe_resource *result;
762
763 trace_dump_call_begin("pipe_screen", "resource_create");
764
765 trace_dump_arg(ptr, screen);
766 trace_dump_arg(resource_template, templat);
767
768 result = screen->resource_create(screen, templat);
769
770 trace_dump_ret(ptr, result);
771
772 trace_dump_call_end();
773
774 if (result)
775 result->screen = _screen;
776 return result;
777 }
778
779 static struct pipe_resource *
trace_screen_resource_create_drawable(struct pipe_screen * _screen,const struct pipe_resource * templat,const void * loader_data)780 trace_screen_resource_create_drawable(struct pipe_screen *_screen,
781 const struct pipe_resource *templat,
782 const void *loader_data)
783 {
784 struct trace_screen *tr_scr = trace_screen(_screen);
785 struct pipe_screen *screen = tr_scr->screen;
786 struct pipe_resource *result;
787
788 trace_dump_call_begin("pipe_screen", "resource_create_drawable");
789
790 trace_dump_arg(ptr, screen);
791 trace_dump_arg(resource_template, templat);
792 trace_dump_arg(ptr, loader_data);
793
794 result = screen->resource_create_drawable(screen, templat, loader_data);
795
796 trace_dump_ret(ptr, result);
797
798 trace_dump_call_end();
799
800 if (result)
801 result->screen = _screen;
802 return result;
803 }
804
805 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)806 trace_screen_resource_create_with_modifiers(struct pipe_screen *_screen, const struct pipe_resource *templat,
807 const uint64_t *modifiers, int modifiers_count)
808 {
809 struct trace_screen *tr_scr = trace_screen(_screen);
810 struct pipe_screen *screen = tr_scr->screen;
811 struct pipe_resource *result;
812
813 trace_dump_call_begin("pipe_screen", "resource_create_with_modifiers");
814
815 trace_dump_arg(ptr, screen);
816 trace_dump_arg(resource_template, templat);
817 trace_dump_arg_array(uint, modifiers, modifiers_count);
818
819 result = screen->resource_create_with_modifiers(screen, templat, modifiers, modifiers_count);
820
821 trace_dump_ret(ptr, result);
822
823 trace_dump_call_end();
824
825 if (result)
826 result->screen = _screen;
827 return result;
828 }
829
830 static struct pipe_resource *
trace_screen_resource_from_handle(struct pipe_screen * _screen,const struct pipe_resource * templ,struct winsys_handle * handle,unsigned usage)831 trace_screen_resource_from_handle(struct pipe_screen *_screen,
832 const struct pipe_resource *templ,
833 struct winsys_handle *handle,
834 unsigned usage)
835 {
836 struct trace_screen *tr_screen = trace_screen(_screen);
837 struct pipe_screen *screen = tr_screen->screen;
838 struct pipe_resource *result;
839
840 trace_dump_call_begin("pipe_screen", "resource_from_handle");
841
842 trace_dump_arg(ptr, screen);
843 trace_dump_arg(resource_template, templ);
844 trace_dump_arg(winsys_handle, handle);
845 trace_dump_arg(uint, usage);
846
847 result = screen->resource_from_handle(screen, templ, handle, usage);
848
849 trace_dump_ret(ptr, result);
850
851 trace_dump_call_end();
852
853 if (result)
854 result->screen = _screen;
855 return result;
856 }
857
858 static bool
trace_screen_check_resource_capability(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned bind)859 trace_screen_check_resource_capability(struct pipe_screen *_screen,
860 struct pipe_resource *resource,
861 unsigned bind)
862 {
863 struct pipe_screen *screen = trace_screen(_screen)->screen;
864
865 return screen->check_resource_capability(screen, resource, bind);
866 }
867
868 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)869 trace_screen_resource_get_handle(struct pipe_screen *_screen,
870 struct pipe_context *_pipe,
871 struct pipe_resource *resource,
872 struct winsys_handle *handle,
873 unsigned usage)
874 {
875 struct trace_screen *tr_screen = trace_screen(_screen);
876 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
877 struct pipe_screen *screen = tr_screen->screen;
878 bool result;
879
880 trace_dump_call_begin("pipe_screen", "resource_get_handle");
881
882 trace_dump_arg(ptr, screen);
883 trace_dump_arg(ptr, resource);
884 trace_dump_arg(uint, usage);
885
886 result = screen->resource_get_handle(screen, pipe, resource, handle, usage);
887
888 trace_dump_arg(winsys_handle, handle);
889 trace_dump_ret(bool, result);
890
891 trace_dump_call_end();
892
893 return result;
894 }
895
896 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)897 trace_screen_resource_get_param(struct pipe_screen *_screen,
898 struct pipe_context *_pipe,
899 struct pipe_resource *resource,
900 unsigned plane,
901 unsigned layer,
902 unsigned level,
903 enum pipe_resource_param param,
904 unsigned handle_usage,
905 uint64_t *value)
906 {
907 struct trace_screen *tr_screen = trace_screen(_screen);
908 struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;
909 struct pipe_screen *screen = tr_screen->screen;
910 bool result;
911
912 trace_dump_call_begin("pipe_screen", "resource_get_param");
913
914 trace_dump_arg(ptr, screen);
915 trace_dump_arg(ptr, resource);
916 trace_dump_arg(uint, plane);
917 trace_dump_arg(uint, layer);
918 trace_dump_arg(uint, level);
919 trace_dump_arg_enum(pipe_resource_param, param);
920 trace_dump_arg(uint, handle_usage);
921
922 result = screen->resource_get_param(screen, pipe,
923 resource, plane, layer, level, param,
924 handle_usage, value);
925
926 trace_dump_arg(uint, *value);
927 trace_dump_ret(bool, result);
928
929 trace_dump_call_end();
930
931 return result;
932 }
933
934 static void
trace_screen_resource_get_info(struct pipe_screen * _screen,struct pipe_resource * resource,unsigned * stride,unsigned * offset)935 trace_screen_resource_get_info(struct pipe_screen *_screen,
936 struct pipe_resource *resource,
937 unsigned *stride,
938 unsigned *offset)
939 {
940 struct trace_screen *tr_screen = trace_screen(_screen);
941 struct pipe_screen *screen = tr_screen->screen;
942
943 trace_dump_call_begin("pipe_screen", "resource_get_info");
944 trace_dump_arg(ptr, screen);
945 trace_dump_arg(ptr, resource);
946
947 screen->resource_get_info(screen, resource, stride, offset);
948
949 trace_dump_arg(uint, *stride);
950 trace_dump_arg(uint, *offset);
951
952 trace_dump_call_end();
953 }
954
955 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)956 trace_screen_resource_from_memobj(struct pipe_screen *_screen,
957 const struct pipe_resource *templ,
958 struct pipe_memory_object *memobj,
959 uint64_t offset)
960 {
961 struct pipe_screen *screen = trace_screen(_screen)->screen;
962
963 trace_dump_call_begin("pipe_screen", "resource_from_memobj");
964 trace_dump_arg(ptr, screen);
965 trace_dump_arg(resource_template, templ);
966 trace_dump_arg(ptr, memobj);
967 trace_dump_arg(uint, offset);
968
969 struct pipe_resource *res =
970 screen->resource_from_memobj(screen, templ, memobj, offset);
971
972 if (!res)
973 return NULL;
974 res->screen = _screen;
975
976 trace_dump_ret(ptr, res);
977 trace_dump_call_end();
978 return res;
979 }
980
981 static void
trace_screen_resource_changed(struct pipe_screen * _screen,struct pipe_resource * resource)982 trace_screen_resource_changed(struct pipe_screen *_screen,
983 struct pipe_resource *resource)
984 {
985 struct trace_screen *tr_scr = trace_screen(_screen);
986 struct pipe_screen *screen = tr_scr->screen;
987
988 trace_dump_call_begin("pipe_screen", "resource_changed");
989
990 trace_dump_arg(ptr, screen);
991 trace_dump_arg(ptr, resource);
992
993 if (screen->resource_changed)
994 screen->resource_changed(screen, resource);
995
996 trace_dump_call_end();
997 }
998
999 static void
trace_screen_resource_destroy(struct pipe_screen * _screen,struct pipe_resource * resource)1000 trace_screen_resource_destroy(struct pipe_screen *_screen,
1001 struct pipe_resource *resource)
1002 {
1003 struct trace_screen *tr_scr = trace_screen(_screen);
1004 struct pipe_screen *screen = tr_scr->screen;
1005
1006 /* Don't trace this, because due to the lack of pipe_resource wrapping,
1007 * we can get this call from inside of driver calls, which would try
1008 * to lock an already-locked mutex.
1009 */
1010 screen->resource_destroy(screen, resource);
1011 }
1012
1013
1014 /********************************************************************
1015 * fence
1016 */
1017
1018
1019 static void
trace_screen_fence_reference(struct pipe_screen * _screen,struct pipe_fence_handle ** pdst,struct pipe_fence_handle * src)1020 trace_screen_fence_reference(struct pipe_screen *_screen,
1021 struct pipe_fence_handle **pdst,
1022 struct pipe_fence_handle *src)
1023 {
1024 struct trace_screen *tr_scr = trace_screen(_screen);
1025 struct pipe_screen *screen = tr_scr->screen;
1026 struct pipe_fence_handle *dst;
1027
1028 assert(pdst);
1029 dst = *pdst;
1030
1031 trace_dump_call_begin("pipe_screen", "fence_reference");
1032
1033 trace_dump_arg(ptr, screen);
1034 trace_dump_arg(ptr, dst);
1035 trace_dump_arg(ptr, src);
1036
1037 screen->fence_reference(screen, pdst, src);
1038
1039 trace_dump_call_end();
1040 }
1041
1042
1043 static int
trace_screen_fence_get_fd(struct pipe_screen * _screen,struct pipe_fence_handle * fence)1044 trace_screen_fence_get_fd(struct pipe_screen *_screen,
1045 struct pipe_fence_handle *fence)
1046 {
1047 struct trace_screen *tr_scr = trace_screen(_screen);
1048 struct pipe_screen *screen = tr_scr->screen;
1049 int result;
1050
1051 trace_dump_call_begin("pipe_screen", "fence_get_fd");
1052
1053 trace_dump_arg(ptr, screen);
1054 trace_dump_arg(ptr, fence);
1055
1056 result = screen->fence_get_fd(screen, fence);
1057
1058 trace_dump_ret(int, result);
1059
1060 trace_dump_call_end();
1061
1062 return result;
1063 }
1064
1065 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)1066 trace_screen_create_fence_win32(struct pipe_screen *_screen,
1067 struct pipe_fence_handle **fence,
1068 void *handle,
1069 const void *name,
1070 enum pipe_fd_type type)
1071 {
1072 struct trace_screen *tr_scr = trace_screen(_screen);
1073 struct pipe_screen *screen = tr_scr->screen;
1074
1075 trace_dump_call_begin("pipe_screen", "create_fence_win32");
1076
1077 trace_dump_arg(ptr, screen);
1078 if (fence)
1079 trace_dump_arg(ptr, *fence);
1080 trace_dump_arg(ptr, handle);
1081 trace_dump_arg(ptr, name);
1082 trace_dump_arg_enum(pipe_fd_type, type);
1083
1084 trace_dump_call_end();
1085
1086 screen->create_fence_win32(screen, fence, handle, name, type);
1087 }
1088
1089
1090 static bool
trace_screen_fence_finish(struct pipe_screen * _screen,struct pipe_context * _ctx,struct pipe_fence_handle * fence,uint64_t timeout)1091 trace_screen_fence_finish(struct pipe_screen *_screen,
1092 struct pipe_context *_ctx,
1093 struct pipe_fence_handle *fence,
1094 uint64_t timeout)
1095 {
1096 struct trace_screen *tr_scr = trace_screen(_screen);
1097 struct pipe_screen *screen = tr_scr->screen;
1098 struct pipe_context *ctx = _ctx ? trace_get_possibly_threaded_context(_ctx) : NULL;
1099 int result;
1100
1101 result = screen->fence_finish(screen, ctx, fence, timeout);
1102
1103
1104 trace_dump_call_begin("pipe_screen", "fence_finish");
1105
1106 trace_dump_arg(ptr, screen);
1107 trace_dump_arg(ptr, ctx);
1108 trace_dump_arg(ptr, fence);
1109 trace_dump_arg(uint, timeout);
1110
1111 trace_dump_ret(bool, result);
1112
1113 trace_dump_call_end();
1114
1115 return result;
1116 }
1117
1118
1119 /********************************************************************
1120 * memobj
1121 */
1122
1123 static struct pipe_memory_object *
trace_screen_memobj_create_from_handle(struct pipe_screen * _screen,struct winsys_handle * handle,bool dedicated)1124 trace_screen_memobj_create_from_handle(struct pipe_screen *_screen,
1125 struct winsys_handle *handle,
1126 bool dedicated)
1127 {
1128 struct pipe_screen *screen = trace_screen(_screen)->screen;
1129
1130 trace_dump_call_begin("pipe_screen", "memobj_create_from_handle");
1131 trace_dump_arg(ptr, screen);
1132 trace_dump_arg(ptr, handle);
1133 trace_dump_arg(bool, dedicated);
1134
1135 struct pipe_memory_object *res =
1136 screen->memobj_create_from_handle(screen, handle, dedicated);
1137
1138 trace_dump_ret(ptr, res);
1139 trace_dump_call_end();
1140
1141 return res;
1142 }
1143
1144 static void
trace_screen_memobj_destroy(struct pipe_screen * _screen,struct pipe_memory_object * memobj)1145 trace_screen_memobj_destroy(struct pipe_screen *_screen,
1146 struct pipe_memory_object *memobj)
1147 {
1148 struct pipe_screen *screen = trace_screen(_screen)->screen;
1149
1150 trace_dump_call_begin("pipe_screen", "memobj_destroy");
1151 trace_dump_arg(ptr, screen);
1152 trace_dump_arg(ptr, memobj);
1153 trace_dump_call_end();
1154
1155 screen->memobj_destroy(screen, memobj);
1156 }
1157
1158
1159 /********************************************************************
1160 * screen
1161 */
1162
1163 static uint64_t
trace_screen_get_timestamp(struct pipe_screen * _screen)1164 trace_screen_get_timestamp(struct pipe_screen *_screen)
1165 {
1166 struct trace_screen *tr_scr = trace_screen(_screen);
1167 struct pipe_screen *screen = tr_scr->screen;
1168 uint64_t result;
1169
1170 trace_dump_call_begin("pipe_screen", "get_timestamp");
1171 trace_dump_arg(ptr, screen);
1172
1173 result = screen->get_timestamp(screen);
1174
1175 trace_dump_ret(uint, result);
1176 trace_dump_call_end();
1177
1178 return result;
1179 }
1180
1181 static char *
trace_screen_finalize_nir(struct pipe_screen * _screen,void * nir)1182 trace_screen_finalize_nir(struct pipe_screen *_screen, void *nir)
1183 {
1184 struct pipe_screen *screen = trace_screen(_screen)->screen;
1185
1186 return screen->finalize_nir(screen, nir);
1187 }
1188
1189 static void
trace_screen_destroy(struct pipe_screen * _screen)1190 trace_screen_destroy(struct pipe_screen *_screen)
1191 {
1192 struct trace_screen *tr_scr = trace_screen(_screen);
1193 struct pipe_screen *screen = tr_scr->screen;
1194
1195 trace_dump_call_begin("pipe_screen", "destroy");
1196 trace_dump_arg(ptr, screen);
1197 trace_dump_call_end();
1198
1199 if (trace_screens) {
1200 struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);
1201 if (he) {
1202 _mesa_hash_table_remove(trace_screens, he);
1203 if (!_mesa_hash_table_num_entries(trace_screens)) {
1204 _mesa_hash_table_destroy(trace_screens, NULL);
1205 trace_screens = NULL;
1206 }
1207 }
1208 }
1209
1210 screen->destroy(screen);
1211
1212 FREE(tr_scr);
1213 }
1214
1215 static void
trace_screen_query_memory_info(struct pipe_screen * _screen,struct pipe_memory_info * info)1216 trace_screen_query_memory_info(struct pipe_screen *_screen, struct pipe_memory_info *info)
1217 {
1218 struct trace_screen *tr_scr = trace_screen(_screen);
1219 struct pipe_screen *screen = tr_scr->screen;
1220
1221 trace_dump_call_begin("pipe_screen", "query_memory_info");
1222
1223 trace_dump_arg(ptr, screen);
1224
1225 screen->query_memory_info(screen, info);
1226
1227 trace_dump_ret(memory_info, info);
1228
1229 trace_dump_call_end();
1230 }
1231
1232 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)1233 trace_screen_query_dmabuf_modifiers(struct pipe_screen *_screen, enum pipe_format format, int max, uint64_t *modifiers, unsigned int *external_only, int *count)
1234 {
1235 struct trace_screen *tr_scr = trace_screen(_screen);
1236 struct pipe_screen *screen = tr_scr->screen;
1237
1238 trace_dump_call_begin("pipe_screen", "query_dmabuf_modifiers");
1239
1240 trace_dump_arg(ptr, screen);
1241 trace_dump_arg(format, format);
1242 trace_dump_arg(int, max);
1243
1244 screen->query_dmabuf_modifiers(screen, format, max, modifiers, external_only, count);
1245
1246 if (max)
1247 trace_dump_arg_array(uint, modifiers, *count);
1248 else
1249 trace_dump_arg_array(uint, modifiers, max);
1250 trace_dump_arg_array(uint, external_only, max);
1251 trace_dump_ret_begin();
1252 trace_dump_uint(*count);
1253 trace_dump_ret_end();
1254
1255 trace_dump_call_end();
1256 }
1257
1258 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)1259 trace_screen_is_compute_copy_faster(struct pipe_screen *_screen, enum pipe_format src_format,
1260 enum pipe_format dst_format, unsigned width, unsigned height,
1261 unsigned depth, bool cpu)
1262 {
1263 struct trace_screen *tr_scr = trace_screen(_screen);
1264 struct pipe_screen *screen = tr_scr->screen;
1265
1266 trace_dump_call_begin("pipe_screen", "is_compute_copy_faster");
1267
1268 trace_dump_arg(ptr, screen);
1269 trace_dump_arg(format, src_format);
1270 trace_dump_arg(format, dst_format);
1271 trace_dump_arg(uint, width);
1272 trace_dump_arg(uint, height);
1273 trace_dump_arg(uint, depth);
1274 trace_dump_arg(bool, cpu);
1275
1276 bool ret = screen->is_compute_copy_faster(screen, src_format, dst_format, width, height, depth, cpu);
1277
1278 trace_dump_ret(bool, ret);
1279
1280 trace_dump_call_end();
1281 return ret;
1282 }
1283
1284 static bool
trace_screen_is_dmabuf_modifier_supported(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format,bool * external_only)1285 trace_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format, bool *external_only)
1286 {
1287 struct trace_screen *tr_scr = trace_screen(_screen);
1288 struct pipe_screen *screen = tr_scr->screen;
1289
1290 trace_dump_call_begin("pipe_screen", "is_dmabuf_modifier_supported");
1291
1292 trace_dump_arg(ptr, screen);
1293 trace_dump_arg(uint, modifier);
1294 trace_dump_arg(format, format);
1295
1296 bool ret = screen->is_dmabuf_modifier_supported(screen, modifier, format, external_only);
1297
1298 trace_dump_arg_begin("external_only");
1299 trace_dump_bool(external_only ? *external_only : false);
1300 trace_dump_arg_end();
1301
1302 trace_dump_ret(bool, ret);
1303
1304 trace_dump_call_end();
1305 return ret;
1306 }
1307
1308 static unsigned int
trace_screen_get_dmabuf_modifier_planes(struct pipe_screen * _screen,uint64_t modifier,enum pipe_format format)1309 trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format)
1310 {
1311 struct trace_screen *tr_scr = trace_screen(_screen);
1312 struct pipe_screen *screen = tr_scr->screen;
1313
1314 trace_dump_call_begin("pipe_screen", "get_dmabuf_modifier_planes");
1315
1316 trace_dump_arg(ptr, screen);
1317 trace_dump_arg(uint, modifier);
1318 trace_dump_arg(format, format);
1319
1320 unsigned ret = screen->get_dmabuf_modifier_planes(screen, modifier, format);
1321
1322 trace_dump_ret(uint, ret);
1323
1324 trace_dump_call_end();
1325 return ret;
1326 }
1327
1328 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)1329 trace_screen_get_sparse_texture_virtual_page_size(struct pipe_screen *_screen,
1330 enum pipe_texture_target target,
1331 bool multi_sample,
1332 enum pipe_format format,
1333 unsigned offset, unsigned size,
1334 int *x, int *y, int *z)
1335 {
1336 struct trace_screen *tr_scr = trace_screen(_screen);
1337 struct pipe_screen *screen = tr_scr->screen;
1338
1339 trace_dump_call_begin("pipe_screen", "get_sparse_texture_virtual_page_size");
1340
1341 trace_dump_arg(ptr, screen);
1342 trace_dump_arg_enum(pipe_texture_target, target);
1343 trace_dump_arg(format, format);
1344 trace_dump_arg(uint, offset);
1345 trace_dump_arg(uint, size);
1346
1347 int ret = screen->get_sparse_texture_virtual_page_size(screen, target, multi_sample,
1348 format, offset, size, x, y, z);
1349
1350 if (x)
1351 trace_dump_arg(uint, *x);
1352 else
1353 trace_dump_arg(ptr, x);
1354 if (y)
1355 trace_dump_arg(uint, *y);
1356 else
1357 trace_dump_arg(ptr, y);
1358 if (z)
1359 trace_dump_arg(uint, *z);
1360 else
1361 trace_dump_arg(ptr, z);
1362
1363 trace_dump_ret(int, ret);
1364
1365 trace_dump_call_end();
1366 return ret;
1367 }
1368
1369 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)1370 trace_screen_create_vertex_state(struct pipe_screen *_screen,
1371 struct pipe_vertex_buffer *buffer,
1372 const struct pipe_vertex_element *elements,
1373 unsigned num_elements,
1374 struct pipe_resource *indexbuf,
1375 uint32_t full_velem_mask)
1376 {
1377 struct trace_screen *tr_scr = trace_screen(_screen);
1378 struct pipe_screen *screen = tr_scr->screen;
1379
1380 trace_dump_call_begin("pipe_screen", "create_vertex_state");
1381
1382 trace_dump_arg(ptr, screen);
1383 trace_dump_arg(ptr, buffer->buffer.resource);
1384 trace_dump_arg(vertex_buffer, buffer);
1385 trace_dump_arg_begin("elements");
1386 trace_dump_struct_array(vertex_element, elements, num_elements);
1387 trace_dump_arg_end();
1388 trace_dump_arg(uint, num_elements);
1389 trace_dump_arg(ptr, indexbuf);
1390 trace_dump_arg(uint, full_velem_mask);
1391
1392 struct pipe_vertex_state *vstate =
1393 screen->create_vertex_state(screen, buffer, elements, num_elements,
1394 indexbuf, full_velem_mask);
1395 trace_dump_ret(ptr, vstate);
1396 trace_dump_call_end();
1397 return vstate;
1398 }
1399
trace_screen_vertex_state_destroy(struct pipe_screen * _screen,struct pipe_vertex_state * state)1400 static void trace_screen_vertex_state_destroy(struct pipe_screen *_screen,
1401 struct pipe_vertex_state *state)
1402 {
1403 struct trace_screen *tr_scr = trace_screen(_screen);
1404 struct pipe_screen *screen = tr_scr->screen;
1405
1406 trace_dump_call_begin("pipe_screen", "vertex_state_destroy");
1407 trace_dump_arg(ptr, screen);
1408 trace_dump_arg(ptr, state);
1409 trace_dump_call_end();
1410
1411 screen->vertex_state_destroy(screen, state);
1412 }
1413
trace_screen_set_fence_timeline_value(struct pipe_screen * _screen,struct pipe_fence_handle * fence,uint64_t value)1414 static void trace_screen_set_fence_timeline_value(struct pipe_screen *_screen,
1415 struct pipe_fence_handle *fence,
1416 uint64_t value)
1417 {
1418 struct trace_screen *tr_scr = trace_screen(_screen);
1419 struct pipe_screen *screen = tr_scr->screen;
1420
1421 trace_dump_call_begin("pipe_screen", "set_fence_timeline_value");
1422 trace_dump_arg(ptr, screen);
1423 trace_dump_arg(ptr, fence);
1424 trace_dump_arg(uint, value);
1425 trace_dump_call_end();
1426
1427 screen->set_fence_timeline_value(screen, fence, value);
1428 }
1429
trace_screen_query_compression_rates(struct pipe_screen * _screen,enum pipe_format format,int max,uint32_t * rates,int * count)1430 static void trace_screen_query_compression_rates(struct pipe_screen *_screen,
1431 enum pipe_format format,
1432 int max, uint32_t *rates,
1433 int *count)
1434 {
1435 struct trace_screen *tr_scr = trace_screen(_screen);
1436 struct pipe_screen *screen = tr_scr->screen;
1437
1438 trace_dump_call_begin("pipe_screen", "query_compression_rates");
1439 trace_dump_arg(ptr, screen);
1440 trace_dump_arg(format, format);
1441 trace_dump_arg(int, max);
1442
1443 screen->query_compression_rates(screen, format, max, rates, count);
1444
1445 if (max)
1446 trace_dump_arg_array(uint, rates, *count);
1447 else
1448 trace_dump_arg_array(uint, rates, max);
1449 trace_dump_ret_begin();
1450 trace_dump_uint(*count);
1451 trace_dump_ret_end();
1452
1453 trace_dump_call_end();
1454 }
1455
trace_screen_query_compression_modifiers(struct pipe_screen * _screen,enum pipe_format format,uint32_t rate,int max,uint64_t * modifiers,int * count)1456 static void trace_screen_query_compression_modifiers(struct pipe_screen *_screen,
1457 enum pipe_format format,
1458 uint32_t rate, int max,
1459 uint64_t *modifiers,
1460 int *count)
1461 {
1462 struct trace_screen *tr_scr = trace_screen(_screen);
1463 struct pipe_screen *screen = tr_scr->screen;
1464
1465 trace_dump_call_begin("pipe_screen", "query_compression_rates");
1466 trace_dump_arg(ptr, screen);
1467 trace_dump_arg(format, format);
1468 trace_dump_arg(uint, rate);
1469 trace_dump_arg(int, max);
1470
1471 screen->query_compression_modifiers(screen, format, rate, max, modifiers, count);
1472
1473 if (max)
1474 trace_dump_arg_array(uint, modifiers, *count);
1475 else
1476 trace_dump_arg_array(uint, modifiers, max);
1477 trace_dump_ret_begin();
1478 trace_dump_uint(*count);
1479 trace_dump_ret_end();
1480
1481 trace_dump_call_end();
1482 }
1483
trace_screen_is_compression_modifier(struct pipe_screen * _screen,enum pipe_format format,uint64_t modifier,uint32_t * rate)1484 static bool trace_screen_is_compression_modifier(struct pipe_screen *_screen,
1485 enum pipe_format format,
1486 uint64_t modifier,
1487 uint32_t *rate)
1488 {
1489 struct trace_screen *tr_scr = trace_screen(_screen);
1490 struct pipe_screen *screen = tr_scr->screen;
1491 bool result;
1492
1493 trace_dump_call_begin("pipe_screen", "query_compression_rates");
1494 trace_dump_arg(ptr, screen);
1495 trace_dump_arg(format, format);
1496 trace_dump_arg(uint, modifier);
1497
1498 result = screen->is_compression_modifier(screen, format, modifier, rate);
1499
1500 trace_dump_ret_begin();
1501 trace_dump_uint(*rate);
1502 trace_dump_bool(result);
1503 trace_dump_ret_end();
1504
1505 trace_dump_call_end();
1506
1507 return result;
1508 }
1509
1510 bool
trace_enabled(void)1511 trace_enabled(void)
1512 {
1513 static bool firstrun = true;
1514
1515 if (!firstrun)
1516 return trace;
1517 firstrun = false;
1518
1519 if(trace_dump_trace_begin()) {
1520 trace_dumping_start();
1521 trace = true;
1522 }
1523
1524 return trace;
1525 }
1526
tr_get_driver_pipe_screen(struct pipe_screen * _screen)1527 static struct pipe_screen * tr_get_driver_pipe_screen(struct pipe_screen *_screen)
1528 {
1529 struct pipe_screen *screen = trace_screen(_screen)->screen;
1530
1531 if (screen->get_driver_pipe_screen)
1532 return screen->get_driver_pipe_screen(screen);
1533 return screen;
1534 }
1535
1536 struct pipe_screen *
trace_screen_create(struct pipe_screen * screen)1537 trace_screen_create(struct pipe_screen *screen)
1538 {
1539 struct trace_screen *tr_scr;
1540
1541 /* if zink+lavapipe is enabled, ensure that only one driver is traced */
1542 const char *driver = debug_get_option("MESA_LOADER_DRIVER_OVERRIDE", NULL);
1543 if (driver && !strcmp(driver, "zink")) {
1544 /* the user wants zink: check whether they want to trace zink or lavapipe */
1545 bool trace_lavapipe = debug_get_bool_option("ZINK_TRACE_LAVAPIPE", false);
1546 if (!strncmp(screen->get_name(screen), "zink", 4)) {
1547 /* this is the zink screen: only trace if lavapipe tracing is disabled */
1548 if (trace_lavapipe)
1549 return screen;
1550 } else {
1551 /* this is the llvmpipe screen: only trace if lavapipe tracing is enabled */
1552 if (!trace_lavapipe)
1553 return screen;
1554 }
1555 }
1556
1557 if (!trace_enabled())
1558 goto error1;
1559
1560 trace_dump_call_begin("", "pipe_screen_create");
1561
1562 tr_scr = CALLOC_STRUCT(trace_screen);
1563 if (!tr_scr)
1564 goto error2;
1565
1566 #define SCR_INIT(_member) \
1567 tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL
1568
1569 tr_scr->base.destroy = trace_screen_destroy;
1570 tr_scr->base.get_name = trace_screen_get_name;
1571 tr_scr->base.get_vendor = trace_screen_get_vendor;
1572 tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;
1573 SCR_INIT(get_compiler_options);
1574 SCR_INIT(get_disk_shader_cache);
1575 tr_scr->base.get_param = trace_screen_get_param;
1576 tr_scr->base.get_shader_param = trace_screen_get_shader_param;
1577 tr_scr->base.get_paramf = trace_screen_get_paramf;
1578 tr_scr->base.get_compute_param = trace_screen_get_compute_param;
1579 SCR_INIT(get_video_param);
1580 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
1581 SCR_INIT(is_video_format_supported);
1582 assert(screen->context_create);
1583 tr_scr->base.context_create = trace_screen_context_create;
1584 tr_scr->base.resource_create = trace_screen_resource_create;
1585 SCR_INIT(resource_create_with_modifiers);
1586 tr_scr->base.resource_create_unbacked = trace_screen_resource_create_unbacked;
1587 SCR_INIT(resource_create_drawable);
1588 tr_scr->base.resource_bind_backing = trace_screen_resource_bind_backing;
1589 tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
1590 tr_scr->base.allocate_memory = trace_screen_allocate_memory;
1591 SCR_INIT(allocate_memory_fd);
1592 tr_scr->base.free_memory = trace_screen_free_memory;
1593 SCR_INIT(free_memory_fd);
1594 tr_scr->base.map_memory = trace_screen_map_memory;
1595 tr_scr->base.unmap_memory = trace_screen_unmap_memory;
1596 SCR_INIT(query_memory_info);
1597 SCR_INIT(query_dmabuf_modifiers);
1598 SCR_INIT(is_compute_copy_faster);
1599 SCR_INIT(is_dmabuf_modifier_supported);
1600 SCR_INIT(get_dmabuf_modifier_planes);
1601 SCR_INIT(check_resource_capability);
1602 tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
1603 SCR_INIT(resource_get_param);
1604 SCR_INIT(resource_get_info);
1605 SCR_INIT(resource_from_memobj);
1606 SCR_INIT(resource_changed);
1607 tr_scr->base.resource_destroy = trace_screen_resource_destroy;
1608 tr_scr->base.fence_reference = trace_screen_fence_reference;
1609 SCR_INIT(fence_get_fd);
1610 SCR_INIT(create_fence_win32);
1611 tr_scr->base.fence_finish = trace_screen_fence_finish;
1612 SCR_INIT(memobj_create_from_handle);
1613 SCR_INIT(memobj_destroy);
1614 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
1615 tr_scr->base.get_timestamp = trace_screen_get_timestamp;
1616 SCR_INIT(get_driver_uuid);
1617 SCR_INIT(get_device_uuid);
1618 SCR_INIT(get_device_luid);
1619 SCR_INIT(get_device_node_mask);
1620 SCR_INIT(finalize_nir);
1621 SCR_INIT(create_vertex_state);
1622 SCR_INIT(vertex_state_destroy);
1623 tr_scr->base.transfer_helper = screen->transfer_helper;
1624 SCR_INIT(get_sparse_texture_virtual_page_size);
1625 SCR_INIT(set_fence_timeline_value);
1626 SCR_INIT(driver_thread_add_job);
1627 SCR_INIT(query_compression_rates);
1628 SCR_INIT(query_compression_modifiers);
1629 SCR_INIT(is_compression_modifier);
1630 tr_scr->base.get_driver_pipe_screen = tr_get_driver_pipe_screen;
1631
1632 tr_scr->screen = screen;
1633
1634 trace_dump_ret(ptr, screen);
1635 trace_dump_call_end();
1636
1637 if (!trace_screens)
1638 trace_screens = _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
1639 _mesa_hash_table_insert(trace_screens, screen, tr_scr);
1640
1641 tr_scr->trace_tc = debug_get_bool_option("GALLIUM_TRACE_TC", false);
1642
1643 return &tr_scr->base;
1644
1645 error2:
1646 trace_dump_ret(ptr, screen);
1647 trace_dump_call_end();
1648 error1:
1649 return screen;
1650 }
1651
1652
1653 struct trace_screen *
trace_screen(struct pipe_screen * screen)1654 trace_screen(struct pipe_screen *screen)
1655 {
1656 assert(screen);
1657 assert(screen->destroy == trace_screen_destroy);
1658 return (struct trace_screen *)screen;
1659 }
1660