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