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 "pipe/p_state.h"
30 #include "util/u_hash_table.h"
34 #include "tr_screen.h"
35 #include "tr_texture.h"
36 #include "tr_winsys.h"
39 static unsigned trace_buffer_hash(void *buffer
)
41 return (unsigned)(uintptr_t)buffer
;
45 static int trace_buffer_compare(void *buffer1
, void *buffer2
)
47 return (char *)buffer2
- (char *)buffer1
;
52 trace_winsys_get_name(struct pipe_winsys
*_winsys
)
54 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
55 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
58 trace_dump_call_begin("pipe_winsys", "get_name");
60 trace_dump_arg(ptr
, winsys
);
62 result
= winsys
->get_name(winsys
);
64 trace_dump_ret(string
, result
);
66 trace_dump_call_end();
73 trace_winsys_flush_frontbuffer(struct pipe_winsys
*_winsys
,
74 struct pipe_surface
*surface
,
75 void *context_private
)
77 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
78 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
81 if(surface
->texture
) {
82 struct trace_screen
*tr_scr
= trace_screen(surface
->texture
->screen
);
83 struct trace_texture
*tr_tex
= trace_texture(tr_scr
, surface
->texture
);
84 struct trace_surface
*tr_surf
= trace_surface(tr_tex
, surface
);
85 surface
= tr_surf
->surface
;
88 trace_dump_call_begin("pipe_winsys", "flush_frontbuffer");
90 trace_dump_arg(ptr
, winsys
);
91 trace_dump_arg(ptr
, surface
);
92 /* XXX: hide, as there is nothing we can do with this
93 trace_dump_arg(ptr, context_private);
96 winsys
->flush_frontbuffer(winsys
, surface
, context_private
);
98 trace_dump_call_end();
102 static struct pipe_surface
*
103 trace_winsys_surface_alloc(struct pipe_winsys
*_winsys
)
105 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
106 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
107 struct pipe_surface
*result
;
109 trace_dump_call_begin("pipe_winsys", "surface_alloc");
111 trace_dump_arg(ptr
, winsys
);
113 result
= winsys
->surface_alloc(winsys
);
115 trace_dump_ret(ptr
, result
);
117 trace_dump_call_end();
119 assert(!result
|| !result
->texture
);
126 trace_winsys_surface_alloc_storage(struct pipe_winsys
*_winsys
,
127 struct pipe_surface
*surface
,
128 unsigned width
, unsigned height
,
129 enum pipe_format format
,
133 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
134 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
137 assert(surface
&& !surface
->texture
);
139 trace_dump_call_begin("pipe_winsys", "surface_alloc_storage");
141 trace_dump_arg(ptr
, winsys
);
142 trace_dump_arg(ptr
, surface
);
143 trace_dump_arg(uint
, width
);
144 trace_dump_arg(uint
, height
);
145 trace_dump_arg(format
, format
);
146 trace_dump_arg(uint
, flags
);
147 trace_dump_arg(uint
, tex_usage
);
149 result
= winsys
->surface_alloc_storage(winsys
,
156 trace_dump_ret(int, result
);
158 trace_dump_call_end();
165 trace_winsys_surface_release(struct pipe_winsys
*_winsys
,
166 struct pipe_surface
**psurface
)
168 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
169 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
170 struct pipe_surface
*surface
= *psurface
;
172 assert(psurface
&& *psurface
&& !(*psurface
)->texture
);
174 trace_dump_call_begin("pipe_winsys", "surface_release");
176 trace_dump_arg(ptr
, winsys
);
177 trace_dump_arg(ptr
, surface
);
179 winsys
->surface_release(winsys
, psurface
);
181 trace_dump_call_end();
185 static struct pipe_buffer
*
186 trace_winsys_buffer_create(struct pipe_winsys
*_winsys
,
191 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
192 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
193 struct pipe_buffer
*buffer
;
195 trace_dump_call_begin("pipe_winsys", "buffer_create");
197 trace_dump_arg(ptr
, winsys
);
198 trace_dump_arg(uint
, alignment
);
199 trace_dump_arg(uint
, usage
);
200 trace_dump_arg(uint
, size
);
202 buffer
= winsys
->buffer_create(winsys
, alignment
, usage
, size
);
204 trace_dump_ret(ptr
, buffer
);
206 trace_dump_call_end();
208 /* Zero the buffer to avoid dumping uninitialized memory */
209 if(buffer
->usage
& PIPE_BUFFER_USAGE_CPU_WRITE
) {
211 map
= winsys
->buffer_map(winsys
, buffer
, PIPE_BUFFER_USAGE_CPU_WRITE
);
213 memset(map
, 0, buffer
->size
);
214 winsys
->buffer_unmap(winsys
, buffer
);
222 static struct pipe_buffer
*
223 trace_winsys_user_buffer_create(struct pipe_winsys
*_winsys
,
227 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
228 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
229 struct pipe_buffer
*result
;
231 trace_dump_call_begin("pipe_winsys", "user_buffer_create");
233 trace_dump_arg(ptr
, winsys
);
234 trace_dump_arg_begin("data");
235 trace_dump_bytes(data
, size
);
236 trace_dump_arg_end();
237 trace_dump_arg(uint
, size
);
239 result
= winsys
->user_buffer_create(winsys
, data
, size
);
241 trace_dump_ret(ptr
, result
);
243 trace_dump_call_end();
245 /* XXX: Mark the user buffers. (we should wrap pipe_buffers, but is is
246 * impossible to do so while texture-less surfaces are still around */
248 assert(!(result
->usage
& TRACE_BUFFER_USAGE_USER
));
249 result
->usage
|= TRACE_BUFFER_USAGE_USER
;
257 trace_winsys_user_buffer_update(struct pipe_winsys
*_winsys
,
258 struct pipe_buffer
*buffer
)
260 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
261 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
264 if(buffer
&& buffer
->usage
& TRACE_BUFFER_USAGE_USER
) {
265 map
= winsys
->buffer_map(winsys
, buffer
, PIPE_BUFFER_USAGE_CPU_READ
);
267 trace_dump_call_begin("pipe_winsys", "buffer_write");
269 trace_dump_arg(ptr
, winsys
);
271 trace_dump_arg(ptr
, buffer
);
273 trace_dump_arg_begin("data");
274 trace_dump_bytes(map
, buffer
->size
);
275 trace_dump_arg_end();
277 trace_dump_arg_begin("size");
278 trace_dump_uint(buffer
->size
);
279 trace_dump_arg_end();
281 trace_dump_call_end();
283 winsys
->buffer_unmap(winsys
, buffer
);
290 trace_winsys_buffer_map(struct pipe_winsys
*_winsys
,
291 struct pipe_buffer
*buffer
,
294 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
295 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
298 map
= winsys
->buffer_map(winsys
, buffer
, usage
);
300 if(usage
& PIPE_BUFFER_USAGE_CPU_WRITE
) {
301 assert(!hash_table_get(tr_ws
->buffer_maps
, buffer
));
302 hash_table_set(tr_ws
->buffer_maps
, buffer
, map
);
311 trace_winsys_buffer_unmap(struct pipe_winsys
*_winsys
,
312 struct pipe_buffer
*buffer
)
314 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
315 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
318 map
= hash_table_get(tr_ws
->buffer_maps
, buffer
);
320 trace_dump_call_begin("pipe_winsys", "buffer_write");
322 trace_dump_arg(ptr
, winsys
);
324 trace_dump_arg(ptr
, buffer
);
326 trace_dump_arg_begin("data");
327 trace_dump_bytes(map
, buffer
->size
);
328 trace_dump_arg_end();
330 trace_dump_arg_begin("size");
331 trace_dump_uint(buffer
->size
);
332 trace_dump_arg_end();
334 trace_dump_call_end();
336 hash_table_remove(tr_ws
->buffer_maps
, buffer
);
339 winsys
->buffer_unmap(winsys
, buffer
);
344 trace_winsys_buffer_destroy(struct pipe_winsys
*_winsys
,
345 struct pipe_buffer
*buffer
)
347 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
348 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
350 trace_dump_call_begin("pipe_winsys", "buffer_destroy");
352 trace_dump_arg(ptr
, winsys
);
353 trace_dump_arg(ptr
, buffer
);
355 winsys
->buffer_destroy(winsys
, buffer
);
357 trace_dump_call_end();
362 trace_winsys_fence_reference(struct pipe_winsys
*_winsys
,
363 struct pipe_fence_handle
**pdst
,
364 struct pipe_fence_handle
*src
)
366 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
367 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
368 struct pipe_fence_handle
*dst
= *pdst
;
370 trace_dump_call_begin("pipe_winsys", "fence_reference");
372 trace_dump_arg(ptr
, winsys
);
373 trace_dump_arg(ptr
, dst
);
374 trace_dump_arg(ptr
, src
);
376 winsys
->fence_reference(winsys
, pdst
, src
);
378 trace_dump_call_end();
383 trace_winsys_fence_signalled(struct pipe_winsys
*_winsys
,
384 struct pipe_fence_handle
*fence
,
387 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
388 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
391 trace_dump_call_begin("pipe_winsys", "fence_signalled");
393 trace_dump_arg(ptr
, winsys
);
394 trace_dump_arg(ptr
, fence
);
395 trace_dump_arg(uint
, flag
);
397 result
= winsys
->fence_signalled(winsys
, fence
, flag
);
399 trace_dump_ret(int, result
);
401 trace_dump_call_end();
408 trace_winsys_fence_finish(struct pipe_winsys
*_winsys
,
409 struct pipe_fence_handle
*fence
,
412 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
413 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
416 trace_dump_call_begin("pipe_winsys", "fence_finish");
418 trace_dump_arg(ptr
, winsys
);
419 trace_dump_arg(ptr
, fence
);
420 trace_dump_arg(uint
, flag
);
422 result
= winsys
->fence_finish(winsys
, fence
, flag
);
424 trace_dump_ret(int, result
);
426 trace_dump_call_end();
433 trace_winsys_destroy(struct pipe_winsys
*_winsys
)
435 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
436 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
438 trace_dump_call_begin("pipe_winsys", "destroy");
440 trace_dump_arg(ptr
, winsys
);
443 winsys->destroy(winsys);
446 trace_dump_call_end();
448 hash_table_destroy(tr_ws
->buffer_maps
);
455 trace_winsys_create(struct pipe_winsys
*winsys
)
457 struct trace_winsys
*tr_ws
;
462 tr_ws
= CALLOC_STRUCT(trace_winsys
);
466 tr_ws
->base
.destroy
= trace_winsys_destroy
;
467 tr_ws
->base
.get_name
= trace_winsys_get_name
;
468 tr_ws
->base
.flush_frontbuffer
= trace_winsys_flush_frontbuffer
;
469 tr_ws
->base
.surface_alloc
= trace_winsys_surface_alloc
;
470 tr_ws
->base
.surface_alloc_storage
= trace_winsys_surface_alloc_storage
;
471 tr_ws
->base
.surface_release
= trace_winsys_surface_release
;
472 tr_ws
->base
.buffer_create
= trace_winsys_buffer_create
;
473 tr_ws
->base
.user_buffer_create
= trace_winsys_user_buffer_create
;
474 tr_ws
->base
.buffer_map
= trace_winsys_buffer_map
;
475 tr_ws
->base
.buffer_unmap
= trace_winsys_buffer_unmap
;
476 tr_ws
->base
.buffer_destroy
= trace_winsys_buffer_destroy
;
477 tr_ws
->base
.fence_reference
= trace_winsys_fence_reference
;
478 tr_ws
->base
.fence_signalled
= trace_winsys_fence_signalled
;
479 tr_ws
->base
.fence_finish
= trace_winsys_fence_finish
;
481 tr_ws
->winsys
= winsys
;
483 tr_ws
->buffer_maps
= hash_table_create(trace_buffer_hash
,
484 trace_buffer_compare
);
485 if(!tr_ws
->buffer_maps
)
488 trace_dump_call_begin("", "pipe_winsys_create");
489 trace_dump_ret(ptr
, winsys
);
490 trace_dump_call_end();