• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright 2008 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #include "util/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,enum mesa_prim output_prim)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                                         enum mesa_prim output_prim)
1316 {
1317    struct trace_context *tr_ctx = trace_context(_pipe);
1318    struct pipe_context *pipe = tr_ctx->pipe;
1319 
1320    trace_dump_call_begin("pipe_context", "set_stream_output_targets");
1321 
1322    trace_dump_arg(ptr, pipe);
1323    trace_dump_arg(uint, num_targets);
1324    trace_dump_arg_array(ptr, tgs, num_targets);
1325    trace_dump_arg_array(uint, offsets, num_targets);
1326    trace_dump_arg(uint, output_prim);
1327 
1328    pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets, output_prim);
1329 
1330    trace_dump_call_end();
1331 }
1332 
1333 
1334 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)1335 trace_context_resource_copy_region(struct pipe_context *_pipe,
1336                                    struct pipe_resource *dst,
1337                                    unsigned dst_level,
1338                                    unsigned dstx, unsigned dsty, unsigned dstz,
1339                                    struct pipe_resource *src,
1340                                    unsigned src_level,
1341                                    const struct pipe_box *src_box)
1342 {
1343    struct trace_context *tr_ctx = trace_context(_pipe);
1344    struct pipe_context *pipe = tr_ctx->pipe;
1345 
1346    trace_dump_call_begin("pipe_context", "resource_copy_region");
1347 
1348    trace_dump_arg(ptr, pipe);
1349    trace_dump_arg(ptr, dst);
1350    trace_dump_arg(uint, dst_level);
1351    trace_dump_arg(uint, dstx);
1352    trace_dump_arg(uint, dsty);
1353    trace_dump_arg(uint, dstz);
1354    trace_dump_arg(ptr, src);
1355    trace_dump_arg(uint, src_level);
1356    trace_dump_arg(box, src_box);
1357 
1358    pipe->resource_copy_region(pipe,
1359                               dst, dst_level, dstx, dsty, dstz,
1360                               src, src_level, src_box);
1361 
1362    trace_dump_call_end();
1363 }
1364 
1365 
1366 static void
trace_context_blit(struct pipe_context * _pipe,const struct pipe_blit_info * _info)1367 trace_context_blit(struct pipe_context *_pipe,
1368                    const struct pipe_blit_info *_info)
1369 {
1370    struct trace_context *tr_ctx = trace_context(_pipe);
1371    struct pipe_context *pipe = tr_ctx->pipe;
1372    struct pipe_blit_info info = *_info;
1373 
1374    trace_dump_call_begin("pipe_context", "blit");
1375 
1376    trace_dump_arg(ptr, pipe);
1377    trace_dump_arg(blit_info, _info);
1378 
1379    pipe->blit(pipe, &info);
1380 
1381    trace_dump_call_end();
1382 }
1383 
1384 
1385 static void
trace_context_flush_resource(struct pipe_context * _pipe,struct pipe_resource * resource)1386 trace_context_flush_resource(struct pipe_context *_pipe,
1387                              struct pipe_resource *resource)
1388 {
1389    struct trace_context *tr_ctx = trace_context(_pipe);
1390    struct pipe_context *pipe = tr_ctx->pipe;
1391 
1392    trace_dump_call_begin("pipe_context", "flush_resource");
1393 
1394    trace_dump_arg(ptr, pipe);
1395    trace_dump_arg(ptr, resource);
1396 
1397    pipe->flush_resource(pipe, resource);
1398 
1399    trace_dump_call_end();
1400 }
1401 
1402 
1403 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)1404 trace_context_clear(struct pipe_context *_pipe,
1405                     unsigned buffers,
1406                     const struct pipe_scissor_state *scissor_state,
1407                     const union pipe_color_union *color,
1408                     double depth,
1409                     unsigned stencil)
1410 {
1411    struct trace_context *tr_ctx = trace_context(_pipe);
1412    struct pipe_context *pipe = tr_ctx->pipe;
1413 
1414    trace_dump_call_begin("pipe_context", "clear");
1415 
1416    trace_dump_arg(ptr, pipe);
1417    trace_dump_arg(uint, buffers);
1418    trace_dump_arg_begin("scissor_state");
1419    trace_dump_scissor_state(scissor_state);
1420    trace_dump_arg_end();
1421    if (color)
1422       trace_dump_arg_array(uint, color->ui, 4);
1423    else
1424       trace_dump_null();
1425    trace_dump_arg(float, depth);
1426    trace_dump_arg(uint, stencil);
1427 
1428    pipe->clear(pipe, buffers, scissor_state, color, depth, stencil);
1429 
1430    trace_dump_call_end();
1431 }
1432 
1433 
1434 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)1435 trace_context_clear_render_target(struct pipe_context *_pipe,
1436                                   struct pipe_surface *dst,
1437                                   const union pipe_color_union *color,
1438                                   unsigned dstx, unsigned dsty,
1439                                   unsigned width, unsigned height,
1440                                   bool render_condition_enabled)
1441 {
1442    struct trace_context *tr_ctx = trace_context(_pipe);
1443    struct pipe_context *pipe = tr_ctx->pipe;
1444 
1445    dst = trace_surface_unwrap(tr_ctx, dst);
1446 
1447    trace_dump_call_begin("pipe_context", "clear_render_target");
1448 
1449    trace_dump_arg(ptr, pipe);
1450    trace_dump_arg(ptr, dst);
1451    trace_dump_arg_array(uint, color->ui, 4);
1452    trace_dump_arg(uint, dstx);
1453    trace_dump_arg(uint, dsty);
1454    trace_dump_arg(uint, width);
1455    trace_dump_arg(uint, height);
1456    trace_dump_arg(bool, render_condition_enabled);
1457 
1458    pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height,
1459                              render_condition_enabled);
1460 
1461    trace_dump_call_end();
1462 }
1463 
1464 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)1465 trace_context_clear_depth_stencil(struct pipe_context *_pipe,
1466                                   struct pipe_surface *dst,
1467                                   unsigned clear_flags,
1468                                   double depth,
1469                                   unsigned stencil,
1470                                   unsigned dstx, unsigned dsty,
1471                                   unsigned width, unsigned height,
1472                                   bool render_condition_enabled)
1473 {
1474    struct trace_context *tr_ctx = trace_context(_pipe);
1475    struct pipe_context *pipe = tr_ctx->pipe;
1476 
1477    dst = trace_surface_unwrap(tr_ctx, dst);
1478 
1479    trace_dump_call_begin("pipe_context", "clear_depth_stencil");
1480 
1481    trace_dump_arg(ptr, pipe);
1482    trace_dump_arg(ptr, dst);
1483    trace_dump_arg(uint, clear_flags);
1484    trace_dump_arg(float, depth);
1485    trace_dump_arg(uint, stencil);
1486    trace_dump_arg(uint, dstx);
1487    trace_dump_arg(uint, dsty);
1488    trace_dump_arg(uint, width);
1489    trace_dump_arg(uint, height);
1490    trace_dump_arg(bool, render_condition_enabled);
1491 
1492    pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
1493                              dstx, dsty, width, height,
1494                              render_condition_enabled);
1495 
1496    trace_dump_call_end();
1497 }
1498 
1499 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)1500 trace_context_clear_buffer(struct pipe_context *_pipe,
1501                            struct pipe_resource *res,
1502                            unsigned offset,
1503                            unsigned size,
1504                            const void *clear_value,
1505                            int clear_value_size)
1506 {
1507    struct trace_context *tr_ctx = trace_context(_pipe);
1508    struct pipe_context *pipe = tr_ctx->pipe;
1509 
1510 
1511    trace_dump_call_begin("pipe_context", "clear_buffer");
1512 
1513    trace_dump_arg(ptr, pipe);
1514    trace_dump_arg(ptr, res);
1515    trace_dump_arg(uint, offset);
1516    trace_dump_arg(uint, size);
1517    trace_dump_arg(ptr, clear_value);
1518    trace_dump_arg(int, clear_value_size);
1519 
1520    pipe->clear_buffer(pipe, res, offset, size, clear_value, clear_value_size);
1521 
1522    trace_dump_call_end();
1523 }
1524 
1525 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)1526 trace_context_clear_texture(struct pipe_context *_pipe,
1527                             struct pipe_resource *res,
1528                             unsigned level,
1529                             const struct pipe_box *box,
1530                             const void *data)
1531 {
1532    struct trace_context *tr_ctx = trace_context(_pipe);
1533    const struct util_format_description *desc = util_format_description(res->format);
1534    struct pipe_context *pipe = tr_ctx->pipe;
1535    union pipe_color_union color;
1536    float depth = 0.0f;
1537    uint8_t stencil = 0;
1538 
1539    trace_dump_call_begin("pipe_context", "clear_texture");
1540    trace_dump_arg(ptr, pipe);
1541    trace_dump_arg(ptr, res);
1542    trace_dump_arg(uint, level);
1543    trace_dump_arg_begin("box");
1544    trace_dump_box(box);
1545    trace_dump_arg_end();
1546    if (util_format_has_depth(desc)) {
1547       util_format_unpack_z_float(res->format, &depth, data, 1);
1548       trace_dump_arg(float, depth);
1549    }
1550    if (util_format_has_stencil(desc)) {
1551       util_format_unpack_s_8uint(res->format, &stencil, data, 1);
1552       trace_dump_arg(uint, stencil);
1553    }
1554    if (!util_format_is_depth_or_stencil(res->format)) {
1555       util_format_unpack_rgba(res->format, color.ui, data, 1);
1556       trace_dump_arg_array(uint, color.ui, 4);
1557    }
1558 
1559    pipe->clear_texture(pipe, res, level, box, data);
1560 
1561    trace_dump_call_end();
1562 }
1563 
1564 static void
trace_context_flush(struct pipe_context * _pipe,struct pipe_fence_handle ** fence,unsigned flags)1565 trace_context_flush(struct pipe_context *_pipe,
1566                     struct pipe_fence_handle **fence,
1567                     unsigned flags)
1568 {
1569    struct trace_context *tr_ctx = trace_context(_pipe);
1570    struct pipe_context *pipe = tr_ctx->pipe;
1571 
1572    trace_dump_call_begin("pipe_context", "flush");
1573 
1574    trace_dump_arg(ptr, pipe);
1575    trace_dump_arg(uint, flags);
1576 
1577    pipe->flush(pipe, fence, flags);
1578 
1579    if (fence)
1580       trace_dump_ret(ptr, *fence);
1581 
1582    trace_dump_call_end();
1583 
1584    if (flags & PIPE_FLUSH_END_OF_FRAME) {
1585       trace_dump_check_trigger();
1586       tr_ctx->seen_fb_state = false;
1587    }
1588 }
1589 
1590 
1591 static void
trace_context_create_fence_fd(struct pipe_context * _pipe,struct pipe_fence_handle ** fence,int fd,enum pipe_fd_type type)1592 trace_context_create_fence_fd(struct pipe_context *_pipe,
1593                               struct pipe_fence_handle **fence,
1594                               int fd,
1595                               enum pipe_fd_type type)
1596 {
1597    struct trace_context *tr_ctx = trace_context(_pipe);
1598    struct pipe_context *pipe = tr_ctx->pipe;
1599 
1600    trace_dump_call_begin("pipe_context", "create_fence_fd");
1601 
1602    trace_dump_arg(ptr, pipe);
1603    trace_dump_arg_enum(pipe_fd_type, fd);
1604    trace_dump_arg(uint, type);
1605 
1606    pipe->create_fence_fd(pipe, fence, fd, type);
1607 
1608    if (fence)
1609       trace_dump_ret(ptr, *fence);
1610 
1611    trace_dump_call_end();
1612 }
1613 
1614 
1615 static void
trace_context_fence_server_sync(struct pipe_context * _pipe,struct pipe_fence_handle * fence)1616 trace_context_fence_server_sync(struct pipe_context *_pipe,
1617                                 struct pipe_fence_handle *fence)
1618 {
1619    struct trace_context *tr_ctx = trace_context(_pipe);
1620    struct pipe_context *pipe = tr_ctx->pipe;
1621 
1622    trace_dump_call_begin("pipe_context", "fence_server_sync");
1623 
1624    trace_dump_arg(ptr, pipe);
1625    trace_dump_arg(ptr, fence);
1626 
1627    pipe->fence_server_sync(pipe, fence);
1628 
1629    trace_dump_call_end();
1630 }
1631 
1632 
1633 static void
trace_context_fence_server_signal(struct pipe_context * _pipe,struct pipe_fence_handle * fence)1634 trace_context_fence_server_signal(struct pipe_context *_pipe,
1635                                 struct pipe_fence_handle *fence)
1636 {
1637    struct trace_context *tr_ctx = trace_context(_pipe);
1638    struct pipe_context *pipe = tr_ctx->pipe;
1639 
1640    trace_dump_call_begin("pipe_context", "fence_server_signal");
1641 
1642    trace_dump_arg(ptr, pipe);
1643    trace_dump_arg(ptr, fence);
1644 
1645    pipe->fence_server_signal(pipe, fence);
1646 
1647    trace_dump_call_end();
1648 }
1649 
1650 
1651 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)1652 trace_context_generate_mipmap(struct pipe_context *_pipe,
1653                               struct pipe_resource *res,
1654                               enum pipe_format format,
1655                               unsigned base_level,
1656                               unsigned last_level,
1657                               unsigned first_layer,
1658                               unsigned last_layer)
1659 {
1660    struct trace_context *tr_ctx = trace_context(_pipe);
1661    struct pipe_context *pipe = tr_ctx->pipe;
1662    bool ret;
1663 
1664    trace_dump_call_begin("pipe_context", "generate_mipmap");
1665 
1666    trace_dump_arg(ptr, pipe);
1667    trace_dump_arg(ptr, res);
1668 
1669    trace_dump_arg(format, format);
1670    trace_dump_arg(uint, base_level);
1671    trace_dump_arg(uint, last_level);
1672    trace_dump_arg(uint, first_layer);
1673    trace_dump_arg(uint, last_layer);
1674 
1675    ret = pipe->generate_mipmap(pipe, res, format, base_level, last_level,
1676                                first_layer, last_layer);
1677 
1678    trace_dump_ret(bool, ret);
1679    trace_dump_call_end();
1680 
1681    return ret;
1682 }
1683 
1684 
1685 static void
trace_context_destroy(struct pipe_context * _pipe)1686 trace_context_destroy(struct pipe_context *_pipe)
1687 {
1688    struct trace_context *tr_ctx = trace_context(_pipe);
1689    struct pipe_context *pipe = tr_ctx->pipe;
1690 
1691    trace_dump_call_begin("pipe_context", "destroy");
1692    trace_dump_arg(ptr, pipe);
1693    trace_dump_call_end();
1694 
1695    pipe->destroy(pipe);
1696 
1697    ralloc_free(tr_ctx);
1698 }
1699 
1700 
1701 /********************************************************************
1702  * transfer
1703  */
1704 
1705 
1706 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)1707 trace_context_transfer_map(struct pipe_context *_context,
1708                            struct pipe_resource *resource,
1709                            unsigned level,
1710                            unsigned usage,
1711                            const struct pipe_box *box,
1712                            struct pipe_transfer **transfer)
1713 {
1714    struct trace_context *tr_context = trace_context(_context);
1715    struct pipe_context *pipe = tr_context->pipe;
1716    struct pipe_transfer *xfer = NULL;
1717    void *map;
1718 
1719    if (resource->target == PIPE_BUFFER)
1720       map = pipe->buffer_map(pipe, resource, level, usage, box, &xfer);
1721    else
1722       map = pipe->texture_map(pipe, resource, level, usage, box, &xfer);
1723    if (!map)
1724       return NULL;
1725    *transfer = trace_transfer_create(tr_context, resource, xfer);
1726    trace_dump_call_begin("pipe_context", resource->target == PIPE_BUFFER ? "buffer_map" : "texture_map");
1727 
1728    trace_dump_arg(ptr, pipe);
1729    trace_dump_arg(ptr, resource);
1730    trace_dump_arg(uint, level);
1731    trace_dump_arg_enum(pipe_map_flags, usage);
1732    trace_dump_arg(box, box);
1733 
1734    trace_dump_arg(ptr, xfer);
1735    trace_dump_ret(ptr, map);
1736 
1737    trace_dump_call_end();
1738 
1739    if (map) {
1740       if (usage & PIPE_MAP_WRITE) {
1741          trace_transfer(*transfer)->map = map;
1742       }
1743    }
1744 
1745    return *transfer ? map : NULL;
1746 }
1747 
1748 static void
trace_context_transfer_flush_region(struct pipe_context * _context,struct pipe_transfer * _transfer,const struct pipe_box * box)1749 trace_context_transfer_flush_region( struct pipe_context *_context,
1750 				     struct pipe_transfer *_transfer,
1751 				     const struct pipe_box *box)
1752 {
1753    struct trace_context *tr_context = trace_context(_context);
1754    struct trace_transfer *tr_transfer = trace_transfer(_transfer);
1755    struct pipe_context *pipe = tr_context->pipe;
1756    struct pipe_transfer *transfer = tr_transfer->transfer;
1757 
1758    trace_dump_call_begin("pipe_context", "transfer_flush_region");
1759 
1760    trace_dump_arg(ptr, pipe);
1761    trace_dump_arg(ptr, transfer);
1762    trace_dump_arg(box, box);
1763 
1764    trace_dump_call_end();
1765 
1766    pipe->transfer_flush_region(pipe, transfer, box);
1767 }
1768 
1769 static void
trace_context_transfer_unmap(struct pipe_context * _context,struct pipe_transfer * _transfer)1770 trace_context_transfer_unmap(struct pipe_context *_context,
1771                              struct pipe_transfer *_transfer)
1772 {
1773    struct trace_context *tr_ctx = trace_context(_context);
1774    struct trace_transfer *tr_trans = trace_transfer(_transfer);
1775    struct pipe_context *context = tr_ctx->pipe;
1776    struct pipe_transfer *transfer = tr_trans->transfer;
1777 
1778 
1779    trace_dump_call_begin("pipe_context", "transfer_unmap");
1780 
1781    trace_dump_arg(ptr, context);
1782    trace_dump_arg(ptr, transfer);
1783 
1784    trace_dump_call_end();
1785 
1786    if (tr_trans->map && !tr_ctx->threaded) {
1787       /*
1788        * Fake a texture/buffer_subdata
1789        */
1790 
1791       struct pipe_resource *resource = transfer->resource;
1792       unsigned usage = transfer->usage;
1793       const struct pipe_box *box = &transfer->box;
1794       unsigned stride = transfer->stride;
1795       uintptr_t layer_stride = transfer->layer_stride;
1796 
1797       if (resource->target == PIPE_BUFFER) {
1798          unsigned offset = box->x;
1799          unsigned size = box->width;
1800 
1801          trace_dump_call_begin("pipe_context", "buffer_subdata");
1802 
1803          trace_dump_arg(ptr, context);
1804          trace_dump_arg(ptr, resource);
1805          trace_dump_arg_enum(pipe_map_flags, usage);
1806          trace_dump_arg(uint, offset);
1807          trace_dump_arg(uint, size);
1808 
1809          trace_dump_arg_begin("data");
1810          trace_dump_box_bytes(tr_trans->map,
1811                               resource,
1812                               box,
1813                               stride,
1814                               layer_stride);
1815          trace_dump_arg_end();
1816 
1817          trace_dump_arg(uint, stride);
1818          trace_dump_arg(uint, layer_stride);
1819 
1820          trace_dump_call_end();
1821       } else {
1822          unsigned level = transfer->level;
1823 
1824          trace_dump_call_begin("pipe_context", "texture_subdata");
1825 
1826          trace_dump_arg(ptr, context);
1827          trace_dump_arg(ptr, resource);
1828          trace_dump_arg(uint, level);
1829          trace_dump_arg_enum(pipe_map_flags, usage);
1830          trace_dump_arg(box, box);
1831 
1832          trace_dump_arg_begin("data");
1833          trace_dump_box_bytes(tr_trans->map,
1834                               resource,
1835                               box,
1836                               stride,
1837                               layer_stride);
1838          trace_dump_arg_end();
1839 
1840          trace_dump_arg(uint, stride);
1841          trace_dump_arg(uint, layer_stride);
1842 
1843          trace_dump_call_end();
1844       }
1845 
1846       tr_trans->map = NULL;
1847    }
1848 
1849    if (transfer->resource->target == PIPE_BUFFER)
1850       context->buffer_unmap(context, transfer);
1851    else
1852       context->texture_unmap(context, transfer);
1853    trace_transfer_destroy(tr_ctx, tr_trans);
1854 }
1855 
1856 
1857 static void
trace_context_buffer_subdata(struct pipe_context * _context,struct pipe_resource * resource,unsigned usage,unsigned offset,unsigned size,const void * data)1858 trace_context_buffer_subdata(struct pipe_context *_context,
1859                              struct pipe_resource *resource,
1860                              unsigned usage, unsigned offset,
1861                              unsigned size, const void *data)
1862 {
1863    struct trace_context *tr_context = trace_context(_context);
1864    struct pipe_context *context = tr_context->pipe;
1865    struct pipe_box box;
1866 
1867    trace_dump_call_begin("pipe_context", "buffer_subdata");
1868 
1869    trace_dump_arg(ptr, context);
1870    trace_dump_arg(ptr, resource);
1871    trace_dump_arg_enum(pipe_map_flags, usage);
1872    trace_dump_arg(uint, offset);
1873    trace_dump_arg(uint, size);
1874 
1875    trace_dump_arg_begin("data");
1876    u_box_1d(offset, size, &box);
1877    trace_dump_box_bytes(data, resource, &box, 0, 0);
1878    trace_dump_arg_end();
1879 
1880    trace_dump_call_end();
1881 
1882    context->buffer_subdata(context, resource, usage, offset, size, data);
1883 }
1884 
1885 
1886 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)1887 trace_context_texture_subdata(struct pipe_context *_context,
1888                               struct pipe_resource *resource,
1889                               unsigned level,
1890                               unsigned usage,
1891                               const struct pipe_box *box,
1892                               const void *data,
1893                               unsigned stride,
1894                               uintptr_t layer_stride)
1895 {
1896    struct trace_context *tr_context = trace_context(_context);
1897    struct pipe_context *context = tr_context->pipe;
1898 
1899    trace_dump_call_begin("pipe_context", "texture_subdata");
1900 
1901    trace_dump_arg(ptr, context);
1902    trace_dump_arg(ptr, resource);
1903    trace_dump_arg(uint, level);
1904    trace_dump_arg_enum(pipe_map_flags, usage);
1905    trace_dump_arg(box, box);
1906 
1907    trace_dump_arg_begin("data");
1908    trace_dump_box_bytes(data,
1909                         resource,
1910                         box,
1911                         stride,
1912                         layer_stride);
1913    trace_dump_arg_end();
1914 
1915    trace_dump_arg(uint, stride);
1916    trace_dump_arg(uint, layer_stride);
1917 
1918    trace_dump_call_end();
1919 
1920    context->texture_subdata(context, resource, level, usage, box,
1921                             data, stride, layer_stride);
1922 }
1923 
1924 static void
trace_context_invalidate_resource(struct pipe_context * _context,struct pipe_resource * resource)1925 trace_context_invalidate_resource(struct pipe_context *_context,
1926                                   struct pipe_resource *resource)
1927 {
1928    struct trace_context *tr_context = trace_context(_context);
1929    struct pipe_context *context = tr_context->pipe;
1930 
1931    trace_dump_call_begin("pipe_context", "invalidate_resource");
1932 
1933    trace_dump_arg(ptr, context);
1934    trace_dump_arg(ptr, resource);
1935 
1936    trace_dump_call_end();
1937 
1938    context->invalidate_resource(context, resource);
1939 }
1940 
1941 static void
trace_context_set_context_param(struct pipe_context * _context,enum pipe_context_param param,unsigned value)1942 trace_context_set_context_param(struct pipe_context *_context,
1943                                 enum pipe_context_param param,
1944                                 unsigned value)
1945 {
1946    struct trace_context *tr_context = trace_context(_context);
1947    struct pipe_context *context = tr_context->pipe;
1948 
1949    trace_dump_call_begin("pipe_context", "set_context_param");
1950 
1951    trace_dump_arg(ptr, context);
1952    trace_dump_arg(uint, param);
1953    trace_dump_arg(uint, value);
1954 
1955    trace_dump_call_end();
1956 
1957    context->set_context_param(context, param, value);
1958 }
1959 
1960 static void
trace_context_set_debug_callback(struct pipe_context * _context,const struct util_debug_callback * cb)1961 trace_context_set_debug_callback(struct pipe_context *_context, const struct util_debug_callback *cb)
1962 {
1963    struct trace_context *tr_context = trace_context(_context);
1964    struct pipe_context *context = tr_context->pipe;
1965 
1966    trace_dump_call_begin("pipe_context", "set_debug_callback");
1967 
1968    trace_dump_arg(ptr, context);
1969 
1970    trace_dump_call_end();
1971 
1972    context->set_debug_callback(context, cb);
1973 }
1974 
1975 static void
trace_context_render_condition(struct pipe_context * _context,struct pipe_query * query,bool condition,enum pipe_render_cond_flag mode)1976 trace_context_render_condition(struct pipe_context *_context,
1977                                struct pipe_query *query,
1978                                bool condition,
1979                                enum pipe_render_cond_flag mode)
1980 {
1981    struct trace_context *tr_context = trace_context(_context);
1982    struct pipe_context *context = tr_context->pipe;
1983 
1984    query = trace_query_unwrap(query);
1985 
1986    trace_dump_call_begin("pipe_context", "render_condition");
1987 
1988    trace_dump_arg(ptr, context);
1989    trace_dump_arg(ptr, query);
1990    trace_dump_arg(bool, condition);
1991    trace_dump_arg(uint, mode);
1992 
1993    trace_dump_call_end();
1994 
1995    context->render_condition(context, query, condition, mode);
1996 }
1997 
1998 static void
trace_context_render_condition_mem(struct pipe_context * _context,struct pipe_resource * buffer,uint32_t offset,bool condition)1999 trace_context_render_condition_mem(struct pipe_context *_context,
2000                                     struct pipe_resource *buffer,
2001                                     uint32_t offset,
2002                                     bool condition)
2003 {
2004    struct trace_context *tr_context = trace_context(_context);
2005    struct pipe_context *context = tr_context->pipe;
2006 
2007    trace_dump_call_begin("pipe_context", "render_condition_mem");
2008 
2009    trace_dump_arg(ptr, context);
2010    trace_dump_arg(ptr, buffer);
2011    trace_dump_arg(uint, offset);
2012    trace_dump_arg(bool, condition);
2013 
2014    trace_dump_call_end();
2015 
2016    context->render_condition_mem(context, buffer, offset, condition);
2017 }
2018 
2019 
2020 static void
trace_context_texture_barrier(struct pipe_context * _context,unsigned flags)2021 trace_context_texture_barrier(struct pipe_context *_context, unsigned flags)
2022 {
2023    struct trace_context *tr_context = trace_context(_context);
2024    struct pipe_context *context = tr_context->pipe;
2025 
2026    trace_dump_call_begin("pipe_context", "texture_barrier");
2027 
2028    trace_dump_arg(ptr, context);
2029    trace_dump_arg(uint, flags);
2030 
2031    trace_dump_call_end();
2032 
2033    context->texture_barrier(context, flags);
2034 }
2035 
2036 
2037 static void
trace_context_memory_barrier(struct pipe_context * _context,unsigned flags)2038 trace_context_memory_barrier(struct pipe_context *_context,
2039                              unsigned flags)
2040 {
2041    struct trace_context *tr_context = trace_context(_context);
2042    struct pipe_context *context = tr_context->pipe;
2043 
2044    trace_dump_call_begin("pipe_context", "memory_barrier");
2045    trace_dump_arg(ptr, context);
2046    trace_dump_arg(uint, flags);
2047    trace_dump_call_end();
2048 
2049    context->memory_barrier(context, flags);
2050 }
2051 
2052 
2053 static bool
trace_context_resource_commit(struct pipe_context * _context,struct pipe_resource * resource,unsigned level,struct pipe_box * box,bool commit)2054 trace_context_resource_commit(struct pipe_context *_context,
2055                               struct pipe_resource *resource,
2056                               unsigned level, struct pipe_box *box, bool commit)
2057 {
2058    struct trace_context *tr_context = trace_context(_context);
2059    struct pipe_context *context = tr_context->pipe;
2060 
2061    trace_dump_call_begin("pipe_context", "resource_commit");
2062    trace_dump_arg(ptr, context);
2063    trace_dump_arg(ptr, resource);
2064    trace_dump_arg(uint, level);
2065    trace_dump_arg(box, box);
2066    trace_dump_arg(bool, commit);
2067    trace_dump_call_end();
2068 
2069    return context->resource_commit(context, resource, level, box, commit);
2070 }
2071 
2072 static struct pipe_video_codec *
trace_context_create_video_codec(struct pipe_context * _context,const struct pipe_video_codec * templat)2073 trace_context_create_video_codec(struct pipe_context *_context,
2074                                  const struct pipe_video_codec *templat)
2075 {
2076    struct trace_context *tr_context = trace_context(_context);
2077    struct pipe_context *context = tr_context->pipe;
2078    struct pipe_video_codec *result;
2079 
2080    trace_dump_call_begin("pipe_context", "create_video_codec");
2081 
2082    trace_dump_arg(ptr, context);
2083    trace_dump_arg(video_codec_template, templat);
2084 
2085    result = context->create_video_codec(context, templat);
2086 
2087    trace_dump_ret(ptr, result);
2088    trace_dump_call_end();
2089 
2090    result = trace_video_codec_create(tr_context, result);
2091 
2092    return result;
2093 }
2094 
2095 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)2096 trace_context_create_video_buffer_with_modifiers(struct pipe_context *_context,
2097                                                  const struct pipe_video_buffer *templat,
2098                                                  const uint64_t *modifiers,
2099                                                  unsigned int modifiers_count)
2100 {
2101    struct trace_context *tr_context = trace_context(_context);
2102    struct pipe_context *context = tr_context->pipe;
2103    struct pipe_video_buffer *result;
2104 
2105    trace_dump_call_begin("pipe_screen", "create_video_buffer_with_modifiers");
2106 
2107    trace_dump_arg(ptr, context);
2108    trace_dump_arg(video_buffer_template, templat);
2109    trace_dump_arg_array(uint, modifiers, modifiers_count);
2110    trace_dump_arg(uint, modifiers_count);
2111 
2112    result = context->create_video_buffer_with_modifiers(context, templat, modifiers, modifiers_count);
2113 
2114    trace_dump_ret(ptr, result);
2115    trace_dump_call_end();
2116 
2117    result = trace_video_buffer_create(tr_context, result);
2118 
2119    return result;
2120 }
2121 
2122 static struct pipe_video_buffer *
trace_context_create_video_buffer(struct pipe_context * _context,const struct pipe_video_buffer * templat)2123 trace_context_create_video_buffer(struct pipe_context *_context,
2124                                   const struct pipe_video_buffer *templat)
2125 {
2126    struct trace_context *tr_context = trace_context(_context);
2127    struct pipe_context *context = tr_context->pipe;
2128    struct pipe_video_buffer *result;
2129 
2130    trace_dump_call_begin("pipe_screen", "create_video_buffer");
2131 
2132    trace_dump_arg(ptr, context);
2133    trace_dump_arg(video_buffer_template, templat);
2134 
2135    result = context->create_video_buffer(context, templat);
2136 
2137    trace_dump_ret(ptr, result);
2138    trace_dump_call_end();
2139 
2140    result = trace_video_buffer_create(tr_context, result);
2141 
2142    return result;
2143 }
2144 
2145 static void
trace_context_set_tess_state(struct pipe_context * _context,const float default_outer_level[4],const float default_inner_level[2])2146 trace_context_set_tess_state(struct pipe_context *_context,
2147                              const float default_outer_level[4],
2148                              const float default_inner_level[2])
2149 {
2150    struct trace_context *tr_context = trace_context(_context);
2151    struct pipe_context *context = tr_context->pipe;
2152 
2153    trace_dump_call_begin("pipe_context", "set_tess_state");
2154    trace_dump_arg(ptr, context);
2155    trace_dump_arg_array(float, default_outer_level, 4);
2156    trace_dump_arg_array(float, default_inner_level, 2);
2157    trace_dump_call_end();
2158 
2159    context->set_tess_state(context, default_outer_level, default_inner_level);
2160 }
2161 
2162 static void
trace_context_set_patch_vertices(struct pipe_context * _context,uint8_t patch_vertices)2163 trace_context_set_patch_vertices(struct pipe_context *_context,
2164                                  uint8_t patch_vertices)
2165 {
2166    struct trace_context *tr_context = trace_context(_context);
2167    struct pipe_context *context = tr_context->pipe;
2168 
2169    trace_dump_call_begin("pipe_context", "set_patch_vertices");
2170    trace_dump_arg(ptr, context);
2171    trace_dump_arg(uint, patch_vertices);
2172    trace_dump_call_end();
2173 
2174    context->set_patch_vertices(context, patch_vertices);
2175 }
2176 
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)2177 static void trace_context_set_shader_buffers(struct pipe_context *_context,
2178                                              enum pipe_shader_type shader,
2179                                              unsigned start, unsigned nr,
2180                                              const struct pipe_shader_buffer *buffers,
2181                                              unsigned writable_bitmask)
2182 {
2183    struct trace_context *tr_context = trace_context(_context);
2184    struct pipe_context *context = tr_context->pipe;
2185 
2186    trace_dump_call_begin("pipe_context", "set_shader_buffers");
2187    trace_dump_arg(ptr, context);
2188    trace_dump_arg(uint, shader);
2189    trace_dump_arg(uint, start);
2190    trace_dump_arg_begin("buffers");
2191    trace_dump_struct_array(shader_buffer, buffers, nr);
2192    trace_dump_arg_end();
2193    trace_dump_arg(uint, writable_bitmask);
2194    trace_dump_call_end();
2195 
2196    context->set_shader_buffers(context, shader, start, nr, buffers,
2197                                writable_bitmask);
2198 }
2199 
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)2200 static void trace_context_set_shader_images(struct pipe_context *_context,
2201                                             enum pipe_shader_type shader,
2202                                             unsigned start, unsigned nr,
2203                                             unsigned unbind_num_trailing_slots,
2204                                             const struct pipe_image_view *images)
2205 {
2206    struct trace_context *tr_context = trace_context(_context);
2207    struct pipe_context *context = tr_context->pipe;
2208 
2209    trace_dump_call_begin("pipe_context", "set_shader_images");
2210    trace_dump_arg(ptr, context);
2211    trace_dump_arg(uint, shader);
2212    trace_dump_arg(uint, start);
2213    trace_dump_arg_begin("images");
2214    trace_dump_struct_array(image_view, images, nr);
2215    trace_dump_arg_end();
2216    trace_dump_arg(uint, unbind_num_trailing_slots);
2217    trace_dump_call_end();
2218 
2219    context->set_shader_images(context, shader, start, nr,
2220                               unbind_num_trailing_slots, images);
2221 }
2222 
trace_context_launch_grid(struct pipe_context * _pipe,const struct pipe_grid_info * info)2223 static void trace_context_launch_grid(struct pipe_context *_pipe,
2224                                       const struct pipe_grid_info *info)
2225 {
2226    struct trace_context *tr_ctx = trace_context(_pipe);
2227    struct pipe_context *pipe = tr_ctx->pipe;
2228 
2229    trace_dump_call_begin("pipe_context", "launch_grid");
2230 
2231    trace_dump_arg(ptr,  pipe);
2232    trace_dump_arg(grid_info, info);
2233 
2234    trace_dump_trace_flush();
2235 
2236    pipe->launch_grid(pipe, info);
2237 
2238    trace_dump_call_end();
2239 }
2240 
trace_context_get_compute_state_info(struct pipe_context * _pipe,void * cso,struct pipe_compute_state_object_info * info)2241 static void trace_context_get_compute_state_info(struct pipe_context *_pipe, void *cso,
2242                                                  struct pipe_compute_state_object_info *info)
2243 {
2244    struct trace_context *tr_ctx = trace_context(_pipe);
2245    struct pipe_context *pipe = tr_ctx->pipe;
2246 
2247    trace_dump_call_begin("pipe_context", "get_compute_state_info");
2248 
2249    trace_dump_arg(ptr, pipe);
2250    trace_dump_arg(ptr, cso);
2251 
2252    pipe->get_compute_state_info(pipe, cso, info);
2253 
2254    trace_dump_ret(compute_state_object_info, info);
2255    trace_dump_call_end();
2256 }
2257 
trace_context_create_texture_handle(struct pipe_context * _pipe,struct pipe_sampler_view * view,const struct pipe_sampler_state * state)2258 static uint64_t trace_context_create_texture_handle(struct pipe_context *_pipe,
2259                                                     struct pipe_sampler_view *view,
2260                                                     const struct pipe_sampler_state *state)
2261 {
2262    struct trace_context *tr_ctx = trace_context(_pipe);
2263    struct pipe_context *pipe = tr_ctx->pipe;
2264    uint64_t handle;
2265 
2266    trace_dump_call_begin("pipe_context", "create_texture_handle");
2267    trace_dump_arg(ptr, pipe);
2268    trace_dump_arg(ptr, view);
2269    trace_dump_arg(sampler_state, state);
2270 
2271    handle = pipe->create_texture_handle(pipe, view, state);
2272 
2273    uintptr_t *texture_handle = (uintptr_t*)(uintptr_t)handle;
2274    trace_dump_ret(ptr, texture_handle);
2275 
2276    trace_dump_call_end();
2277 
2278    return handle;
2279 }
2280 
trace_context_delete_texture_handle(struct pipe_context * _pipe,uint64_t handle)2281 static void trace_context_delete_texture_handle(struct pipe_context *_pipe,
2282                                                 uint64_t handle)
2283 {
2284    struct trace_context *tr_ctx = trace_context(_pipe);
2285    struct pipe_context *pipe = tr_ctx->pipe;
2286 
2287    trace_dump_call_begin("pipe_context", "delete_texture_handle");
2288    trace_dump_arg(ptr, pipe);
2289    uintptr_t *texture_handle = (uintptr_t*)(uintptr_t)handle;
2290    trace_dump_ret(ptr, texture_handle);
2291    trace_dump_call_end();
2292 
2293    pipe->delete_texture_handle(pipe, handle);
2294 }
2295 
trace_context_make_texture_handle_resident(struct pipe_context * _pipe,uint64_t handle,bool resident)2296 static void trace_context_make_texture_handle_resident(struct pipe_context *_pipe,
2297                                                        uint64_t handle,
2298                                                        bool resident)
2299 {
2300    struct trace_context *tr_ctx = trace_context(_pipe);
2301    struct pipe_context *pipe = tr_ctx->pipe;
2302 
2303    trace_dump_call_begin("pipe_context", "make_texture_handle_resident");
2304    trace_dump_arg(ptr, pipe);
2305    uintptr_t *texture_handle = (uintptr_t*)(uintptr_t)handle;
2306    trace_dump_ret(ptr, texture_handle);
2307    trace_dump_arg(bool, resident);
2308    trace_dump_call_end();
2309 
2310    pipe->make_texture_handle_resident(pipe, handle, resident);
2311 }
2312 
trace_context_create_image_handle(struct pipe_context * _pipe,const struct pipe_image_view * image)2313 static uint64_t trace_context_create_image_handle(struct pipe_context *_pipe,
2314                                                   const struct pipe_image_view *image)
2315 {
2316    struct trace_context *tr_ctx = trace_context(_pipe);
2317    struct pipe_context *pipe = tr_ctx->pipe;
2318    uint64_t handle;
2319 
2320    trace_dump_call_begin("pipe_context", "create_image_handle");
2321    trace_dump_arg(ptr, pipe);
2322    trace_dump_arg_begin("image");
2323    trace_dump_image_view(image);
2324    trace_dump_arg_end();
2325 
2326    handle = pipe->create_image_handle(pipe, image);
2327 
2328    uintptr_t *image_handle = (uintptr_t*)(uintptr_t)handle;
2329    trace_dump_ret(ptr, image_handle);
2330    trace_dump_call_end();
2331 
2332    return handle;
2333 }
2334 
trace_context_delete_image_handle(struct pipe_context * _pipe,uint64_t handle)2335 static void trace_context_delete_image_handle(struct pipe_context *_pipe,
2336                                               uint64_t handle)
2337 {
2338    struct trace_context *tr_ctx = trace_context(_pipe);
2339    struct pipe_context *pipe = tr_ctx->pipe;
2340 
2341    trace_dump_call_begin("pipe_context", "delete_image_handle");
2342    trace_dump_arg(ptr, pipe);
2343    uintptr_t *image_handle = (uintptr_t*)(uintptr_t)handle;
2344    trace_dump_ret(ptr, image_handle);
2345    trace_dump_call_end();
2346 
2347    pipe->delete_image_handle(pipe, handle);
2348 }
2349 
trace_context_make_image_handle_resident(struct pipe_context * _pipe,uint64_t handle,unsigned access,bool resident)2350 static void trace_context_make_image_handle_resident(struct pipe_context *_pipe,
2351                                                     uint64_t handle,
2352                                                     unsigned access,
2353                                                     bool resident)
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", "make_image_handle_resident");
2359    trace_dump_arg(ptr, pipe);
2360    uintptr_t *image_handle = (uintptr_t*)(uintptr_t)handle;
2361    trace_dump_ret(ptr, image_handle);
2362    trace_dump_arg(uint, access);
2363    trace_dump_arg(bool, resident);
2364    trace_dump_call_end();
2365 
2366    pipe->make_image_handle_resident(pipe, handle, access, resident);
2367 }
2368 
trace_context_set_global_binding(struct pipe_context * _pipe,unsigned first,unsigned count,struct pipe_resource ** resources,uint32_t ** handles)2369 static void trace_context_set_global_binding(struct pipe_context *_pipe,
2370                                              unsigned first, unsigned count,
2371                                              struct pipe_resource **resources,
2372                                              uint32_t **handles)
2373 {
2374    struct trace_context *tr_ctx = trace_context(_pipe);
2375    struct pipe_context *pipe = tr_ctx->pipe;
2376 
2377    trace_dump_call_begin("pipe_context", "set_global_binding");
2378    trace_dump_arg(ptr, pipe);
2379    trace_dump_arg(uint, first);
2380    trace_dump_arg(uint, count);
2381    trace_dump_arg_array(ptr, resources, count);
2382    trace_dump_arg_array_val(uint, handles, count);
2383 
2384    pipe->set_global_binding(pipe, first, count, resources, handles);
2385 
2386    /* TODO: the handles are 64 bit if ADDRESS_BITS are 64, this is better than
2387     * nothing though
2388     */
2389    trace_dump_ret_array_val(uint, handles, count);
2390    trace_dump_call_end();
2391 }
2392 
2393 static void
trace_context_set_hw_atomic_buffers(struct pipe_context * _pipe,unsigned start_slot,unsigned count,const struct pipe_shader_buffer * buffers)2394 trace_context_set_hw_atomic_buffers(struct pipe_context *_pipe,
2395                                     unsigned start_slot, unsigned count,
2396                                     const struct pipe_shader_buffer *buffers)
2397 {
2398    struct trace_context *tr_ctx = trace_context(_pipe);
2399    struct pipe_context *pipe = tr_ctx->pipe;
2400 
2401    trace_dump_call_begin("pipe_context", "set_hw_atomic_buffers");
2402    trace_dump_arg(ptr, pipe);
2403    trace_dump_arg(uint, start_slot);
2404    trace_dump_arg(uint, count);
2405 
2406    trace_dump_arg_begin("buffers");
2407    trace_dump_struct_array(shader_buffer, buffers, count);
2408    trace_dump_arg_end();
2409 
2410    pipe->set_hw_atomic_buffers(pipe, start_slot, count, buffers);
2411 
2412    trace_dump_call_end();
2413 }
2414 
2415 static enum pipe_reset_status
trace_context_get_device_reset_status(struct pipe_context * _pipe)2416 trace_context_get_device_reset_status(struct pipe_context *_pipe)
2417 {
2418    struct trace_context *tr_ctx = trace_context(_pipe);
2419    struct pipe_context *pipe = tr_ctx->pipe;
2420    enum pipe_reset_status status;
2421 
2422    trace_dump_call_begin("pipe_context", "get_device_reset_status");
2423    trace_dump_arg(ptr, pipe);
2424 
2425    status = pipe->get_device_reset_status(pipe);
2426 
2427    trace_dump_ret(uint, status);
2428    trace_dump_call_end();
2429 
2430    return status;
2431 }
2432 
2433 struct pipe_context *
trace_context_create(struct trace_screen * tr_scr,struct pipe_context * pipe)2434 trace_context_create(struct trace_screen *tr_scr,
2435                      struct pipe_context *pipe)
2436 {
2437    struct trace_context *tr_ctx;
2438 
2439    if (!pipe)
2440       goto error1;
2441 
2442    if (!trace_enabled())
2443       goto error1;
2444 
2445    tr_ctx = rzalloc(NULL, struct trace_context);
2446    if (!tr_ctx)
2447       goto error1;
2448 
2449    _mesa_hash_table_init(&tr_ctx->blend_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2450    _mesa_hash_table_init(&tr_ctx->rasterizer_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2451    _mesa_hash_table_init(&tr_ctx->depth_stencil_alpha_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);
2452 
2453    tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
2454    tr_ctx->base.screen = &tr_scr->base;
2455    tr_ctx->base.stream_uploader = pipe->stream_uploader;
2456    tr_ctx->base.const_uploader = pipe->const_uploader;
2457 
2458    tr_ctx->base.destroy = trace_context_destroy;
2459 
2460 #define TR_CTX_INIT(_member) \
2461    tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL
2462 
2463    TR_CTX_INIT(draw_vbo);
2464    TR_CTX_INIT(draw_mesh_tasks);
2465    TR_CTX_INIT(draw_vertex_state);
2466    TR_CTX_INIT(render_condition);
2467    TR_CTX_INIT(render_condition_mem);
2468    TR_CTX_INIT(create_query);
2469    TR_CTX_INIT(destroy_query);
2470    TR_CTX_INIT(begin_query);
2471    TR_CTX_INIT(end_query);
2472    TR_CTX_INIT(get_query_result);
2473    TR_CTX_INIT(get_query_result_resource);
2474    TR_CTX_INIT(set_active_query_state);
2475    TR_CTX_INIT(create_blend_state);
2476    TR_CTX_INIT(bind_blend_state);
2477    TR_CTX_INIT(delete_blend_state);
2478    TR_CTX_INIT(create_sampler_state);
2479    TR_CTX_INIT(bind_sampler_states);
2480    TR_CTX_INIT(delete_sampler_state);
2481    TR_CTX_INIT(create_rasterizer_state);
2482    TR_CTX_INIT(bind_rasterizer_state);
2483    TR_CTX_INIT(delete_rasterizer_state);
2484    TR_CTX_INIT(create_depth_stencil_alpha_state);
2485    TR_CTX_INIT(bind_depth_stencil_alpha_state);
2486    TR_CTX_INIT(delete_depth_stencil_alpha_state);
2487    TR_CTX_INIT(create_fs_state);
2488    TR_CTX_INIT(bind_fs_state);
2489    TR_CTX_INIT(delete_fs_state);
2490    TR_CTX_INIT(create_vs_state);
2491    TR_CTX_INIT(bind_vs_state);
2492    TR_CTX_INIT(delete_vs_state);
2493    TR_CTX_INIT(create_gs_state);
2494    TR_CTX_INIT(bind_gs_state);
2495    TR_CTX_INIT(delete_gs_state);
2496    TR_CTX_INIT(create_tcs_state);
2497    TR_CTX_INIT(bind_tcs_state);
2498    TR_CTX_INIT(delete_tcs_state);
2499    TR_CTX_INIT(create_tes_state);
2500    TR_CTX_INIT(bind_tes_state);
2501    TR_CTX_INIT(delete_tes_state);
2502    TR_CTX_INIT(create_ts_state);
2503    TR_CTX_INIT(bind_ts_state);
2504    TR_CTX_INIT(delete_ts_state);
2505    TR_CTX_INIT(create_ms_state);
2506    TR_CTX_INIT(bind_ms_state);
2507    TR_CTX_INIT(delete_ms_state);
2508    TR_CTX_INIT(create_compute_state);
2509    TR_CTX_INIT(bind_compute_state);
2510    TR_CTX_INIT(delete_compute_state);
2511    TR_CTX_INIT(link_shader);
2512    TR_CTX_INIT(create_vertex_elements_state);
2513    TR_CTX_INIT(bind_vertex_elements_state);
2514    TR_CTX_INIT(delete_vertex_elements_state);
2515    TR_CTX_INIT(set_blend_color);
2516    TR_CTX_INIT(set_stencil_ref);
2517    TR_CTX_INIT(set_clip_state);
2518    TR_CTX_INIT(set_sample_mask);
2519    TR_CTX_INIT(set_constant_buffer);
2520    TR_CTX_INIT(set_framebuffer_state);
2521    TR_CTX_INIT(set_inlinable_constants);
2522    TR_CTX_INIT(set_polygon_stipple);
2523    TR_CTX_INIT(set_min_samples);
2524    TR_CTX_INIT(set_scissor_states);
2525    TR_CTX_INIT(set_viewport_states);
2526    TR_CTX_INIT(set_sampler_views);
2527    TR_CTX_INIT(create_sampler_view);
2528    TR_CTX_INIT(sampler_view_destroy);
2529    TR_CTX_INIT(create_surface);
2530    TR_CTX_INIT(surface_destroy);
2531    TR_CTX_INIT(set_vertex_buffers);
2532    TR_CTX_INIT(create_stream_output_target);
2533    TR_CTX_INIT(stream_output_target_destroy);
2534    TR_CTX_INIT(set_stream_output_targets);
2535    /* this is lavapipe-only and can't be traced */
2536    tr_ctx->base.stream_output_target_offset = pipe->stream_output_target_offset;
2537    TR_CTX_INIT(resource_copy_region);
2538    TR_CTX_INIT(blit);
2539    TR_CTX_INIT(flush_resource);
2540    TR_CTX_INIT(clear);
2541    TR_CTX_INIT(clear_render_target);
2542    TR_CTX_INIT(clear_depth_stencil);
2543    TR_CTX_INIT(clear_texture);
2544    TR_CTX_INIT(clear_buffer);
2545    TR_CTX_INIT(flush);
2546    TR_CTX_INIT(create_fence_fd);
2547    TR_CTX_INIT(fence_server_sync);
2548    TR_CTX_INIT(fence_server_signal);
2549    TR_CTX_INIT(generate_mipmap);
2550    TR_CTX_INIT(texture_barrier);
2551    TR_CTX_INIT(memory_barrier);
2552    TR_CTX_INIT(resource_commit);
2553    TR_CTX_INIT(create_video_codec);
2554    TR_CTX_INIT(create_video_buffer_with_modifiers);
2555    TR_CTX_INIT(create_video_buffer);
2556    TR_CTX_INIT(set_tess_state);
2557    TR_CTX_INIT(set_patch_vertices);
2558    TR_CTX_INIT(set_shader_buffers);
2559    TR_CTX_INIT(launch_grid);
2560    TR_CTX_INIT(get_compute_state_info);
2561    TR_CTX_INIT(set_shader_images);
2562    TR_CTX_INIT(create_texture_handle);
2563    TR_CTX_INIT(delete_texture_handle);
2564    TR_CTX_INIT(make_texture_handle_resident);
2565    TR_CTX_INIT(create_image_handle);
2566    TR_CTX_INIT(delete_image_handle);
2567    TR_CTX_INIT(make_image_handle_resident);
2568 
2569    tr_ctx->base.buffer_map = tr_ctx->base.texture_map = trace_context_transfer_map;
2570    tr_ctx->base.buffer_unmap = tr_ctx->base.texture_unmap = trace_context_transfer_unmap;
2571    TR_CTX_INIT(transfer_flush_region);
2572    TR_CTX_INIT(buffer_subdata);
2573    TR_CTX_INIT(texture_subdata);
2574    TR_CTX_INIT(invalidate_resource);
2575    TR_CTX_INIT(set_context_param);
2576    TR_CTX_INIT(set_debug_callback);
2577    TR_CTX_INIT(set_global_binding);
2578    TR_CTX_INIT(set_hw_atomic_buffers);
2579    TR_CTX_INIT(get_device_reset_status);
2580 
2581 
2582 #undef TR_CTX_INIT
2583 
2584    tr_ctx->pipe = pipe;
2585 
2586    return &tr_ctx->base;
2587 
2588 error1:
2589    return pipe;
2590 }
2591 
2592 
2593 /**
2594  * Sanity checker: check that the given context really is a
2595  * trace context (and not the wrapped driver's context).
2596  */
2597 void
trace_context_check(const struct pipe_context * pipe)2598 trace_context_check(const struct pipe_context *pipe)
2599 {
2600    ASSERTED struct trace_context *tr_ctx = (struct trace_context *) pipe;
2601    assert(tr_ctx->base.destroy == trace_context_destroy);
2602 }
2603 
2604 /**
2605  * Threaded context is not wrapped, and so it may call fence functions directly
2606  */
2607 struct pipe_context *
trace_get_possibly_threaded_context(struct pipe_context * pipe)2608 trace_get_possibly_threaded_context(struct pipe_context *pipe)
2609 {
2610    return pipe->destroy == trace_context_destroy ? ((struct trace_context*)pipe)->pipe : pipe;
2611 }
2612