1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Trace dumping functions.
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For now we just use standard XML for dumping the trace calls, as this is
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * simple to write, parse, and visually inspect, but the actual representation
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is abstracted out of this file, so that we can switch to a binary
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * representation if/when it becomes justified.
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_config.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_compiler.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_thread.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_string.h"
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tr_dump.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tr_screen.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tr_texture.h"
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic FILE *stream = NULL;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned refcount = 0;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_static_mutex(call_mutex);
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic long unsigned call_no = 0;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean dumping = FALSE;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_write(const char *buf, size_t size)
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stream) {
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fwrite(buf, size, 1, stream);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_writes(const char *s)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_write(s, strlen(s));
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_writef(const char *format, ...)
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static char buf[1024];
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned len;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   va_list ap;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   va_start(ap, format);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   len = util_vsnprintf(buf, sizeof(buf), format, ap);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   va_end(ap);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_write(buf, len);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_escape(const char *str)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const unsigned char *p = (const unsigned char *)str;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char c;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while((c = *p++) != 0) {
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(c == '<')
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writes("&lt;");
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(c == '>')
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writes("&gt;");
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(c == '&')
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writes("&amp;");
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(c == '\'')
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writes("&apos;");
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(c == '\"')
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writes("&quot;");
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(c >= 0x20 && c <= 0x7e)
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writef("%c", c);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_writef("&#%u;", c);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_indent(unsigned level)
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for(i = 0; i < level; ++i)
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writes("\t");
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_newline(void)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\n");
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag(const char *name)
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<");
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("/>");
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag_begin(const char *name)
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<");
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(">");
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag_begin1(const char *name,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr1, const char *value1)
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<");
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(" ");
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr1);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("='");
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value1);
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("'>");
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag_begin2(const char *name,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr1, const char *value1,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr2, const char *value2)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<");
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(" ");
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr1);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("=\'");
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value1);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\' ");
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr2);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("=\'");
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value2);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\'>");
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag_begin3(const char *name,
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr1, const char *value1,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr2, const char *value2,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *attr3, const char *value3)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<");
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(" ");
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr1);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("=\'");
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value1);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\' ");
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr2);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("=\'");
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value2);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\' ");
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(attr3);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("=\'");
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value3);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\'>");
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_tag_end(const char *name)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</");
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(name);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes(">");
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrace_dump_trace_close(void)
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(stream) {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writes("</trace>\n");
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fclose(stream);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stream = NULL;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      refcount = 0;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      call_no = 0;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean trace_dump_trace_begin()
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *filename;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   filename = debug_get_option("GALLIUM_TRACE", NULL);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!filename)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!stream) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stream = fopen(filename, "wt");
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(!stream)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writes("<?xml version='1.0' encoding='UTF-8'?>\n");
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writes("<?xml-stylesheet type='text/xsl' href='trace.xsl'?>\n");
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writes("<trace version='0.1'>\n");
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Linux applications rarely cleanup GL / Gallium resources so catch
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * application exit here */
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      atexit(trace_dump_trace_close);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++refcount;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean trace_dump_trace_enabled(void)
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return stream ? TRUE : FALSE;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_trace_end(void)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(stream)
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(!--refcount)
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         trace_dump_trace_close();
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Call lock
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_lock(void)
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_lock(call_mutex);
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_unlock(void)
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_unlock(call_mutex);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Dumping control
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dumping_start_locked(void)
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dumping = TRUE;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dumping_stop_locked(void)
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dumping = FALSE;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean trace_dumping_enabled_locked(void)
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dumping;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dumping_start(void)
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_lock(call_mutex);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dumping_start_locked();
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_unlock(call_mutex);
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dumping_stop(void)
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_lock(call_mutex);
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dumping_stop_locked();
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_unlock(call_mutex);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean trace_dumping_enabled(void)
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean ret;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_lock(call_mutex);
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = trace_dumping_enabled_locked();
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_unlock(call_mutex);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ret;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Dump functions
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_begin_locked(const char *klass, const char *method)
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++call_no;
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_indent(1);
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<call no=\'");
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("%lu", call_no);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\' class=\'");
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(klass);
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\' method=\'");
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(method);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("\'>");
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_newline();
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_end_locked(void)
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_indent(1);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_tag_end("call");
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_newline();
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fflush(stream);
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_begin(const char *klass, const char *method)
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_lock(call_mutex);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_call_begin_locked(klass, method);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_call_end(void)
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_call_end_locked();
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_mutex_unlock(call_mutex);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_arg_begin(const char *name)
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_indent(2);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_tag_begin1("arg", "name", name);
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_arg_end(void)
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_tag_end("arg");
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_newline();
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_ret_begin(void)
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_indent(2);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_tag_begin("ret");
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_ret_end(void)
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_tag_end("ret");
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_newline();
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_bool(int value)
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<bool>%c</bool>", value ? '1' : '0');
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_int(long long int value)
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<int>%lli</int>", value);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_uint(long long unsigned value)
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<uint>%llu</uint>", value);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_float(double value)
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<float>%g</float>", value);
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_bytes(const void *data,
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      size_t size)
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const char hex_table[16] = "0123456789ABCDEF";
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const uint8_t *p = data;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t i;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<bytes>");
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for(i = 0; i < size; ++i) {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t byte = *p++;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      char hex[2];
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hex[0] = hex_table[byte >> 4];
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hex[1] = hex_table[byte & 0xf];
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_write(hex, 2);
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</bytes>");
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_box_bytes(const void *data,
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  enum pipe_format format,
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  const struct pipe_box *box,
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned stride,
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  unsigned slice_stride)
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t size;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (slice_stride)
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = box->depth * slice_stride;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (stride)
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = util_format_get_nblocksy(format, box->height) * stride;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = util_format_get_nblocksx(format, box->width) * util_format_get_blocksize(format);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_bytes(data, size);
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_string(const char *str)
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<string>");
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(str);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</string>");
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_enum(const char *value)
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<enum>");
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_escape(value);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</enum>");
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_array_begin(void)
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<array>");
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_array_end(void)
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</array>");
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_elem_begin(void)
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<elem>");
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_elem_end(void)
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</elem>");
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_struct_begin(const char *name)
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<struct name='%s'>", name);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_struct_end(void)
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</struct>");
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_member_begin(const char *name)
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writef("<member name='%s'>", name);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_member_end(void)
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("</member>");
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_null(void)
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   trace_dump_writes("<null/>");
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_ptr(const void *value)
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(value)
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_writef("<ptr>0x%08lx</ptr>", (unsigned long)(uintptr_t)value);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_null();
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_resource_ptr(struct pipe_resource *_resource)
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_resource) {
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct trace_resource *tr_resource = trace_resource(_resource);
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_ptr(tr_resource->resource);
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_null();
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_surface_ptr(struct pipe_surface *_surface)
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_surface) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct trace_surface *tr_surf = trace_surface(_surface);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_ptr(tr_surf->surface);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_null();
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid trace_dump_transfer_ptr(struct pipe_transfer *_transfer)
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dumping)
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_transfer) {
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct trace_transfer *tr_tran = trace_transfer(_transfer);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_ptr(tr_tran->transfer);
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      trace_dump_null();
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
621