1 /**************************************************************************
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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.
26 **************************************************************************/
28 #include "pipe/p_util.h"
29 #include "util/u_hash_table.h"
33 #include "tr_winsys.h"
34 #include "tr_screen.h"
37 static unsigned trace_surface_hash(void *surface
)
39 return (unsigned)(uintptr_t)surface
;
43 static int trace_surface_compare(void *surface1
, void *surface2
)
45 return (char *)surface2
- (char *)surface1
;
50 trace_screen_get_name(struct pipe_screen
*_screen
)
52 struct trace_screen
*tr_scr
= trace_screen(_screen
);
53 struct pipe_screen
*screen
= tr_scr
->screen
;
56 trace_dump_call_begin("pipe_screen", "get_name");
58 trace_dump_arg(ptr
, screen
);
60 result
= screen
->get_name(screen
);
62 trace_dump_ret(string
, result
);
64 trace_dump_call_end();
71 trace_screen_get_vendor(struct pipe_screen
*_screen
)
73 struct trace_screen
*tr_scr
= trace_screen(_screen
);
74 struct pipe_screen
*screen
= tr_scr
->screen
;
77 trace_dump_call_begin("pipe_screen", "get_vendor");
79 trace_dump_arg(ptr
, screen
);
81 result
= screen
->get_vendor(screen
);
83 trace_dump_ret(string
, result
);
85 trace_dump_call_end();
92 trace_screen_get_param(struct pipe_screen
*_screen
,
95 struct trace_screen
*tr_scr
= trace_screen(_screen
);
96 struct pipe_screen
*screen
= tr_scr
->screen
;
99 trace_dump_call_begin("pipe_screen", "get_param");
101 trace_dump_arg(ptr
, screen
);
102 trace_dump_arg(int, param
);
104 result
= screen
->get_param(screen
, param
);
106 trace_dump_ret(int, result
);
108 trace_dump_call_end();
115 trace_screen_get_paramf(struct pipe_screen
*_screen
,
118 struct trace_screen
*tr_scr
= trace_screen(_screen
);
119 struct pipe_screen
*screen
= tr_scr
->screen
;
122 trace_dump_call_begin("pipe_screen", "get_paramf");
124 trace_dump_arg(ptr
, screen
);
125 trace_dump_arg(int, param
);
127 result
= screen
->get_paramf(screen
, param
);
129 trace_dump_ret(float, result
);
131 trace_dump_call_end();
138 trace_screen_is_format_supported(struct pipe_screen
*_screen
,
139 enum pipe_format format
,
140 enum pipe_texture_target target
,
144 struct trace_screen
*tr_scr
= trace_screen(_screen
);
145 struct pipe_screen
*screen
= tr_scr
->screen
;
148 trace_dump_call_begin("pipe_screen", "is_format_supported");
150 trace_dump_arg(ptr
, screen
);
151 trace_dump_arg(format
, format
);
152 trace_dump_arg(int, target
);
153 trace_dump_arg(uint
, tex_usage
);
154 trace_dump_arg(uint
, geom_flags
);
156 result
= screen
->is_format_supported(screen
, format
, target
, tex_usage
, geom_flags
);
158 trace_dump_ret(bool, result
);
160 trace_dump_call_end();
166 static struct pipe_texture
*
167 trace_screen_texture_create(struct pipe_screen
*_screen
,
168 const struct pipe_texture
*templat
)
170 struct trace_screen
*tr_scr
= trace_screen(_screen
);
171 struct pipe_screen
*screen
= tr_scr
->screen
;
172 struct pipe_texture
*result
;
174 trace_dump_call_begin("pipe_screen", "texture_create");
176 trace_dump_arg(ptr
, screen
);
177 trace_dump_arg(template, templat
);
179 result
= screen
->texture_create(screen
, templat
);
181 trace_dump_ret(ptr
, result
);
183 trace_dump_call_end();
189 static struct pipe_texture
*
190 trace_screen_texture_blanket(struct pipe_screen
*_screen
,
191 const struct pipe_texture
*templat
,
192 const unsigned *ppitch
,
193 struct pipe_buffer
*buffer
)
195 struct trace_screen
*tr_scr
= trace_screen(_screen
);
196 struct pipe_screen
*screen
= tr_scr
->screen
;
197 unsigned pitch
= *ppitch
;
198 struct pipe_texture
*result
;
200 trace_dump_call_begin("pipe_screen", "texture_blanket");
202 trace_dump_arg(ptr
, screen
);
203 trace_dump_arg(template, templat
);
204 trace_dump_arg(uint
, pitch
);
205 trace_dump_arg(ptr
, buffer
);
207 result
= screen
->texture_blanket(screen
, templat
, ppitch
, buffer
);
209 trace_dump_ret(ptr
, result
);
211 trace_dump_call_end();
218 trace_screen_texture_release(struct pipe_screen
*_screen
,
219 struct pipe_texture
**ptexture
)
221 struct trace_screen
*tr_scr
= trace_screen(_screen
);
222 struct pipe_screen
*screen
= tr_scr
->screen
;
223 struct pipe_texture
*texture
= *ptexture
;
225 trace_dump_call_begin("pipe_screen", "texture_release");
227 trace_dump_arg(ptr
, screen
);
228 trace_dump_arg(ptr
, texture
);
230 screen
->texture_release(screen
, ptexture
);
232 trace_dump_call_end();
235 static struct pipe_surface
*
236 trace_screen_get_tex_surface(struct pipe_screen
*_screen
,
237 struct pipe_texture
*texture
,
238 unsigned face
, unsigned level
,
242 struct trace_screen
*tr_scr
= trace_screen(_screen
);
243 struct pipe_screen
*screen
= tr_scr
->screen
;
244 struct pipe_surface
*result
;
246 trace_dump_call_begin("pipe_screen", "get_tex_surface");
248 trace_dump_arg(ptr
, screen
);
249 trace_dump_arg(ptr
, texture
);
250 trace_dump_arg(uint
, face
);
251 trace_dump_arg(uint
, level
);
252 trace_dump_arg(uint
, zslice
);
253 trace_dump_arg(uint
, usage
);
255 result
= screen
->get_tex_surface(screen
, texture
, face
, level
, zslice
, usage
);
257 trace_dump_ret(ptr
, result
);
259 trace_dump_call_end();
266 trace_screen_tex_surface_release(struct pipe_screen
*_screen
,
267 struct pipe_surface
**psurface
)
269 struct trace_screen
*tr_scr
= trace_screen(_screen
);
270 struct pipe_screen
*screen
= tr_scr
->screen
;
271 struct pipe_surface
*surface
= *psurface
;
273 trace_dump_call_begin("pipe_screen", "tex_surface_release");
275 trace_dump_arg(ptr
, screen
);
276 trace_dump_arg(ptr
, surface
);
278 screen
->tex_surface_release(screen
, psurface
);
280 trace_dump_call_end();
285 trace_screen_surface_map(struct pipe_screen
*_screen
,
286 struct pipe_surface
*surface
,
289 struct trace_screen
*tr_scr
= trace_screen(_screen
);
290 struct pipe_screen
*screen
= tr_scr
->screen
;
293 map
= screen
->surface_map(screen
, surface
, flags
);
295 if(flags
& PIPE_BUFFER_USAGE_CPU_WRITE
) {
296 assert(!hash_table_get(tr_scr
->surface_maps
, surface
));
297 hash_table_set(tr_scr
->surface_maps
, surface
, map
);
306 trace_screen_surface_unmap(struct pipe_screen
*_screen
,
307 struct pipe_surface
*surface
)
309 struct trace_screen
*tr_scr
= trace_screen(_screen
);
310 struct pipe_screen
*screen
= tr_scr
->screen
;
313 map
= hash_table_get(tr_scr
->surface_maps
, surface
);
315 size_t size
= surface
->nblocksy
* surface
->stride
;
317 trace_dump_call_begin("pipe_winsys", "surface_write");
319 trace_dump_arg(ptr
, screen
);
321 trace_dump_arg(ptr
, surface
);
323 trace_dump_arg_begin("data");
324 trace_dump_bytes(map
, size
);
325 trace_dump_arg_end();
327 trace_dump_arg_begin("stride");
328 trace_dump_uint(surface
->stride
);
329 trace_dump_arg_end();
331 trace_dump_arg_begin("size");
332 trace_dump_uint(size
);
333 trace_dump_arg_end();
335 trace_dump_call_end();
337 hash_table_remove(tr_scr
->surface_maps
, surface
);
340 screen
->surface_unmap(screen
, surface
);
345 trace_screen_destroy(struct pipe_screen
*_screen
)
347 struct trace_screen
*tr_scr
= trace_screen(_screen
);
348 struct pipe_screen
*screen
= tr_scr
->screen
;
350 trace_dump_call_begin("pipe_screen", "destroy");
352 trace_dump_arg(ptr
, screen
);
354 screen
->destroy(screen
);
356 trace_dump_call_end();
358 trace_dump_trace_end();
365 trace_screen_create(struct pipe_screen
*screen
)
367 struct trace_screen
*tr_scr
;
368 struct pipe_winsys
*winsys
;
373 if(!trace_dump_trace_begin())
376 tr_scr
= CALLOC_STRUCT(trace_screen
);
380 winsys
= trace_winsys_create(screen
->winsys
);
384 tr_scr
->base
.winsys
= winsys
;
385 tr_scr
->base
.destroy
= trace_screen_destroy
;
386 tr_scr
->base
.get_name
= trace_screen_get_name
;
387 tr_scr
->base
.get_vendor
= trace_screen_get_vendor
;
388 tr_scr
->base
.get_param
= trace_screen_get_param
;
389 tr_scr
->base
.get_paramf
= trace_screen_get_paramf
;
390 tr_scr
->base
.is_format_supported
= trace_screen_is_format_supported
;
391 tr_scr
->base
.texture_create
= trace_screen_texture_create
;
392 tr_scr
->base
.texture_blanket
= trace_screen_texture_blanket
;
393 tr_scr
->base
.texture_release
= trace_screen_texture_release
;
394 tr_scr
->base
.get_tex_surface
= trace_screen_get_tex_surface
;
395 tr_scr
->base
.tex_surface_release
= trace_screen_tex_surface_release
;
396 tr_scr
->base
.surface_map
= trace_screen_surface_map
;
397 tr_scr
->base
.surface_unmap
= trace_screen_surface_unmap
;
399 tr_scr
->screen
= screen
;
401 tr_scr
->surface_maps
= hash_table_create(trace_surface_hash
,
402 trace_surface_compare
);
403 if(!tr_scr
->surface_maps
)
406 trace_dump_call_begin("", "pipe_screen_create");
407 trace_dump_arg_begin("winsys");
408 trace_dump_ptr(screen
->winsys
);
409 trace_dump_arg_end();
410 trace_dump_ret(ptr
, screen
);
411 trace_dump_call_end();
413 return &tr_scr
->base
;
418 trace_dump_trace_end();