Home | History | Annotate | Download | only in trace
      1 /**************************************************************************
      2  *
      3  * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
      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 TUNGSTEN GRAPHICS 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/u_inlines.h"
     29 #include "util/u_memory.h"
     30 #include "util/u_simple_list.h"
     31 
     32 #include "pipe/p_format.h"
     33 #include "pipe/p_screen.h"
     34 
     35 #include "tr_dump.h"
     36 #include "tr_dump_state.h"
     37 #include "tr_public.h"
     38 #include "tr_screen.h"
     39 #include "tr_texture.h"
     40 #include "tr_context.h"
     41 
     42 
     43 
     44 
     45 
     46 static INLINE struct pipe_resource *
     47 trace_resource_unwrap(struct trace_context *tr_ctx,
     48                      struct pipe_resource *resource)
     49 {
     50    struct trace_resource *tr_res;
     51 
     52    if(!resource)
     53       return NULL;
     54 
     55    tr_res = trace_resource(resource);
     56 
     57    assert(tr_res->resource);
     58    return tr_res->resource;
     59 }
     60 
     61 
     62 static INLINE struct pipe_surface *
     63 trace_surface_unwrap(struct trace_context *tr_ctx,
     64                      struct pipe_surface *surface)
     65 {
     66    struct trace_screen *tr_scr = trace_screen(tr_ctx->base.screen);
     67    struct trace_surface *tr_surf;
     68 
     69    if(!surface)
     70       return NULL;
     71 
     72    assert(surface->texture);
     73    if(!surface->texture)
     74       return surface;
     75 
     76    tr_surf = trace_surface(surface);
     77 
     78    assert(tr_surf->surface);
     79    assert(tr_surf->surface->texture->screen == tr_scr->screen);
     80    (void) tr_scr;
     81    return tr_surf->surface;
     82 }
     83 
     84 
     85 static INLINE void
     86 trace_context_draw_vbo(struct pipe_context *_pipe,
     87                        const struct pipe_draw_info *info)
     88 {
     89    struct trace_context *tr_ctx = trace_context(_pipe);
     90    struct pipe_context *pipe = tr_ctx->pipe;
     91 
     92    trace_dump_call_begin("pipe_context", "draw_vbo");
     93 
     94    trace_dump_arg(ptr,  pipe);
     95    trace_dump_arg(draw_info, info);
     96 
     97    pipe->draw_vbo(pipe, info);
     98 
     99    trace_dump_call_end();
    100 }
    101 
    102 
    103 static INLINE struct pipe_query *
    104 trace_context_create_query(struct pipe_context *_pipe,
    105                            unsigned query_type)
    106 {
    107    struct trace_context *tr_ctx = trace_context(_pipe);
    108    struct pipe_context *pipe = tr_ctx->pipe;
    109    struct pipe_query *result;
    110 
    111    trace_dump_call_begin("pipe_context", "create_query");
    112 
    113    trace_dump_arg(ptr, pipe);
    114    trace_dump_arg(uint, query_type);
    115 
    116    result = pipe->create_query(pipe, query_type);
    117 
    118    trace_dump_ret(ptr, result);
    119 
    120    trace_dump_call_end();
    121 
    122    return result;
    123 }
    124 
    125 
    126 static INLINE void
    127 trace_context_destroy_query(struct pipe_context *_pipe,
    128                             struct pipe_query *query)
    129 {
    130    struct trace_context *tr_ctx = trace_context(_pipe);
    131    struct pipe_context *pipe = tr_ctx->pipe;
    132 
    133    trace_dump_call_begin("pipe_context", "destroy_query");
    134 
    135    trace_dump_arg(ptr, pipe);
    136    trace_dump_arg(ptr, query);
    137 
    138    pipe->destroy_query(pipe, query);
    139 
    140    trace_dump_call_end();
    141 }
    142 
    143 
    144 static INLINE void
    145 trace_context_begin_query(struct pipe_context *_pipe,
    146                           struct pipe_query *query)
    147 {
    148    struct trace_context *tr_ctx = trace_context(_pipe);
    149    struct pipe_context *pipe = tr_ctx->pipe;
    150 
    151    trace_dump_call_begin("pipe_context", "begin_query");
    152 
    153    trace_dump_arg(ptr, pipe);
    154    trace_dump_arg(ptr, query);
    155 
    156    pipe->begin_query(pipe, query);
    157 
    158    trace_dump_call_end();
    159 }
    160 
    161 
    162 static INLINE void
    163 trace_context_end_query(struct pipe_context *_pipe,
    164                         struct pipe_query *query)
    165 {
    166    struct trace_context *tr_ctx = trace_context(_pipe);
    167    struct pipe_context *pipe = tr_ctx->pipe;
    168 
    169    trace_dump_call_begin("pipe_context", "end_query");
    170 
    171    trace_dump_arg(ptr, pipe);
    172    trace_dump_arg(ptr, query);
    173 
    174    pipe->end_query(pipe, query);
    175 
    176    trace_dump_call_end();
    177 }
    178 
    179 
    180 static INLINE boolean
    181 trace_context_get_query_result(struct pipe_context *_pipe,
    182                                struct pipe_query *query,
    183                                boolean wait,
    184                                union pipe_query_result *presult)
    185 {
    186    struct trace_context *tr_ctx = trace_context(_pipe);
    187    struct pipe_context *pipe = tr_ctx->pipe;
    188    uint64_t result;
    189    boolean _result;
    190 
    191    trace_dump_call_begin("pipe_context", "get_query_result");
    192 
    193    trace_dump_arg(ptr, pipe);
    194 
    195    _result = pipe->get_query_result(pipe, query, wait, presult);
    196    /* XXX this depends on the query type */
    197    result = *((uint64_t*)presult);
    198 
    199    trace_dump_arg(uint, result);
    200    trace_dump_ret(bool, _result);
    201 
    202    trace_dump_call_end();
    203 
    204    return _result;
    205 }
    206 
    207 
    208 static INLINE void *
    209 trace_context_create_blend_state(struct pipe_context *_pipe,
    210                                  const struct pipe_blend_state *state)
    211 {
    212    struct trace_context *tr_ctx = trace_context(_pipe);
    213    struct pipe_context *pipe = tr_ctx->pipe;
    214    void * result;
    215 
    216    trace_dump_call_begin("pipe_context", "create_blend_state");
    217 
    218    trace_dump_arg(ptr, pipe);
    219    trace_dump_arg(blend_state, state);
    220 
    221    result = pipe->create_blend_state(pipe, state);
    222 
    223    trace_dump_ret(ptr, result);
    224 
    225    trace_dump_call_end();
    226 
    227    return result;
    228 }
    229 
    230 
    231 static INLINE void
    232 trace_context_bind_blend_state(struct pipe_context *_pipe,
    233                                void *state)
    234 {
    235    struct trace_context *tr_ctx = trace_context(_pipe);
    236    struct pipe_context *pipe = tr_ctx->pipe;
    237 
    238    trace_dump_call_begin("pipe_context", "bind_blend_state");
    239 
    240    trace_dump_arg(ptr, pipe);
    241    trace_dump_arg(ptr, state);
    242 
    243    pipe->bind_blend_state(pipe, state);
    244 
    245    trace_dump_call_end();
    246 }
    247 
    248 
    249 static INLINE void
    250 trace_context_delete_blend_state(struct pipe_context *_pipe,
    251                                  void *state)
    252 {
    253    struct trace_context *tr_ctx = trace_context(_pipe);
    254    struct pipe_context *pipe = tr_ctx->pipe;
    255 
    256    trace_dump_call_begin("pipe_context", "delete_blend_state");
    257 
    258    trace_dump_arg(ptr, pipe);
    259    trace_dump_arg(ptr, state);
    260 
    261    pipe->delete_blend_state(pipe, state);
    262 
    263    trace_dump_call_end();
    264 }
    265 
    266 
    267 static INLINE void *
    268 trace_context_create_sampler_state(struct pipe_context *_pipe,
    269                                    const struct pipe_sampler_state *state)
    270 {
    271    struct trace_context *tr_ctx = trace_context(_pipe);
    272    struct pipe_context *pipe = tr_ctx->pipe;
    273    void * result;
    274 
    275    trace_dump_call_begin("pipe_context", "create_sampler_state");
    276 
    277    trace_dump_arg(ptr, pipe);
    278    trace_dump_arg(sampler_state, state);
    279 
    280    result = pipe->create_sampler_state(pipe, state);
    281 
    282    trace_dump_ret(ptr, result);
    283 
    284    trace_dump_call_end();
    285 
    286    return result;
    287 }
    288 
    289 
    290 static INLINE void
    291 trace_context_bind_sampler_states(struct pipe_context *_pipe,
    292                                   unsigned shader,
    293                                   unsigned start,
    294                                   unsigned num_states,
    295                                   void **states)
    296 {
    297    struct trace_context *tr_ctx = trace_context(_pipe);
    298    struct pipe_context *pipe = tr_ctx->pipe;
    299 
    300    /* remove this when we have pipe->bind_sampler_states(..., start, ...) */
    301    assert(start == 0);
    302 
    303    switch (shader) {
    304    case PIPE_SHADER_VERTEX:
    305       trace_dump_call_begin("pipe_context", "bind_vertex_sampler_states");
    306       break;
    307    case PIPE_SHADER_GEOMETRY:
    308       trace_dump_call_begin("pipe_context", "bind_geometry_sampler_states");
    309       break;
    310    case PIPE_SHADER_FRAGMENT:
    311       trace_dump_call_begin("pipe_context", "bind_fragment_sampler_states");
    312       break;
    313    default:
    314       debug_error("Unexpected shader in trace_context_bind_sampler_states()");
    315    }
    316 
    317    trace_dump_arg(ptr, pipe);
    318    trace_dump_arg(uint, num_states);
    319    trace_dump_arg_array(ptr, states, num_states);
    320 
    321    switch (shader) {
    322    case PIPE_SHADER_VERTEX:
    323       pipe->bind_vertex_sampler_states(pipe, num_states, states);
    324       break;
    325    case PIPE_SHADER_GEOMETRY:
    326       pipe->bind_geometry_sampler_states(pipe, num_states, states);
    327       break;
    328    case PIPE_SHADER_FRAGMENT:
    329       pipe->bind_fragment_sampler_states(pipe, num_states, states);
    330       break;
    331    default:
    332       debug_error("Unexpected shader in trace_context_bind_sampler_states()");
    333    }
    334 
    335    trace_dump_call_end();
    336 }
    337 
    338 
    339 static INLINE void
    340 trace_context_bind_fragment_sampler_states(struct pipe_context *_pipe,
    341                                            unsigned num,
    342                                            void **states)
    343 {
    344    trace_context_bind_sampler_states(_pipe, PIPE_SHADER_FRAGMENT,
    345                                      0, num, states);
    346 }
    347 
    348 
    349 static INLINE void
    350 trace_context_bind_vertex_sampler_states(struct pipe_context *_pipe,
    351                                          unsigned num,
    352                                          void **states)
    353 {
    354    trace_context_bind_sampler_states(_pipe, PIPE_SHADER_VERTEX,
    355                                      0, num, states);
    356 }
    357 
    358 
    359 static INLINE void
    360 trace_context_delete_sampler_state(struct pipe_context *_pipe,
    361                                    void *state)
    362 {
    363    struct trace_context *tr_ctx = trace_context(_pipe);
    364    struct pipe_context *pipe = tr_ctx->pipe;
    365 
    366    trace_dump_call_begin("pipe_context", "delete_sampler_state");
    367 
    368    trace_dump_arg(ptr, pipe);
    369    trace_dump_arg(ptr, state);
    370 
    371    pipe->delete_sampler_state(pipe, state);
    372 
    373    trace_dump_call_end();
    374 }
    375 
    376 
    377 static INLINE void *
    378 trace_context_create_rasterizer_state(struct pipe_context *_pipe,
    379                                       const struct pipe_rasterizer_state *state)
    380 {
    381    struct trace_context *tr_ctx = trace_context(_pipe);
    382    struct pipe_context *pipe = tr_ctx->pipe;
    383    void * result;
    384 
    385    trace_dump_call_begin("pipe_context", "create_rasterizer_state");
    386 
    387    trace_dump_arg(ptr, pipe);
    388    trace_dump_arg(rasterizer_state, state);
    389 
    390    result = pipe->create_rasterizer_state(pipe, state);
    391 
    392    trace_dump_ret(ptr, result);
    393 
    394    trace_dump_call_end();
    395 
    396    return result;
    397 }
    398 
    399 
    400 static INLINE void
    401 trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
    402                                     void *state)
    403 {
    404    struct trace_context *tr_ctx = trace_context(_pipe);
    405    struct pipe_context *pipe = tr_ctx->pipe;
    406 
    407    trace_dump_call_begin("pipe_context", "bind_rasterizer_state");
    408 
    409    trace_dump_arg(ptr, pipe);
    410    trace_dump_arg(ptr, state);
    411 
    412    pipe->bind_rasterizer_state(pipe, state);
    413 
    414    trace_dump_call_end();
    415 }
    416 
    417 
    418 static INLINE void
    419 trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
    420                                       void *state)
    421 {
    422    struct trace_context *tr_ctx = trace_context(_pipe);
    423    struct pipe_context *pipe = tr_ctx->pipe;
    424 
    425    trace_dump_call_begin("pipe_context", "delete_rasterizer_state");
    426 
    427    trace_dump_arg(ptr, pipe);
    428    trace_dump_arg(ptr, state);
    429 
    430    pipe->delete_rasterizer_state(pipe, state);
    431 
    432    trace_dump_call_end();
    433 }
    434 
    435 
    436 static INLINE void *
    437 trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
    438                                                const struct pipe_depth_stencil_alpha_state *state)
    439 {
    440    struct trace_context *tr_ctx = trace_context(_pipe);
    441    struct pipe_context *pipe = tr_ctx->pipe;
    442    void * result;
    443 
    444    trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");
    445 
    446    result = pipe->create_depth_stencil_alpha_state(pipe, state);
    447 
    448    trace_dump_arg(ptr, pipe);
    449    trace_dump_arg(depth_stencil_alpha_state, state);
    450 
    451    trace_dump_ret(ptr, result);
    452 
    453    trace_dump_call_end();
    454 
    455    return result;
    456 }
    457 
    458 
    459 static INLINE void
    460 trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
    461                                              void *state)
    462 {
    463    struct trace_context *tr_ctx = trace_context(_pipe);
    464    struct pipe_context *pipe = tr_ctx->pipe;
    465 
    466    trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");
    467 
    468    trace_dump_arg(ptr, pipe);
    469    trace_dump_arg(ptr, state);
    470 
    471    pipe->bind_depth_stencil_alpha_state(pipe, state);
    472 
    473    trace_dump_call_end();
    474 }
    475 
    476 
    477 static INLINE void
    478 trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
    479                                                void *state)
    480 {
    481    struct trace_context *tr_ctx = trace_context(_pipe);
    482    struct pipe_context *pipe = tr_ctx->pipe;
    483 
    484    trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");
    485 
    486    trace_dump_arg(ptr, pipe);
    487    trace_dump_arg(ptr, state);
    488 
    489    pipe->delete_depth_stencil_alpha_state(pipe, state);
    490 
    491    trace_dump_call_end();
    492 }
    493 
    494 
    495 static INLINE void *
    496 trace_context_create_fs_state(struct pipe_context *_pipe,
    497                               const struct pipe_shader_state *state)
    498 {
    499    struct trace_context *tr_ctx = trace_context(_pipe);
    500    struct pipe_context *pipe = tr_ctx->pipe;
    501    void * result;
    502 
    503    trace_dump_call_begin("pipe_context", "create_fs_state");
    504 
    505    trace_dump_arg(ptr, pipe);
    506    trace_dump_arg(shader_state, state);
    507 
    508    result = pipe->create_fs_state(pipe, state);
    509 
    510    trace_dump_ret(ptr, result);
    511 
    512    trace_dump_call_end();
    513 
    514    return result;
    515 }
    516 
    517 
    518 static INLINE void
    519 trace_context_bind_fs_state(struct pipe_context *_pipe,
    520                             void *state)
    521 {
    522    struct trace_context *tr_ctx = trace_context(_pipe);
    523    struct pipe_context *pipe = tr_ctx->pipe;
    524 
    525    trace_dump_call_begin("pipe_context", "bind_fs_state");
    526 
    527    trace_dump_arg(ptr, pipe);
    528    trace_dump_arg(ptr, state);
    529 
    530    pipe->bind_fs_state(pipe, state);
    531 
    532    trace_dump_call_end();
    533 }
    534 
    535 
    536 static INLINE void
    537 trace_context_delete_fs_state(struct pipe_context *_pipe,
    538                               void *state)
    539 {
    540    struct trace_context *tr_ctx = trace_context(_pipe);
    541    struct pipe_context *pipe = tr_ctx->pipe;
    542 
    543    trace_dump_call_begin("pipe_context", "delete_fs_state");
    544 
    545    trace_dump_arg(ptr, pipe);
    546    trace_dump_arg(ptr, state);
    547 
    548    pipe->delete_fs_state(pipe, state);
    549 
    550    trace_dump_call_end();
    551 }
    552 
    553 
    554 static INLINE void *
    555 trace_context_create_vs_state(struct pipe_context *_pipe,
    556                               const struct pipe_shader_state *state)
    557 {
    558    struct trace_context *tr_ctx = trace_context(_pipe);
    559    struct pipe_context *pipe = tr_ctx->pipe;
    560    void * result;
    561 
    562    trace_dump_call_begin("pipe_context", "create_vs_state");
    563 
    564    trace_dump_arg(ptr, pipe);
    565    trace_dump_arg(shader_state, state);
    566 
    567    result = pipe->create_vs_state(pipe, state);
    568 
    569    trace_dump_ret(ptr, result);
    570 
    571    trace_dump_call_end();
    572 
    573    return result;
    574 }
    575 
    576 
    577 static INLINE void
    578 trace_context_bind_vs_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", "bind_vs_state");
    585 
    586    trace_dump_arg(ptr, pipe);
    587    trace_dump_arg(ptr, state);
    588 
    589    pipe->bind_vs_state(pipe, state);
    590 
    591    trace_dump_call_end();
    592 }
    593 
    594 
    595 static INLINE void
    596 trace_context_delete_vs_state(struct pipe_context *_pipe,
    597                               void *state)
    598 {
    599    struct trace_context *tr_ctx = trace_context(_pipe);
    600    struct pipe_context *pipe = tr_ctx->pipe;
    601 
    602    trace_dump_call_begin("pipe_context", "delete_vs_state");
    603 
    604    trace_dump_arg(ptr, pipe);
    605    trace_dump_arg(ptr, state);
    606 
    607    pipe->delete_vs_state(pipe, state);
    608 
    609    trace_dump_call_end();
    610 }
    611 
    612 
    613 static INLINE void *
    614 trace_context_create_vertex_elements_state(struct pipe_context *_pipe,
    615                                            unsigned num_elements,
    616                                            const struct  pipe_vertex_element *elements)
    617 {
    618    struct trace_context *tr_ctx = trace_context(_pipe);
    619    struct pipe_context *pipe = tr_ctx->pipe;
    620    void * result;
    621 
    622    trace_dump_call_begin("pipe_context", "create_vertex_elements_state");
    623 
    624    trace_dump_arg(ptr, pipe);
    625    trace_dump_arg(uint, num_elements);
    626 
    627    trace_dump_arg_begin("elements");
    628    trace_dump_struct_array(vertex_element, elements, num_elements);
    629    trace_dump_arg_end();
    630 
    631    result = pipe->create_vertex_elements_state(pipe, num_elements, elements);
    632 
    633    trace_dump_ret(ptr, result);
    634 
    635    trace_dump_call_end();
    636 
    637    return result;
    638 }
    639 
    640 
    641 static INLINE void
    642 trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,
    643                                          void *state)
    644 {
    645    struct trace_context *tr_ctx = trace_context(_pipe);
    646    struct pipe_context *pipe = tr_ctx->pipe;
    647 
    648    trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");
    649 
    650    trace_dump_arg(ptr, pipe);
    651    trace_dump_arg(ptr, state);
    652 
    653    pipe->bind_vertex_elements_state(pipe, state);
    654 
    655    trace_dump_call_end();
    656 }
    657 
    658 
    659 static INLINE void
    660 trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,
    661                                            void *state)
    662 {
    663    struct trace_context *tr_ctx = trace_context(_pipe);
    664    struct pipe_context *pipe = tr_ctx->pipe;
    665 
    666    trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");
    667 
    668    trace_dump_arg(ptr, pipe);
    669    trace_dump_arg(ptr, state);
    670 
    671    pipe->delete_vertex_elements_state(pipe, state);
    672 
    673    trace_dump_call_end();
    674 }
    675 
    676 
    677 static INLINE void
    678 trace_context_set_blend_color(struct pipe_context *_pipe,
    679                               const struct pipe_blend_color *state)
    680 {
    681    struct trace_context *tr_ctx = trace_context(_pipe);
    682    struct pipe_context *pipe = tr_ctx->pipe;
    683 
    684    trace_dump_call_begin("pipe_context", "set_blend_color");
    685 
    686    trace_dump_arg(ptr, pipe);
    687    trace_dump_arg(blend_color, state);
    688 
    689    pipe->set_blend_color(pipe, state);
    690 
    691    trace_dump_call_end();
    692 }
    693 
    694 
    695 static INLINE void
    696 trace_context_set_stencil_ref(struct pipe_context *_pipe,
    697                               const struct pipe_stencil_ref *state)
    698 {
    699    struct trace_context *tr_ctx = trace_context(_pipe);
    700    struct pipe_context *pipe = tr_ctx->pipe;
    701 
    702    trace_dump_call_begin("pipe_context", "set_stencil_ref");
    703 
    704    trace_dump_arg(ptr, pipe);
    705    trace_dump_arg(stencil_ref, state);
    706 
    707    pipe->set_stencil_ref(pipe, state);
    708 
    709    trace_dump_call_end();
    710 }
    711 
    712 
    713 static INLINE void
    714 trace_context_set_clip_state(struct pipe_context *_pipe,
    715                              const struct pipe_clip_state *state)
    716 {
    717    struct trace_context *tr_ctx = trace_context(_pipe);
    718    struct pipe_context *pipe = tr_ctx->pipe;
    719 
    720    trace_dump_call_begin("pipe_context", "set_clip_state");
    721 
    722    trace_dump_arg(ptr, pipe);
    723    trace_dump_arg(clip_state, state);
    724 
    725    pipe->set_clip_state(pipe, state);
    726 
    727    trace_dump_call_end();
    728 }
    729 
    730 static INLINE void
    731 trace_context_set_sample_mask(struct pipe_context *_pipe,
    732                               unsigned sample_mask)
    733 {
    734    struct trace_context *tr_ctx = trace_context(_pipe);
    735    struct pipe_context *pipe = tr_ctx->pipe;
    736 
    737    trace_dump_call_begin("pipe_context", "set_sample_mask");
    738 
    739    trace_dump_arg(ptr, pipe);
    740    trace_dump_arg(uint, sample_mask);
    741 
    742    pipe->set_sample_mask(pipe, sample_mask);
    743 
    744    trace_dump_call_end();
    745 }
    746 
    747 static INLINE void
    748 trace_context_set_constant_buffer(struct pipe_context *_pipe,
    749                                   uint shader, uint index,
    750                                   struct pipe_constant_buffer *constant_buffer)
    751 {
    752    struct trace_context *tr_ctx = trace_context(_pipe);
    753    struct pipe_context *pipe = tr_ctx->pipe;
    754    struct pipe_constant_buffer cb;
    755 
    756    if (constant_buffer) {
    757       cb = *constant_buffer;
    758       cb.buffer = trace_resource_unwrap(tr_ctx, constant_buffer->buffer);
    759    }
    760 
    761    trace_dump_call_begin("pipe_context", "set_constant_buffer");
    762 
    763    trace_dump_arg(ptr, pipe);
    764    trace_dump_arg(uint, shader);
    765    trace_dump_arg(uint, index);
    766    if (constant_buffer) {
    767       trace_dump_struct_begin("pipe_constant_buffer");
    768       trace_dump_member(ptr, constant_buffer, buffer);
    769       trace_dump_member(uint, constant_buffer, buffer_offset);
    770       trace_dump_member(uint, constant_buffer, buffer_size);
    771       trace_dump_struct_end();
    772    } else {
    773       trace_dump_arg(ptr, constant_buffer);
    774    }
    775 
    776    pipe->set_constant_buffer(pipe, shader, index,
    777                              constant_buffer ? &cb : NULL);
    778 
    779    trace_dump_call_end();
    780 }
    781 
    782 
    783 static INLINE void
    784 trace_context_set_framebuffer_state(struct pipe_context *_pipe,
    785                                     const struct pipe_framebuffer_state *state)
    786 {
    787    struct trace_context *tr_ctx = trace_context(_pipe);
    788    struct pipe_context *pipe = tr_ctx->pipe;
    789    struct pipe_framebuffer_state unwrapped_state;
    790    unsigned i;
    791 
    792 
    793    /* Unwrap the input state */
    794    memcpy(&unwrapped_state, state, sizeof(unwrapped_state));
    795    for(i = 0; i < state->nr_cbufs; ++i)
    796       unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);
    797    for(i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)
    798       unwrapped_state.cbufs[i] = NULL;
    799    unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);
    800    state = &unwrapped_state;
    801 
    802    trace_dump_call_begin("pipe_context", "set_framebuffer_state");
    803 
    804    trace_dump_arg(ptr, pipe);
    805    trace_dump_arg(framebuffer_state, state);
    806 
    807    pipe->set_framebuffer_state(pipe, state);
    808 
    809    trace_dump_call_end();
    810 }
    811 
    812 
    813 static INLINE void
    814 trace_context_set_polygon_stipple(struct pipe_context *_pipe,
    815                                   const struct pipe_poly_stipple *state)
    816 {
    817    struct trace_context *tr_ctx = trace_context(_pipe);
    818    struct pipe_context *pipe = tr_ctx->pipe;
    819 
    820    trace_dump_call_begin("pipe_context", "set_polygon_stipple");
    821 
    822    trace_dump_arg(ptr, pipe);
    823    trace_dump_arg(poly_stipple, state);
    824 
    825    pipe->set_polygon_stipple(pipe, state);
    826 
    827    trace_dump_call_end();
    828 }
    829 
    830 
    831 static INLINE void
    832 trace_context_set_scissor_state(struct pipe_context *_pipe,
    833                                 const struct pipe_scissor_state *state)
    834 {
    835    struct trace_context *tr_ctx = trace_context(_pipe);
    836    struct pipe_context *pipe = tr_ctx->pipe;
    837 
    838    trace_dump_call_begin("pipe_context", "set_scissor_state");
    839 
    840    trace_dump_arg(ptr, pipe);
    841    trace_dump_arg(scissor_state, state);
    842 
    843    pipe->set_scissor_state(pipe, state);
    844 
    845    trace_dump_call_end();
    846 }
    847 
    848 
    849 static INLINE void
    850 trace_context_set_viewport_state(struct pipe_context *_pipe,
    851                                  const struct pipe_viewport_state *state)
    852 {
    853    struct trace_context *tr_ctx = trace_context(_pipe);
    854    struct pipe_context *pipe = tr_ctx->pipe;
    855 
    856    trace_dump_call_begin("pipe_context", "set_viewport_state");
    857 
    858    trace_dump_arg(ptr, pipe);
    859    trace_dump_arg(viewport_state, state);
    860 
    861    pipe->set_viewport_state(pipe, state);
    862 
    863    trace_dump_call_end();
    864 }
    865 
    866 
    867 static struct pipe_sampler_view *
    868 trace_context_create_sampler_view(struct pipe_context *_pipe,
    869                           struct pipe_resource *_resource,
    870                           const struct pipe_sampler_view *templ)
    871 {
    872    struct trace_context *tr_ctx = trace_context(_pipe);
    873    struct trace_resource *tr_res = trace_resource(_resource);
    874    struct pipe_context *pipe = tr_ctx->pipe;
    875    struct pipe_resource *resource = tr_res->resource;
    876    struct pipe_sampler_view *result;
    877    struct trace_sampler_view *tr_view;
    878 
    879    trace_dump_call_begin("pipe_context", "create_sampler_view");
    880 
    881    trace_dump_arg(ptr, pipe);
    882    trace_dump_arg(ptr, resource);
    883 
    884    trace_dump_arg_begin("templ");
    885    trace_dump_sampler_view_template(templ, resource->target);
    886    trace_dump_arg_end();
    887 
    888    result = pipe->create_sampler_view(pipe, resource, templ);
    889 
    890    trace_dump_ret(ptr, result);
    891 
    892    trace_dump_call_end();
    893 
    894    /*
    895     * Wrap pipe_sampler_view
    896     */
    897    tr_view = CALLOC_STRUCT(trace_sampler_view);
    898    tr_view->base = *templ;
    899    tr_view->base.reference.count = 1;
    900    tr_view->base.texture = NULL;
    901    pipe_resource_reference(&tr_view->base.texture, _resource);
    902    tr_view->base.context = _pipe;
    903    tr_view->sampler_view = result;
    904    result = &tr_view->base;
    905 
    906    return result;
    907 }
    908 
    909 
    910 static void
    911 trace_context_sampler_view_destroy(struct pipe_context *_pipe,
    912                            struct pipe_sampler_view *_view)
    913 {
    914    struct trace_context *tr_ctx = trace_context(_pipe);
    915    struct trace_sampler_view *tr_view = trace_sampler_view(_view);
    916    struct pipe_context *pipe = tr_ctx->pipe;
    917    struct pipe_sampler_view *view = tr_view->sampler_view;
    918 
    919    trace_dump_call_begin("pipe_context", "sampler_view_destroy");
    920 
    921    trace_dump_arg(ptr, pipe);
    922    trace_dump_arg(ptr, view);
    923 
    924    pipe_sampler_view_reference(&tr_view->sampler_view, NULL);
    925 
    926    trace_dump_call_end();
    927 
    928    pipe_resource_reference(&_view->texture, NULL);
    929    FREE(_view);
    930 }
    931 
    932 /********************************************************************
    933  * surface
    934  */
    935 
    936 
    937 static struct pipe_surface *
    938 trace_context_create_surface(struct pipe_context *_pipe,
    939                              struct pipe_resource *_resource,
    940                              const struct pipe_surface *surf_tmpl)
    941 {
    942    struct trace_context *tr_ctx = trace_context(_pipe);
    943    struct trace_resource *tr_res = trace_resource(_resource);
    944    struct pipe_context *pipe = tr_ctx->pipe;
    945    struct pipe_resource *resource = tr_res->resource;
    946    struct pipe_surface *result = NULL;
    947 
    948    trace_dump_call_begin("pipe_context", "create_surface");
    949 
    950    trace_dump_arg(ptr, pipe);
    951    trace_dump_arg(ptr, resource);
    952 
    953    trace_dump_arg_begin("surf_tmpl");
    954    trace_dump_surface_template(surf_tmpl, resource->target);
    955    trace_dump_arg_end();
    956 
    957 
    958    result = pipe->create_surface(pipe, resource, surf_tmpl);
    959 
    960    trace_dump_ret(ptr, result);
    961 
    962    trace_dump_call_end();
    963 
    964    result = trace_surf_create(tr_res, result);
    965 
    966    return result;
    967 }
    968 
    969 
    970 static void
    971 trace_context_surface_destroy(struct pipe_context *_pipe,
    972                               struct pipe_surface *_surface)
    973 {
    974    struct trace_context *tr_ctx = trace_context(_pipe);
    975    struct pipe_context *pipe = tr_ctx->pipe;
    976    struct trace_surface *tr_surf = trace_surface(_surface);
    977    struct pipe_surface *surface = tr_surf->surface;
    978 
    979    trace_dump_call_begin("pipe_context", "surface_destroy");
    980 
    981    trace_dump_arg(ptr, pipe);
    982    trace_dump_arg(ptr, surface);
    983 
    984    trace_dump_call_end();
    985 
    986    trace_surf_destroy(tr_surf);
    987 }
    988 
    989 
    990 static INLINE void
    991 trace_context_set_sampler_views(struct pipe_context *_pipe,
    992                                 unsigned shader,
    993                                 unsigned start,
    994                                 unsigned num,
    995                                 struct pipe_sampler_view **views)
    996 {
    997    struct trace_context *tr_ctx = trace_context(_pipe);
    998    struct trace_sampler_view *tr_view;
    999    struct pipe_context *pipe = tr_ctx->pipe;
   1000    struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
   1001    unsigned i;
   1002 
   1003    /* remove this when we have pipe->set_sampler_views(..., start, ...) */
   1004    assert(start == 0);
   1005 
   1006    for(i = 0; i < num; ++i) {
   1007       tr_view = trace_sampler_view(views[i]);
   1008       unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;
   1009    }
   1010    views = unwrapped_views;
   1011 
   1012    switch (shader) {
   1013    case PIPE_SHADER_VERTEX:
   1014       trace_dump_call_begin("pipe_context", "set_vertex_sampler_views");
   1015       break;
   1016    case PIPE_SHADER_GEOMETRY:
   1017       trace_dump_call_begin("pipe_context", "set_geometry_sampler_views");
   1018       break;
   1019    case PIPE_SHADER_FRAGMENT:
   1020       trace_dump_call_begin("pipe_context", "set_fragment_sampler_views");
   1021       break;
   1022    default:
   1023       debug_error("Unexpected shader in trace_context_set_sampler_views()");
   1024    }
   1025 
   1026    trace_dump_arg(ptr, pipe);
   1027    /*trace_dump_arg(uint, shader);*/
   1028    trace_dump_arg(uint, num);
   1029    trace_dump_arg_array(ptr, views, num);
   1030 
   1031    switch (shader) {
   1032    case PIPE_SHADER_VERTEX:
   1033       pipe->set_vertex_sampler_views(pipe, num, views);
   1034       break;
   1035    case PIPE_SHADER_GEOMETRY:
   1036       pipe->set_geometry_sampler_views(pipe, num, views);
   1037       break;
   1038    case PIPE_SHADER_FRAGMENT:
   1039       pipe->set_fragment_sampler_views(pipe, num, views);
   1040       break;
   1041    default:
   1042       debug_error("Unexpected shader in trace_context_set_sampler_views()");
   1043    }
   1044 
   1045    trace_dump_call_end();
   1046 }
   1047 
   1048 
   1049 static INLINE void
   1050 trace_context_set_fragment_sampler_views(struct pipe_context *_pipe,
   1051                                          unsigned num,
   1052                                          struct pipe_sampler_view **views)
   1053 {
   1054    trace_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, 0, num, views);
   1055 }
   1056 
   1057 
   1058 static INLINE void
   1059 trace_context_set_vertex_sampler_views(struct pipe_context *_pipe,
   1060                                        unsigned num,
   1061                                        struct pipe_sampler_view **views)
   1062 {
   1063    trace_context_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, 0, num, views);
   1064 }
   1065 
   1066 
   1067 static INLINE void
   1068 trace_context_set_vertex_buffers(struct pipe_context *_pipe,
   1069                                  unsigned num_buffers,
   1070                                  const struct pipe_vertex_buffer *buffers)
   1071 {
   1072    struct trace_context *tr_ctx = trace_context(_pipe);
   1073    struct pipe_context *pipe = tr_ctx->pipe;
   1074    unsigned i;
   1075 
   1076    trace_dump_call_begin("pipe_context", "set_vertex_buffers");
   1077 
   1078    trace_dump_arg(ptr, pipe);
   1079    trace_dump_arg(uint, num_buffers);
   1080 
   1081    trace_dump_arg_begin("buffers");
   1082    trace_dump_struct_array(vertex_buffer, buffers, num_buffers);
   1083    trace_dump_arg_end();
   1084 
   1085    if (num_buffers) {
   1086       struct pipe_vertex_buffer *_buffers = MALLOC(num_buffers * sizeof(*_buffers));
   1087       memcpy(_buffers, buffers, num_buffers * sizeof(*_buffers));
   1088       for (i = 0; i < num_buffers; i++)
   1089          _buffers[i].buffer = trace_resource_unwrap(tr_ctx, buffers[i].buffer);
   1090       pipe->set_vertex_buffers(pipe, num_buffers, _buffers);
   1091       FREE(_buffers);
   1092    } else {
   1093       pipe->set_vertex_buffers(pipe, num_buffers, NULL);
   1094    }
   1095 
   1096    trace_dump_call_end();
   1097 }
   1098 
   1099 
   1100 static INLINE void
   1101 trace_context_set_index_buffer(struct pipe_context *_pipe,
   1102                                const struct pipe_index_buffer *ib)
   1103 {
   1104    struct trace_context *tr_ctx = trace_context(_pipe);
   1105    struct pipe_context *pipe = tr_ctx->pipe;
   1106 
   1107    trace_dump_call_begin("pipe_context", "set_index_buffer");
   1108 
   1109    trace_dump_arg(ptr, pipe);
   1110    trace_dump_arg(index_buffer, ib);
   1111 
   1112    if (ib) {
   1113       struct pipe_index_buffer _ib;
   1114       _ib = *ib;
   1115       _ib.buffer = trace_resource_unwrap(tr_ctx, ib->buffer);
   1116       pipe->set_index_buffer(pipe, &_ib);
   1117    } else {
   1118       pipe->set_index_buffer(pipe, NULL);
   1119    }
   1120 
   1121    trace_dump_call_end();
   1122 }
   1123 
   1124 
   1125 static INLINE struct pipe_stream_output_target *
   1126 trace_context_create_stream_output_target(struct pipe_context *_pipe,
   1127                                           struct pipe_resource *res,
   1128                                           unsigned buffer_offset,
   1129                                           unsigned buffer_size)
   1130 {
   1131    struct trace_context *tr_ctx = trace_context(_pipe);
   1132    struct pipe_context *pipe = tr_ctx->pipe;
   1133    struct pipe_stream_output_target *result;
   1134 
   1135    res = trace_resource_unwrap(tr_ctx, res);
   1136 
   1137    trace_dump_call_begin("pipe_context", "create_stream_output_target");
   1138 
   1139    trace_dump_arg(ptr, pipe);
   1140    trace_dump_arg(ptr, res);
   1141    trace_dump_arg(uint, buffer_offset);
   1142    trace_dump_arg(uint, buffer_size);
   1143 
   1144    result = pipe->create_stream_output_target(pipe,
   1145                                               res, buffer_offset, buffer_size);
   1146 
   1147    trace_dump_call_end();
   1148 
   1149    return result;
   1150 }
   1151 
   1152 
   1153 static INLINE void
   1154 trace_context_stream_output_target_destroy(
   1155    struct pipe_context *_pipe,
   1156    struct pipe_stream_output_target *target)
   1157 {
   1158    struct trace_context *tr_ctx = trace_context(_pipe);
   1159    struct pipe_context *pipe = tr_ctx->pipe;
   1160 
   1161    trace_dump_call_begin("pipe_context", "stream_output_target_destroy");
   1162 
   1163    trace_dump_arg(ptr, pipe);
   1164    trace_dump_arg(ptr, target);
   1165 
   1166    pipe->stream_output_target_destroy(pipe, target);
   1167 
   1168    trace_dump_call_end();
   1169 }
   1170 
   1171 
   1172 static INLINE void
   1173 trace_context_set_stream_output_targets(struct pipe_context *_pipe,
   1174                                         unsigned num_targets,
   1175                                         struct pipe_stream_output_target **tgs,
   1176                                         unsigned append_bitmask)
   1177 {
   1178    struct trace_context *tr_ctx = trace_context(_pipe);
   1179    struct pipe_context *pipe = tr_ctx->pipe;
   1180 
   1181    trace_dump_call_begin("pipe_context", "set_stream_output_targets");
   1182 
   1183    trace_dump_arg(ptr, pipe);
   1184    trace_dump_arg(uint, num_targets);
   1185    trace_dump_arg_array(ptr, tgs, num_targets);
   1186    trace_dump_arg(uint, append_bitmask);
   1187 
   1188    pipe->set_stream_output_targets(pipe, num_targets, tgs, append_bitmask);
   1189 
   1190    trace_dump_call_end();
   1191 }
   1192 
   1193 
   1194 static INLINE void
   1195 trace_context_resource_copy_region(struct pipe_context *_pipe,
   1196                                    struct pipe_resource *dst,
   1197                                    unsigned dst_level,
   1198                                    unsigned dstx, unsigned dsty, unsigned dstz,
   1199                                    struct pipe_resource *src,
   1200                                    unsigned src_level,
   1201                                    const struct pipe_box *src_box)
   1202 {
   1203    struct trace_context *tr_ctx = trace_context(_pipe);
   1204    struct pipe_context *pipe = tr_ctx->pipe;
   1205 
   1206    dst = trace_resource_unwrap(tr_ctx, dst);
   1207    src = trace_resource_unwrap(tr_ctx, src);
   1208 
   1209    trace_dump_call_begin("pipe_context", "resource_copy_region");
   1210 
   1211    trace_dump_arg(ptr, pipe);
   1212    trace_dump_arg(ptr, dst);
   1213    trace_dump_arg(uint, dst_level);
   1214    trace_dump_arg(uint, dstx);
   1215    trace_dump_arg(uint, dsty);
   1216    trace_dump_arg(uint, dstz);
   1217    trace_dump_arg(ptr, src);
   1218    trace_dump_arg(uint, src_level);
   1219    trace_dump_arg(box, src_box);
   1220 
   1221    pipe->resource_copy_region(pipe,
   1222                               dst, dst_level, dstx, dsty, dstz,
   1223                               src, src_level, src_box);
   1224 
   1225    trace_dump_call_end();
   1226 }
   1227 
   1228 
   1229 static INLINE void
   1230 trace_context_clear(struct pipe_context *_pipe,
   1231                     unsigned buffers,
   1232                     const union pipe_color_union *color,
   1233                     double depth,
   1234                     unsigned stencil)
   1235 {
   1236    struct trace_context *tr_ctx = trace_context(_pipe);
   1237    struct pipe_context *pipe = tr_ctx->pipe;
   1238 
   1239    trace_dump_call_begin("pipe_context", "clear");
   1240 
   1241    trace_dump_arg(ptr, pipe);
   1242    trace_dump_arg(uint, buffers);
   1243    trace_dump_arg_begin("color");
   1244    if (color)
   1245       trace_dump_array(float, color->f, 4);
   1246    else
   1247       trace_dump_null();
   1248    trace_dump_arg_end();
   1249    trace_dump_arg(float, depth);
   1250    trace_dump_arg(uint, stencil);
   1251 
   1252    pipe->clear(pipe, buffers, color, depth, stencil);
   1253 
   1254    trace_dump_call_end();
   1255 }
   1256 
   1257 
   1258 static INLINE void
   1259 trace_context_clear_render_target(struct pipe_context *_pipe,
   1260                                   struct pipe_surface *dst,
   1261                                   const union pipe_color_union *color,
   1262                                   unsigned dstx, unsigned dsty,
   1263                                   unsigned width, unsigned height)
   1264 {
   1265    struct trace_context *tr_ctx = trace_context(_pipe);
   1266    struct pipe_context *pipe = tr_ctx->pipe;
   1267 
   1268    dst = trace_surface_unwrap(tr_ctx, dst);
   1269 
   1270    trace_dump_call_begin("pipe_context", "clear_render_target");
   1271 
   1272    trace_dump_arg(ptr, pipe);
   1273    trace_dump_arg(ptr, dst);
   1274    trace_dump_arg_array(float, color->f, 4);
   1275    trace_dump_arg(uint, dstx);
   1276    trace_dump_arg(uint, dsty);
   1277    trace_dump_arg(uint, width);
   1278    trace_dump_arg(uint, height);
   1279 
   1280    pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height);
   1281 
   1282    trace_dump_call_end();
   1283 }
   1284 
   1285 static INLINE void
   1286 trace_context_clear_depth_stencil(struct pipe_context *_pipe,
   1287                                   struct pipe_surface *dst,
   1288                                   unsigned clear_flags,
   1289                                   double depth,
   1290                                   unsigned stencil,
   1291                                   unsigned dstx, unsigned dsty,
   1292                                   unsigned width, unsigned height)
   1293 {
   1294    struct trace_context *tr_ctx = trace_context(_pipe);
   1295    struct pipe_context *pipe = tr_ctx->pipe;
   1296 
   1297    dst = trace_surface_unwrap(tr_ctx, dst);
   1298 
   1299    trace_dump_call_begin("pipe_context", "clear_depth_stencil");
   1300 
   1301    trace_dump_arg(ptr, pipe);
   1302    trace_dump_arg(ptr, dst);
   1303    trace_dump_arg(uint, clear_flags);
   1304    trace_dump_arg(float, depth);
   1305    trace_dump_arg(uint, stencil);
   1306    trace_dump_arg(uint, dstx);
   1307    trace_dump_arg(uint, dsty);
   1308    trace_dump_arg(uint, width);
   1309    trace_dump_arg(uint, height);
   1310 
   1311    pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,
   1312                              dstx, dsty, width, height);
   1313 
   1314    trace_dump_call_end();
   1315 }
   1316 
   1317 static INLINE void
   1318 trace_context_flush(struct pipe_context *_pipe,
   1319                     struct pipe_fence_handle **fence)
   1320 {
   1321    struct trace_context *tr_ctx = trace_context(_pipe);
   1322    struct pipe_context *pipe = tr_ctx->pipe;
   1323 
   1324    trace_dump_call_begin("pipe_context", "flush");
   1325 
   1326    trace_dump_arg(ptr, pipe);
   1327 
   1328    pipe->flush(pipe, fence);
   1329 
   1330    if(fence)
   1331       trace_dump_ret(ptr, *fence);
   1332 
   1333    trace_dump_call_end();
   1334 }
   1335 
   1336 
   1337 static INLINE void
   1338 trace_context_destroy(struct pipe_context *_pipe)
   1339 {
   1340    struct trace_context *tr_ctx = trace_context(_pipe);
   1341    struct pipe_context *pipe = tr_ctx->pipe;
   1342 
   1343    trace_dump_call_begin("pipe_context", "destroy");
   1344    trace_dump_arg(ptr, pipe);
   1345    trace_dump_call_end();
   1346 
   1347    pipe->destroy(pipe);
   1348 
   1349    FREE(tr_ctx);
   1350 }
   1351 
   1352 
   1353 /********************************************************************
   1354  * transfer
   1355  */
   1356 
   1357 
   1358 static struct pipe_transfer *
   1359 trace_context_get_transfer(struct pipe_context *_context,
   1360                            struct pipe_resource *_resource,
   1361                            unsigned level,
   1362                            unsigned usage,
   1363                            const struct pipe_box *box)
   1364 {
   1365    struct trace_context *tr_context = trace_context(_context);
   1366    struct trace_resource *tr_res = trace_resource(_resource);
   1367    struct pipe_context *context = tr_context->pipe;
   1368    struct pipe_resource *texture = tr_res->resource;
   1369    struct pipe_transfer *result = NULL;
   1370 
   1371    assert(texture->screen == context->screen);
   1372 
   1373    /*
   1374     * Map and transfers can't be serialized so we convert all write transfers
   1375     * to transfer_inline_write and ignore read transfers.
   1376     */
   1377 
   1378    result = context->get_transfer(context, texture, level, usage, box);
   1379 
   1380    if (result)
   1381       result = trace_transfer_create(tr_context, tr_res, result);
   1382 
   1383    return result;
   1384 }
   1385 
   1386 
   1387 static void
   1388 trace_context_transfer_destroy(struct pipe_context *_context,
   1389                                struct pipe_transfer *_transfer)
   1390 {
   1391    struct trace_context *tr_context = trace_context(_context);
   1392    struct trace_transfer *tr_trans = trace_transfer(_transfer);
   1393 
   1394    trace_transfer_destroy(tr_context, tr_trans);
   1395 }
   1396 
   1397 
   1398 static void *
   1399 trace_context_transfer_map(struct pipe_context *_context,
   1400                           struct pipe_transfer *_transfer)
   1401 {
   1402    struct trace_context *tr_context = trace_context(_context);
   1403    struct trace_transfer *tr_trans = trace_transfer(_transfer);
   1404    struct pipe_context *context = tr_context->pipe;
   1405    struct pipe_transfer *transfer = tr_trans->transfer;
   1406    void *map;
   1407 
   1408    map = context->transfer_map(context, transfer);
   1409    if(map) {
   1410       if(transfer->usage & PIPE_TRANSFER_WRITE) {
   1411          assert(!tr_trans->map);
   1412          tr_trans->map = map;
   1413       }
   1414    }
   1415 
   1416    return map;
   1417 }
   1418 
   1419 
   1420 static void
   1421 trace_context_transfer_flush_region( struct pipe_context *_context,
   1422 				     struct pipe_transfer *_transfer,
   1423 				     const struct pipe_box *box)
   1424 {
   1425    struct trace_context *tr_context = trace_context(_context);
   1426    struct trace_transfer *tr_transfer = trace_transfer(_transfer);
   1427    struct pipe_context *context = tr_context->pipe;
   1428    struct pipe_transfer *transfer = tr_transfer->transfer;
   1429 
   1430    context->transfer_flush_region(context,
   1431 				  transfer,
   1432 				  box);
   1433 }
   1434 
   1435 static void
   1436 trace_context_transfer_unmap(struct pipe_context *_context,
   1437                              struct pipe_transfer *_transfer)
   1438 {
   1439    struct trace_context *tr_ctx = trace_context(_context);
   1440    struct trace_transfer *tr_trans = trace_transfer(_transfer);
   1441    struct pipe_context *context = tr_ctx->pipe;
   1442    struct pipe_transfer *transfer = tr_trans->transfer;
   1443 
   1444    if(tr_trans->map) {
   1445       /*
   1446        * Fake a transfer_inline_write
   1447        */
   1448 
   1449       struct pipe_resource *resource = transfer->resource;
   1450       unsigned level = transfer->level;
   1451       unsigned usage = transfer->usage;
   1452       const struct pipe_box *box = &transfer->box;
   1453       unsigned stride = transfer->stride;
   1454       unsigned layer_stride = transfer->layer_stride;
   1455 
   1456       trace_dump_call_begin("pipe_context", "transfer_inline_write");
   1457 
   1458       trace_dump_arg(ptr, context);
   1459       trace_dump_arg(ptr, resource);
   1460       trace_dump_arg(uint, level);
   1461       trace_dump_arg(uint, usage);
   1462       trace_dump_arg(box, box);
   1463 
   1464       trace_dump_arg_begin("data");
   1465       trace_dump_box_bytes(tr_trans->map,
   1466                            resource->format,
   1467                            box,
   1468                            stride,
   1469                            layer_stride);
   1470       trace_dump_arg_end();
   1471 
   1472       trace_dump_arg(uint, stride);
   1473       trace_dump_arg(uint, layer_stride);
   1474 
   1475       trace_dump_call_end();
   1476 
   1477       tr_trans->map = NULL;
   1478    }
   1479 
   1480    context->transfer_unmap(context, transfer);
   1481 }
   1482 
   1483 
   1484 static void
   1485 trace_context_transfer_inline_write(struct pipe_context *_context,
   1486                                     struct pipe_resource *_resource,
   1487                                     unsigned level,
   1488                                     unsigned usage,
   1489                                     const struct pipe_box *box,
   1490                                     const void *data,
   1491                                     unsigned stride,
   1492                                     unsigned layer_stride)
   1493 {
   1494    struct trace_context *tr_context = trace_context(_context);
   1495    struct trace_resource *tr_res = trace_resource(_resource);
   1496    struct pipe_context *context = tr_context->pipe;
   1497    struct pipe_resource *resource = tr_res->resource;
   1498 
   1499    assert(resource->screen == context->screen);
   1500 
   1501    trace_dump_call_begin("pipe_context", "transfer_inline_write");
   1502 
   1503    trace_dump_arg(ptr, context);
   1504    trace_dump_arg(ptr, resource);
   1505    trace_dump_arg(uint, level);
   1506    trace_dump_arg(uint, usage);
   1507    trace_dump_arg(box, box);
   1508 
   1509    trace_dump_arg_begin("data");
   1510    trace_dump_box_bytes(data,
   1511                         resource->format,
   1512                         box,
   1513                         stride,
   1514                         layer_stride);
   1515    trace_dump_arg_end();
   1516 
   1517    trace_dump_arg(uint, stride);
   1518    trace_dump_arg(uint, layer_stride);
   1519 
   1520    trace_dump_call_end();
   1521 
   1522    context->transfer_inline_write(context, resource,
   1523                                   level, usage, box, data, stride, layer_stride);
   1524 }
   1525 
   1526 
   1527 static void trace_context_render_condition(struct pipe_context *_context,
   1528                                            struct pipe_query *query,
   1529                                            uint mode)
   1530 {
   1531    struct trace_context *tr_context = trace_context(_context);
   1532    struct pipe_context *context = tr_context->pipe;
   1533 
   1534    trace_dump_call_begin("pipe_context", "render_condition");
   1535 
   1536    trace_dump_arg(ptr, context);
   1537    trace_dump_arg(ptr, query);
   1538    trace_dump_arg(uint, mode);
   1539 
   1540    trace_dump_call_end();
   1541 
   1542    context->render_condition(context, query, mode);
   1543 }
   1544 
   1545 
   1546 static void trace_context_texture_barrier(struct pipe_context *_context)
   1547 {
   1548    struct trace_context *tr_context = trace_context(_context);
   1549    struct pipe_context *context = tr_context->pipe;
   1550 
   1551    trace_dump_call_begin("pipe_context", "texture_barrier");
   1552 
   1553    trace_dump_arg(ptr, context);
   1554 
   1555    trace_dump_call_end();
   1556 
   1557    context->texture_barrier(context);
   1558 }
   1559 
   1560 
   1561 static const struct debug_named_value rbug_blocker_flags[] = {
   1562    {"before", 1, NULL},
   1563    {"after", 2, NULL},
   1564    DEBUG_NAMED_VALUE_END
   1565 };
   1566 
   1567 struct pipe_context *
   1568 trace_context_create(struct trace_screen *tr_scr,
   1569                      struct pipe_context *pipe)
   1570 {
   1571    struct trace_context *tr_ctx;
   1572 
   1573    if(!pipe)
   1574       goto error1;
   1575 
   1576    if(!trace_enabled())
   1577       goto error1;
   1578 
   1579    tr_ctx = CALLOC_STRUCT(trace_context);
   1580    if(!tr_ctx)
   1581       goto error1;
   1582 
   1583    tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */
   1584    tr_ctx->base.screen = &tr_scr->base;
   1585 
   1586    tr_ctx->base.destroy = trace_context_destroy;
   1587 
   1588 #define TR_CTX_INIT(_member) \
   1589    tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL
   1590 
   1591    TR_CTX_INIT(draw_vbo);
   1592    TR_CTX_INIT(create_query);
   1593    TR_CTX_INIT(destroy_query);
   1594    TR_CTX_INIT(begin_query);
   1595    TR_CTX_INIT(end_query);
   1596    TR_CTX_INIT(get_query_result);
   1597    TR_CTX_INIT(create_blend_state);
   1598    TR_CTX_INIT(bind_blend_state);
   1599    TR_CTX_INIT(delete_blend_state);
   1600    TR_CTX_INIT(create_sampler_state);
   1601    TR_CTX_INIT(bind_fragment_sampler_states);
   1602    TR_CTX_INIT(bind_vertex_sampler_states);
   1603    TR_CTX_INIT(delete_sampler_state);
   1604    TR_CTX_INIT(create_rasterizer_state);
   1605    TR_CTX_INIT(bind_rasterizer_state);
   1606    TR_CTX_INIT(delete_rasterizer_state);
   1607    TR_CTX_INIT(create_depth_stencil_alpha_state);
   1608    TR_CTX_INIT(bind_depth_stencil_alpha_state);
   1609    TR_CTX_INIT(delete_depth_stencil_alpha_state);
   1610    TR_CTX_INIT(create_fs_state);
   1611    TR_CTX_INIT(bind_fs_state);
   1612    TR_CTX_INIT(delete_fs_state);
   1613    TR_CTX_INIT(create_vs_state);
   1614    TR_CTX_INIT(bind_vs_state);
   1615    TR_CTX_INIT(delete_vs_state);
   1616    TR_CTX_INIT(create_vertex_elements_state);
   1617    TR_CTX_INIT(bind_vertex_elements_state);
   1618    TR_CTX_INIT(delete_vertex_elements_state);
   1619    TR_CTX_INIT(set_blend_color);
   1620    TR_CTX_INIT(set_stencil_ref);
   1621    TR_CTX_INIT(set_clip_state);
   1622    TR_CTX_INIT(set_sample_mask);
   1623    TR_CTX_INIT(set_constant_buffer);
   1624    TR_CTX_INIT(set_framebuffer_state);
   1625    TR_CTX_INIT(set_polygon_stipple);
   1626    TR_CTX_INIT(set_scissor_state);
   1627    TR_CTX_INIT(set_viewport_state);
   1628    TR_CTX_INIT(set_fragment_sampler_views);
   1629    TR_CTX_INIT(set_vertex_sampler_views);
   1630    TR_CTX_INIT(create_sampler_view);
   1631    TR_CTX_INIT(sampler_view_destroy);
   1632    TR_CTX_INIT(create_surface);
   1633    TR_CTX_INIT(surface_destroy);
   1634    TR_CTX_INIT(set_vertex_buffers);
   1635    TR_CTX_INIT(set_index_buffer);
   1636    TR_CTX_INIT(create_stream_output_target);
   1637    TR_CTX_INIT(stream_output_target_destroy);
   1638    TR_CTX_INIT(set_stream_output_targets);
   1639    TR_CTX_INIT(resource_copy_region);
   1640    TR_CTX_INIT(clear);
   1641    TR_CTX_INIT(clear_render_target);
   1642    TR_CTX_INIT(clear_depth_stencil);
   1643    TR_CTX_INIT(flush);
   1644    TR_CTX_INIT(render_condition);
   1645    TR_CTX_INIT(texture_barrier);
   1646 
   1647    TR_CTX_INIT(get_transfer);
   1648    TR_CTX_INIT(transfer_destroy);
   1649    TR_CTX_INIT(transfer_map);
   1650    TR_CTX_INIT(transfer_unmap);
   1651    TR_CTX_INIT(transfer_flush_region);
   1652    TR_CTX_INIT(transfer_inline_write);
   1653 
   1654 #undef TR_CTX_INIT
   1655 
   1656    tr_ctx->pipe = pipe;
   1657 
   1658    return &tr_ctx->base;
   1659 
   1660 error1:
   1661    return pipe;
   1662 }
   1663