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