xref: /aosp_15_r20/external/mesa3d/src/gallium/auxiliary/driver_trace/tr_screen.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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