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