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