gallium: add target-helpers/wrap_screen.c to C_SOURCES
[mesa/mesa-lb.git] / src / gallium / drivers / trace / tr_screen.c
blob25990bdac7fe06c4b952685fe4de8245afc5ba47
1 /**************************************************************************
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
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
16 * of the Software.
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_format.h"
29 #include "util/u_memory.h"
30 #include "util/u_simple_list.h"
32 #include "tr_buffer.h"
33 #include "tr_dump.h"
34 #include "tr_dump_state.h"
35 #include "tr_texture.h"
36 #include "tr_context.h"
37 #include "tr_screen.h"
38 #include "tr_public.h"
40 #include "util/u_inlines.h"
41 #include "pipe/p_format.h"
44 static boolean trace = FALSE;
45 static boolean rbug = FALSE;
47 static const char *
48 trace_screen_get_name(struct pipe_screen *_screen)
50 struct trace_screen *tr_scr = trace_screen(_screen);
51 struct pipe_screen *screen = tr_scr->screen;
52 const char *result;
54 trace_dump_call_begin("pipe_screen", "get_name");
56 trace_dump_arg(ptr, screen);
58 result = screen->get_name(screen);
60 trace_dump_ret(string, result);
62 trace_dump_call_end();
64 return result;
68 static const char *
69 trace_screen_get_vendor(struct pipe_screen *_screen)
71 struct trace_screen *tr_scr = trace_screen(_screen);
72 struct pipe_screen *screen = tr_scr->screen;
73 const char *result;
75 trace_dump_call_begin("pipe_screen", "get_vendor");
77 trace_dump_arg(ptr, screen);
79 result = screen->get_vendor(screen);
81 trace_dump_ret(string, result);
83 trace_dump_call_end();
85 return result;
89 static int
90 trace_screen_get_param(struct pipe_screen *_screen,
91 int param)
93 struct trace_screen *tr_scr = trace_screen(_screen);
94 struct pipe_screen *screen = tr_scr->screen;
95 int result;
97 trace_dump_call_begin("pipe_screen", "get_param");
99 trace_dump_arg(ptr, screen);
100 trace_dump_arg(int, param);
102 result = screen->get_param(screen, param);
104 trace_dump_ret(int, result);
106 trace_dump_call_end();
108 return result;
112 static float
113 trace_screen_get_paramf(struct pipe_screen *_screen,
114 int param)
116 struct trace_screen *tr_scr = trace_screen(_screen);
117 struct pipe_screen *screen = tr_scr->screen;
118 float result;
120 trace_dump_call_begin("pipe_screen", "get_paramf");
122 trace_dump_arg(ptr, screen);
123 trace_dump_arg(int, param);
125 result = screen->get_paramf(screen, param);
127 trace_dump_ret(float, result);
129 trace_dump_call_end();
131 return result;
135 static boolean
136 trace_screen_is_format_supported(struct pipe_screen *_screen,
137 enum pipe_format format,
138 enum pipe_texture_target target,
139 unsigned tex_usage,
140 unsigned geom_flags)
142 struct trace_screen *tr_scr = trace_screen(_screen);
143 struct pipe_screen *screen = tr_scr->screen;
144 boolean result;
146 trace_dump_call_begin("pipe_screen", "is_format_supported");
148 trace_dump_arg(ptr, screen);
149 trace_dump_arg(format, format);
150 trace_dump_arg(int, target);
151 trace_dump_arg(uint, tex_usage);
152 trace_dump_arg(uint, geom_flags);
154 result = screen->is_format_supported(screen, format, target, tex_usage, geom_flags);
156 trace_dump_ret(bool, result);
158 trace_dump_call_end();
160 return result;
164 static struct pipe_context *
165 trace_screen_context_create(struct pipe_screen *_screen, void *priv)
167 struct trace_screen *tr_scr = trace_screen(_screen);
168 struct pipe_screen *screen = tr_scr->screen;
169 struct pipe_context *result;
171 trace_dump_call_begin("pipe_screen", "context_create");
173 trace_dump_arg(ptr, screen);
175 result = screen->context_create(screen, priv);
177 trace_dump_ret(ptr, result);
179 trace_dump_call_end();
181 result = trace_context_create(tr_scr, result);
183 return result;
187 static void
188 trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
189 struct pipe_surface *_surface,
190 void *context_private)
192 struct trace_screen *tr_scr = trace_screen(_screen);
193 struct trace_surface *tr_surf = trace_surface(_surface);
194 struct pipe_screen *screen = tr_scr->screen;
195 struct pipe_surface *surface = tr_surf->surface;
197 trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
199 trace_dump_arg(ptr, screen);
200 trace_dump_arg(ptr, surface);
201 /* XXX: hide, as there is nothing we can do with this
202 trace_dump_arg(ptr, context_private);
205 screen->flush_frontbuffer(screen, surface, context_private);
207 trace_dump_call_end();
211 /********************************************************************
212 * texture
216 static struct pipe_texture *
217 trace_screen_texture_create(struct pipe_screen *_screen,
218 const struct pipe_texture *templat)
220 struct trace_screen *tr_scr = trace_screen(_screen);
221 struct pipe_screen *screen = tr_scr->screen;
222 struct pipe_texture *result;
224 trace_dump_call_begin("pipe_screen", "texture_create");
226 trace_dump_arg(ptr, screen);
227 trace_dump_arg(template, templat);
229 result = screen->texture_create(screen, templat);
231 trace_dump_ret(ptr, result);
233 trace_dump_call_end();
235 result = trace_texture_create(tr_scr, result);
237 return result;
240 static struct pipe_texture *
241 trace_screen_texture_from_handle(struct pipe_screen *_screen,
242 const struct pipe_texture *templ,
243 struct winsys_handle *handle)
245 struct trace_screen *tr_screen = trace_screen(_screen);
246 struct pipe_screen *screen = tr_screen->screen;
247 struct pipe_texture *result;
249 /* TODO trace call */
251 result = screen->texture_from_handle(screen, templ, handle);
253 result = trace_texture_create(trace_screen(_screen), result);
255 return result;
258 static boolean
259 trace_screen_texture_get_handle(struct pipe_screen *_screen,
260 struct pipe_texture *_texture,
261 struct winsys_handle *handle)
263 struct trace_screen *tr_screen = trace_screen(_screen);
264 struct trace_texture *tr_texture = trace_texture(_texture);
265 struct pipe_screen *screen = tr_screen->screen;
266 struct pipe_texture *texture = tr_texture->texture;
268 /* TODO trace call */
270 return screen->texture_get_handle(screen, texture, handle);
275 static void
276 trace_screen_texture_destroy(struct pipe_texture *_texture)
278 struct trace_screen *tr_scr = trace_screen(_texture->screen);
279 struct trace_texture *tr_tex = trace_texture(_texture);
280 struct pipe_screen *screen = tr_scr->screen;
281 struct pipe_texture *texture = tr_tex->texture;
283 assert(texture->screen == screen);
285 trace_dump_call_begin("pipe_screen", "texture_destroy");
287 trace_dump_arg(ptr, screen);
288 trace_dump_arg(ptr, texture);
290 trace_dump_call_end();
292 trace_texture_destroy(tr_tex);
296 /********************************************************************
297 * surface
301 static struct pipe_surface *
302 trace_screen_get_tex_surface(struct pipe_screen *_screen,
303 struct pipe_texture *_texture,
304 unsigned face, unsigned level,
305 unsigned zslice,
306 unsigned usage)
308 struct trace_screen *tr_scr = trace_screen(_screen);
309 struct trace_texture *tr_tex = trace_texture(_texture);
310 struct pipe_screen *screen = tr_scr->screen;
311 struct pipe_texture *texture = tr_tex->texture;
312 struct pipe_surface *result = NULL;
314 assert(texture->screen == screen);
316 trace_dump_call_begin("pipe_screen", "get_tex_surface");
318 trace_dump_arg(ptr, screen);
319 trace_dump_arg(ptr, texture);
320 trace_dump_arg(uint, face);
321 trace_dump_arg(uint, level);
322 trace_dump_arg(uint, zslice);
323 trace_dump_arg(uint, usage);
325 result = screen->get_tex_surface(screen, texture, face, level, zslice, usage);
327 trace_dump_ret(ptr, result);
329 trace_dump_call_end();
331 result = trace_surface_create(tr_tex, result);
333 return result;
337 static void
338 trace_screen_tex_surface_destroy(struct pipe_surface *_surface)
340 struct trace_screen *tr_scr = trace_screen(_surface->texture->screen);
341 struct trace_surface *tr_surf = trace_surface(_surface);
342 struct pipe_screen *screen = tr_scr->screen;
343 struct pipe_surface *surface = tr_surf->surface;
345 trace_dump_call_begin("pipe_screen", "tex_surface_destroy");
347 trace_dump_arg(ptr, screen);
348 trace_dump_arg(ptr, surface);
350 trace_dump_call_end();
352 trace_surface_destroy(tr_surf);
359 /********************************************************************
360 * buffer
367 static struct pipe_buffer *
368 trace_screen_buffer_create(struct pipe_screen *_screen,
369 unsigned alignment,
370 unsigned usage,
371 unsigned size)
373 struct trace_screen *tr_scr = trace_screen(_screen);
374 struct pipe_screen *screen = tr_scr->screen;
375 struct pipe_buffer *result;
377 trace_dump_call_begin("pipe_screen", "buffer_create");
379 trace_dump_arg(ptr, screen);
380 trace_dump_arg(uint, alignment);
381 trace_dump_arg(uint, usage);
382 trace_dump_arg(uint, size);
384 result = screen->buffer_create(screen, alignment, usage, size);
386 trace_dump_ret(ptr, result);
388 trace_dump_call_end();
390 /* Zero the buffer to avoid dumping uninitialized memory */
391 if(result->usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
392 void *map;
393 map = pipe_buffer_map(screen, result, PIPE_BUFFER_USAGE_CPU_WRITE);
394 if(map) {
395 memset(map, 0, result->size);
396 screen->buffer_unmap(screen, result);
400 return trace_buffer_create(tr_scr, result);
404 static struct pipe_buffer *
405 trace_screen_user_buffer_create(struct pipe_screen *_screen,
406 void *data,
407 unsigned size)
409 struct trace_screen *tr_scr = trace_screen(_screen);
410 struct pipe_screen *screen = tr_scr->screen;
411 struct pipe_buffer *result;
413 trace_dump_call_begin("pipe_screen", "user_buffer_create");
415 trace_dump_arg(ptr, screen);
416 trace_dump_arg_begin("data");
417 trace_dump_bytes(data, size);
418 trace_dump_arg_end();
419 trace_dump_arg(uint, size);
421 result = screen->user_buffer_create(screen, data, size);
423 trace_dump_ret(ptr, result);
425 trace_dump_call_end();
427 if(result) {
428 assert(!(result->usage & TRACE_BUFFER_USAGE_USER));
429 result->usage |= TRACE_BUFFER_USAGE_USER;
432 return trace_buffer_create(tr_scr, result);
437 * This function is used to track if data has been changed on a user buffer
438 * without map/unmap being called.
440 void
441 trace_screen_user_buffer_update(struct pipe_screen *_screen,
442 struct pipe_buffer *_buffer)
444 #if 0
445 struct trace_screen *tr_scr = trace_screen(_screen);
446 struct pipe_screen *screen = tr_scr->screen;
447 const void *map;
449 if(buffer && buffer->usage & TRACE_BUFFER_USAGE_USER) {
450 map = screen->buffer_map(screen, buffer, PIPE_BUFFER_USAGE_CPU_READ);
451 if(map) {
452 trace_dump_call_begin("pipe_winsys", "buffer_write");
454 trace_dump_arg(ptr, screen);
456 trace_dump_arg(ptr, buffer);
458 trace_dump_arg_begin("data");
459 trace_dump_bytes(map, buffer->size);
460 trace_dump_arg_end();
462 trace_dump_arg_begin("size");
463 trace_dump_uint(buffer->size);
464 trace_dump_arg_end();
466 trace_dump_call_end();
468 screen->buffer_unmap(screen, buffer);
471 #endif
475 static void *
476 trace_screen_buffer_map(struct pipe_screen *_screen,
477 struct pipe_buffer *_buffer,
478 unsigned usage)
480 struct trace_screen *tr_scr = trace_screen(_screen);
481 struct trace_buffer *tr_buf = trace_buffer(_buffer);
482 struct pipe_screen *screen = tr_scr->screen;
483 struct pipe_buffer *buffer = tr_buf->buffer;
484 void *map;
486 assert(screen->buffer_map);
487 map = screen->buffer_map(screen, buffer, usage);
488 if(map) {
489 if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
490 tr_buf->map = map;
494 return map;
498 static void *
499 trace_screen_buffer_map_range(struct pipe_screen *_screen,
500 struct pipe_buffer *_buffer,
501 unsigned offset,
502 unsigned length,
503 unsigned usage)
505 struct trace_screen *tr_scr = trace_screen(_screen);
506 struct trace_buffer *tr_buf = trace_buffer(_buffer);
507 struct pipe_screen *screen = tr_scr->screen;
508 struct pipe_buffer *buffer = tr_buf->buffer;
509 void *map;
511 assert(screen->buffer_map_range);
512 map = screen->buffer_map_range(screen, buffer, offset, length, usage);
513 if(map) {
514 if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
515 tr_buf->map = map;
519 return map;
523 static void
524 buffer_write(struct pipe_screen *screen,
525 struct pipe_buffer *buffer,
526 unsigned offset,
527 const char *map,
528 unsigned size)
530 assert(map);
532 trace_dump_call_begin("pipe_screen", "buffer_write");
534 trace_dump_arg(ptr, screen);
536 trace_dump_arg(ptr, buffer);
538 trace_dump_arg(uint, offset);
540 trace_dump_arg_begin("data");
541 trace_dump_bytes(map + offset, size);
542 trace_dump_arg_end();
544 trace_dump_arg(uint, size);
546 trace_dump_call_end();
551 static void
552 trace_screen_buffer_flush_mapped_range(struct pipe_screen *_screen,
553 struct pipe_buffer *_buffer,
554 unsigned offset,
555 unsigned length)
557 struct trace_screen *tr_scr = trace_screen(_screen);
558 struct trace_buffer *tr_buf = trace_buffer(_buffer);
559 struct pipe_screen *screen = tr_scr->screen;
560 struct pipe_buffer *buffer = tr_buf->buffer;
562 assert(tr_buf->map);
563 buffer_write(screen, buffer, offset, tr_buf->map, length);
564 tr_buf->range_flushed = TRUE;
565 screen->buffer_flush_mapped_range(screen, buffer, offset, length);
569 static void
570 trace_screen_buffer_unmap(struct pipe_screen *_screen,
571 struct pipe_buffer *_buffer)
573 struct trace_screen *tr_scr = trace_screen(_screen);
574 struct trace_buffer *tr_buf = trace_buffer(_buffer);
575 struct pipe_screen *screen = tr_scr->screen;
576 struct pipe_buffer *buffer = tr_buf->buffer;
578 if (tr_buf->map && !tr_buf->range_flushed)
579 buffer_write(screen, buffer, 0, tr_buf->map, buffer->size);
580 tr_buf->map = NULL;
581 tr_buf->range_flushed = FALSE;
582 screen->buffer_unmap(screen, buffer);
586 static void
587 trace_screen_buffer_destroy(struct pipe_buffer *_buffer)
589 struct trace_screen *tr_scr = trace_screen(_buffer->screen);
590 struct trace_buffer *tr_buf = trace_buffer(_buffer);
591 struct pipe_screen *screen = tr_scr->screen;
592 struct pipe_buffer *buffer = tr_buf->buffer;
594 trace_dump_call_begin("pipe_screen", "buffer_destroy");
596 trace_dump_arg(ptr, screen);
597 trace_dump_arg(ptr, buffer);
599 trace_dump_call_end();
601 trace_buffer_destroy(tr_scr, _buffer);
605 /********************************************************************
606 * fence
610 static void
611 trace_screen_fence_reference(struct pipe_screen *_screen,
612 struct pipe_fence_handle **pdst,
613 struct pipe_fence_handle *src)
615 struct trace_screen *tr_scr = trace_screen(_screen);
616 struct pipe_screen *screen = tr_scr->screen;
617 struct pipe_fence_handle *dst;
619 assert(pdst);
620 dst = *pdst;
622 trace_dump_call_begin("pipe_screen", "fence_reference");
624 trace_dump_arg(ptr, screen);
625 trace_dump_arg(ptr, dst);
626 trace_dump_arg(ptr, src);
628 screen->fence_reference(screen, pdst, src);
630 trace_dump_call_end();
634 static int
635 trace_screen_fence_signalled(struct pipe_screen *_screen,
636 struct pipe_fence_handle *fence,
637 unsigned flags)
639 struct trace_screen *tr_scr = trace_screen(_screen);
640 struct pipe_screen *screen = tr_scr->screen;
641 int result;
643 trace_dump_call_begin("pipe_screen", "fence_signalled");
645 trace_dump_arg(ptr, screen);
646 trace_dump_arg(ptr, fence);
647 trace_dump_arg(uint, flags);
649 result = screen->fence_signalled(screen, fence, flags);
651 trace_dump_ret(int, result);
653 trace_dump_call_end();
655 return result;
659 static int
660 trace_screen_fence_finish(struct pipe_screen *_screen,
661 struct pipe_fence_handle *fence,
662 unsigned flags)
664 struct trace_screen *tr_scr = trace_screen(_screen);
665 struct pipe_screen *screen = tr_scr->screen;
666 int result;
668 trace_dump_call_begin("pipe_screen", "fence_finish");
670 trace_dump_arg(ptr, screen);
671 trace_dump_arg(ptr, fence);
672 trace_dump_arg(uint, flags);
674 result = screen->fence_finish(screen, fence, flags);
676 trace_dump_ret(int, result);
678 trace_dump_call_end();
680 return result;
684 /********************************************************************
685 * screen
688 static void
689 trace_screen_destroy(struct pipe_screen *_screen)
691 struct trace_screen *tr_scr = trace_screen(_screen);
692 struct pipe_screen *screen = tr_scr->screen;
694 trace_dump_call_begin("pipe_screen", "destroy");
695 trace_dump_arg(ptr, screen);
696 trace_dump_call_end();
697 trace_dump_trace_end();
699 if (tr_scr->rbug)
700 trace_rbug_stop(tr_scr->rbug);
702 screen->destroy(screen);
704 FREE(tr_scr);
707 boolean
708 trace_enabled(void)
710 static boolean firstrun = TRUE;
712 if (!firstrun)
713 return trace;
714 firstrun = FALSE;
716 trace_dump_init();
718 if(trace_dump_trace_begin()) {
719 trace_dumping_start();
720 trace = TRUE;
723 if (debug_get_bool_option("GALLIUM_RBUG", FALSE)) {
724 trace = TRUE;
725 rbug = TRUE;
728 return trace;
731 struct pipe_screen *
732 trace_screen_create(struct pipe_screen *screen)
734 struct trace_screen *tr_scr;
735 struct pipe_winsys *winsys;
737 if(!screen)
738 goto error1;
740 if (!trace_enabled())
741 goto error1;
743 trace_dump_call_begin("", "pipe_screen_create");
745 tr_scr = CALLOC_STRUCT(trace_screen);
746 if(!tr_scr)
747 goto error2;
749 #if 0
750 winsys = trace_winsys_create(screen->winsys);
751 if(!winsys)
752 goto error3;
753 #else
754 winsys = screen->winsys;
755 #endif
756 pipe_mutex_init(tr_scr->list_mutex);
757 make_empty_list(&tr_scr->buffers);
758 make_empty_list(&tr_scr->contexts);
759 make_empty_list(&tr_scr->textures);
760 make_empty_list(&tr_scr->surfaces);
761 make_empty_list(&tr_scr->transfers);
763 tr_scr->base.winsys = winsys;
764 tr_scr->base.destroy = trace_screen_destroy;
765 tr_scr->base.get_name = trace_screen_get_name;
766 tr_scr->base.get_vendor = trace_screen_get_vendor;
767 tr_scr->base.get_param = trace_screen_get_param;
768 tr_scr->base.get_paramf = trace_screen_get_paramf;
769 tr_scr->base.is_format_supported = trace_screen_is_format_supported;
770 assert(screen->context_create);
771 tr_scr->base.context_create = trace_screen_context_create;
772 tr_scr->base.texture_create = trace_screen_texture_create;
773 tr_scr->base.texture_from_handle = trace_screen_texture_from_handle;
774 tr_scr->base.texture_get_handle = trace_screen_texture_get_handle;
775 tr_scr->base.texture_destroy = trace_screen_texture_destroy;
776 tr_scr->base.get_tex_surface = trace_screen_get_tex_surface;
777 tr_scr->base.tex_surface_destroy = trace_screen_tex_surface_destroy;
778 tr_scr->base.buffer_create = trace_screen_buffer_create;
779 tr_scr->base.user_buffer_create = trace_screen_user_buffer_create;
780 if (screen->buffer_map)
781 tr_scr->base.buffer_map = trace_screen_buffer_map;
782 if (screen->buffer_map_range)
783 tr_scr->base.buffer_map_range = trace_screen_buffer_map_range;
784 if (screen->buffer_flush_mapped_range)
785 tr_scr->base.buffer_flush_mapped_range = trace_screen_buffer_flush_mapped_range;
786 if (screen->buffer_unmap)
787 tr_scr->base.buffer_unmap = trace_screen_buffer_unmap;
788 tr_scr->base.buffer_destroy = trace_screen_buffer_destroy;
789 tr_scr->base.fence_reference = trace_screen_fence_reference;
790 tr_scr->base.fence_signalled = trace_screen_fence_signalled;
791 tr_scr->base.fence_finish = trace_screen_fence_finish;
792 tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
794 tr_scr->screen = screen;
795 tr_scr->private_context = screen->context_create(screen, NULL);
796 if (tr_scr->private_context == NULL)
797 goto error3;
799 trace_dump_ret(ptr, screen);
800 trace_dump_call_end();
802 if (rbug)
803 tr_scr->rbug = trace_rbug_start(tr_scr);
805 return &tr_scr->base;
807 error3:
808 FREE(tr_scr);
809 error2:
810 trace_dump_ret(ptr, screen);
811 trace_dump_call_end();
812 trace_dump_trace_end();
813 error1:
814 return screen;
818 struct trace_screen *
819 trace_screen(struct pipe_screen *screen)
821 assert(screen);
822 assert(screen->destroy == trace_screen_destroy);
823 return (struct trace_screen *)screen;