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 "util/u_memory.h"
29 #include "util/u_hash_table.h"
33 #include "tr_screen.h"
34 #include "tr_texture.h"
35 #include "tr_winsys.h"
38 static unsigned trace_buffer_hash(void *buffer
)
40 return (unsigned)(uintptr_t)buffer
;
44 static int trace_buffer_compare(void *buffer1
, void *buffer2
)
46 return (char *)buffer2
- (char *)buffer1
;
51 trace_winsys_get_name(struct pipe_winsys
*_winsys
)
53 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
54 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
57 trace_dump_call_begin("pipe_winsys", "get_name");
59 trace_dump_arg(ptr
, winsys
);
61 result
= winsys
->get_name(winsys
);
63 trace_dump_ret(string
, result
);
65 trace_dump_call_end();
72 trace_winsys_flush_frontbuffer(struct pipe_winsys
*_winsys
,
73 struct pipe_surface
*surface
,
74 void *context_private
)
76 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
77 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
80 if(surface
->texture
) {
81 struct trace_screen
*tr_scr
= trace_screen(surface
->texture
->screen
);
82 struct trace_texture
*tr_tex
= trace_texture(tr_scr
, surface
->texture
);
83 struct trace_surface
*tr_surf
= trace_surface(tr_tex
, surface
);
84 surface
= tr_surf
->surface
;
87 trace_dump_call_begin("pipe_winsys", "flush_frontbuffer");
89 trace_dump_arg(ptr
, winsys
);
90 trace_dump_arg(ptr
, surface
);
91 /* XXX: hide, as there is nothing we can do with this
92 trace_dump_arg(ptr, context_private);
95 winsys
->flush_frontbuffer(winsys
, surface
, context_private
);
97 trace_dump_call_end();
101 static struct pipe_buffer
*
102 trace_winsys_surface_buffer_create(struct pipe_winsys
*_winsys
,
103 unsigned width
, unsigned height
,
104 enum pipe_format format
,
108 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
109 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
111 struct pipe_buffer
*result
;
113 trace_dump_call_begin("pipe_winsys", "surface_buffer_create");
115 trace_dump_arg(ptr
, winsys
);
116 trace_dump_arg(uint
, width
);
117 trace_dump_arg(uint
, height
);
118 trace_dump_arg(format
, format
);
119 trace_dump_arg(uint
, usage
);
121 result
= winsys
->surface_buffer_create(winsys
,
129 trace_dump_arg(uint
, stride
);
131 trace_dump_ret(ptr
, result
);
133 trace_dump_call_end();
139 static struct pipe_buffer
*
140 trace_winsys_buffer_create(struct pipe_winsys
*_winsys
,
145 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
146 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
147 struct pipe_buffer
*buffer
;
149 trace_dump_call_begin("pipe_winsys", "buffer_create");
151 trace_dump_arg(ptr
, winsys
);
152 trace_dump_arg(uint
, alignment
);
153 trace_dump_arg(uint
, usage
);
154 trace_dump_arg(uint
, size
);
156 buffer
= winsys
->buffer_create(winsys
, alignment
, usage
, size
);
158 trace_dump_ret(ptr
, buffer
);
160 trace_dump_call_end();
162 /* Zero the buffer to avoid dumping uninitialized memory */
163 if(buffer
->usage
& PIPE_BUFFER_USAGE_CPU_WRITE
) {
165 map
= winsys
->buffer_map(winsys
, buffer
, PIPE_BUFFER_USAGE_CPU_WRITE
);
167 memset(map
, 0, buffer
->size
);
168 winsys
->buffer_unmap(winsys
, buffer
);
176 static struct pipe_buffer
*
177 trace_winsys_user_buffer_create(struct pipe_winsys
*_winsys
,
181 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
182 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
183 struct pipe_buffer
*result
;
185 trace_dump_call_begin("pipe_winsys", "user_buffer_create");
187 trace_dump_arg(ptr
, winsys
);
188 trace_dump_arg_begin("data");
189 trace_dump_bytes(data
, size
);
190 trace_dump_arg_end();
191 trace_dump_arg(uint
, size
);
193 result
= winsys
->user_buffer_create(winsys
, data
, size
);
195 trace_dump_ret(ptr
, result
);
197 trace_dump_call_end();
199 /* XXX: Mark the user buffers. (we should wrap pipe_buffers, but is is
200 * impossible to do so while texture-less surfaces are still around */
202 assert(!(result
->usage
& TRACE_BUFFER_USAGE_USER
));
203 result
->usage
|= TRACE_BUFFER_USAGE_USER
;
211 trace_winsys_user_buffer_update(struct pipe_winsys
*_winsys
,
212 struct pipe_buffer
*buffer
)
214 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
215 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
218 if(buffer
&& buffer
->usage
& TRACE_BUFFER_USAGE_USER
) {
219 map
= winsys
->buffer_map(winsys
, buffer
, PIPE_BUFFER_USAGE_CPU_READ
);
221 trace_dump_call_begin("pipe_winsys", "buffer_write");
223 trace_dump_arg(ptr
, winsys
);
225 trace_dump_arg(ptr
, buffer
);
227 trace_dump_arg_begin("data");
228 trace_dump_bytes(map
, buffer
->size
);
229 trace_dump_arg_end();
231 trace_dump_arg_begin("size");
232 trace_dump_uint(buffer
->size
);
233 trace_dump_arg_end();
235 trace_dump_call_end();
237 winsys
->buffer_unmap(winsys
, buffer
);
244 trace_winsys_buffer_map(struct pipe_winsys
*_winsys
,
245 struct pipe_buffer
*buffer
,
248 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
249 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
252 map
= winsys
->buffer_map(winsys
, buffer
, usage
);
254 if(usage
& PIPE_BUFFER_USAGE_CPU_WRITE
) {
255 assert(!hash_table_get(tr_ws
->buffer_maps
, buffer
));
256 hash_table_set(tr_ws
->buffer_maps
, buffer
, map
);
265 trace_winsys_buffer_unmap(struct pipe_winsys
*_winsys
,
266 struct pipe_buffer
*buffer
)
268 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
269 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
272 map
= hash_table_get(tr_ws
->buffer_maps
, buffer
);
274 trace_dump_call_begin("pipe_winsys", "buffer_write");
276 trace_dump_arg(ptr
, winsys
);
278 trace_dump_arg(ptr
, buffer
);
280 trace_dump_arg_begin("data");
281 trace_dump_bytes(map
, buffer
->size
);
282 trace_dump_arg_end();
284 trace_dump_arg_begin("size");
285 trace_dump_uint(buffer
->size
);
286 trace_dump_arg_end();
288 trace_dump_call_end();
290 hash_table_remove(tr_ws
->buffer_maps
, buffer
);
293 winsys
->buffer_unmap(winsys
, buffer
);
298 trace_winsys_buffer_destroy(struct pipe_winsys
*_winsys
,
299 struct pipe_buffer
*buffer
)
301 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
302 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
304 trace_dump_call_begin("pipe_winsys", "buffer_destroy");
306 trace_dump_arg(ptr
, winsys
);
307 trace_dump_arg(ptr
, buffer
);
309 winsys
->buffer_destroy(winsys
, buffer
);
311 trace_dump_call_end();
316 trace_winsys_fence_reference(struct pipe_winsys
*_winsys
,
317 struct pipe_fence_handle
**pdst
,
318 struct pipe_fence_handle
*src
)
320 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
321 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
322 struct pipe_fence_handle
*dst
= *pdst
;
324 trace_dump_call_begin("pipe_winsys", "fence_reference");
326 trace_dump_arg(ptr
, winsys
);
327 trace_dump_arg(ptr
, dst
);
328 trace_dump_arg(ptr
, src
);
330 winsys
->fence_reference(winsys
, pdst
, src
);
332 trace_dump_call_end();
337 trace_winsys_fence_signalled(struct pipe_winsys
*_winsys
,
338 struct pipe_fence_handle
*fence
,
341 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
342 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
345 trace_dump_call_begin("pipe_winsys", "fence_signalled");
347 trace_dump_arg(ptr
, winsys
);
348 trace_dump_arg(ptr
, fence
);
349 trace_dump_arg(uint
, flag
);
351 result
= winsys
->fence_signalled(winsys
, fence
, flag
);
353 trace_dump_ret(int, result
);
355 trace_dump_call_end();
362 trace_winsys_fence_finish(struct pipe_winsys
*_winsys
,
363 struct pipe_fence_handle
*fence
,
366 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
367 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
370 trace_dump_call_begin("pipe_winsys", "fence_finish");
372 trace_dump_arg(ptr
, winsys
);
373 trace_dump_arg(ptr
, fence
);
374 trace_dump_arg(uint
, flag
);
376 result
= winsys
->fence_finish(winsys
, fence
, flag
);
378 trace_dump_ret(int, result
);
380 trace_dump_call_end();
387 trace_winsys_destroy(struct pipe_winsys
*_winsys
)
389 struct trace_winsys
*tr_ws
= trace_winsys(_winsys
);
390 struct pipe_winsys
*winsys
= tr_ws
->winsys
;
392 trace_dump_call_begin("pipe_winsys", "destroy");
394 trace_dump_arg(ptr
, winsys
);
397 winsys->destroy(winsys);
400 trace_dump_call_end();
402 hash_table_destroy(tr_ws
->buffer_maps
);
409 trace_winsys_create(struct pipe_winsys
*winsys
)
411 struct trace_winsys
*tr_ws
;
416 tr_ws
= CALLOC_STRUCT(trace_winsys
);
420 tr_ws
->base
.destroy
= trace_winsys_destroy
;
421 tr_ws
->base
.get_name
= trace_winsys_get_name
;
422 tr_ws
->base
.flush_frontbuffer
= trace_winsys_flush_frontbuffer
;
423 tr_ws
->base
.surface_buffer_create
= trace_winsys_surface_buffer_create
;
424 tr_ws
->base
.buffer_create
= trace_winsys_buffer_create
;
425 tr_ws
->base
.user_buffer_create
= trace_winsys_user_buffer_create
;
426 tr_ws
->base
.buffer_map
= trace_winsys_buffer_map
;
427 tr_ws
->base
.buffer_unmap
= trace_winsys_buffer_unmap
;
428 tr_ws
->base
.buffer_destroy
= trace_winsys_buffer_destroy
;
429 tr_ws
->base
.fence_reference
= trace_winsys_fence_reference
;
430 tr_ws
->base
.fence_signalled
= trace_winsys_fence_signalled
;
431 tr_ws
->base
.fence_finish
= trace_winsys_fence_finish
;
433 tr_ws
->winsys
= winsys
;
435 tr_ws
->buffer_maps
= hash_table_create(trace_buffer_hash
,
436 trace_buffer_compare
);
437 if(!tr_ws
->buffer_maps
)
440 trace_dump_call_begin("", "pipe_winsys_create");
441 trace_dump_ret(ptr
, winsys
);
442 trace_dump_call_end();