u_dump_state.c revision 16f8308c3df020a786908be065d3dcb90c8ca2a5
14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**************************************************************************
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Copyright 2008-2010 VMware, Inc.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * All Rights Reserved.
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * copy of this software and associated documentation files (the
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * "Software"), to deal in the Software without restriction, including
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * the following conditions:
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * The above copyright notice and this permission notice (including the
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * of the Software.
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) **************************************************************************/
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "pipe/p_compiler.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "os/os_stream.h"
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "util/u_memory.h"
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "util/u_string.h"
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "util/u_format.h"
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "tgsi/tgsi_dump.h"
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "u_dump.h"
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Dump primitives
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static INLINE void
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_stream_writef(struct os_stream *stream, const char *format, ...)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   static char buf[1024];
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   unsigned len;
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   va_list ap;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   va_start(ap, format);
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   len = util_vsnprintf(buf, sizeof(buf), format, ap);
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   va_end(ap);
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   os_stream_write(stream, buf, len);
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_bool(struct os_stream *stream, int value)
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   util_stream_writef(stream, "%c", value ? '1' : '0');
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_int(struct os_stream *stream, long long int value)
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   util_stream_writef(stream, "%lli", value);
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_uint(struct os_stream *stream, long long unsigned value)
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   util_stream_writef(stream, "%llu", value);
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_float(struct os_stream *stream, double value)
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   util_stream_writef(stream, "%g", value);
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)util_dump_string(struct os_stream *stream, const char *str)
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   os_stream_write_str(stream, "\"");
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   os_stream_write_str(stream, str);
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   os_stream_write_str(stream, "\"");
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)util_dump_enum(struct os_stream *stream, const char *value)
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   os_stream_write_str(stream, value);
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)util_dump_array_begin(struct os_stream *stream)
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   os_stream_write_str(stream, "{");
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic void
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)util_dump_array_end(struct os_stream *stream)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   os_stream_write_str(stream, "}");
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)util_dump_elem_begin(struct os_stream *stream)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)util_dump_elem_end(struct os_stream *stream)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   os_stream_write_str(stream, ", ");
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static void
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)util_dump_struct_begin(struct os_stream *stream, const char *name)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles){
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   os_stream_write_str(stream, "{");
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_struct_end(struct os_stream *stream)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   os_stream_write_str(stream, "}");
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_member_begin(struct os_stream *stream, const char *name)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   util_stream_writef(stream, "%s = ", name);
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)util_dump_member_end(struct os_stream *stream)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   os_stream_write_str(stream, ", ");
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)util_dump_null(struct os_stream *stream)
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   os_stream_write_str(stream, "NULL");
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)util_dump_ptr(struct os_stream *stream, const void *value)
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if(value)
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      util_stream_writef(stream, "0x%08lx", (unsigned long)(uintptr_t)value);
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   else
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      util_dump_null(stream);
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Code saving macros.
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define util_dump_arg(_stream, _type, _arg) \
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   do { \
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_arg_begin(_stream, #_arg); \
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_##_type(_stream, _arg); \
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_arg_end(_stream); \
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   } while(0)
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define util_dump_ret(_stream, _type, _arg) \
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   do { \
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_ret_begin(_stream); \
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util_dump_##_type(_stream, _arg); \
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util_dump_ret_end(_stream); \
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   } while(0)
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define util_dump_array(_stream, _type, _obj, _size) \
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   do { \
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      size_t idx; \
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util_dump_array_begin(_stream); \
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for(idx = 0; idx < (_size); ++idx) { \
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         util_dump_elem_begin(_stream); \
1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch         util_dump_##_type(_stream, (_obj)[idx]); \
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch         util_dump_elem_end(_stream); \
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      } \
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      util_dump_array_end(_stream); \
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   } while(0)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define util_dump_struct_array(_stream, _type, _obj, _size) \
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   do { \
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      size_t idx; \
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      util_dump_array_begin(_stream); \
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for(idx = 0; idx < (_size); ++idx) { \
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         util_dump_elem_begin(_stream); \
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         util_dump_##_type(_stream, &(_obj)[idx]); \
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         util_dump_elem_end(_stream); \
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      } \
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      util_dump_array_end(_stream); \
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   } while(0)
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define util_dump_member(_stream, _type, _obj, _member) \
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   do { \
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_member_begin(_stream, #_member); \
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_##_type(_stream, (_obj)->_member); \
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_member_end(_stream); \
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   } while(0)
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define util_dump_arg_array(_stream, _type, _arg, _size) \
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   do { \
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_arg_begin(_stream, #_arg); \
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_array(_stream, _type, _arg, _size); \
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_arg_end(_stream); \
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   } while(0)
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define util_dump_member_array(_stream, _type, _obj, _member) \
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   do { \
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      util_dump_member_begin(_stream, #_member); \
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      util_dump_array(_stream, _type, (_obj)->_member, sizeof((_obj)->_member)/sizeof((_obj)->_member[0])); \
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      util_dump_member_end(_stream); \
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   } while(0)
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/*
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Wrappers for enum -> string dumpers.
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)util_dump_format(struct os_stream *stream, enum pipe_format format)
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   util_dump_enum(stream, util_format_name(format));
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)util_dump_enum_blend_factor(struct os_stream *stream, unsigned value)
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles){
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   util_dump_enum(stream, util_dump_blend_factor(value, TRUE));
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static void
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)util_dump_enum_blend_func(struct os_stream *stream, unsigned value)
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   util_dump_enum(stream, util_dump_blend_func(value, TRUE));
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static void
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)util_dump_enum_func(struct os_stream *stream, unsigned value)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   util_dump_enum(stream, util_dump_func(value, TRUE));
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/*
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Public functions
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochutil_dump_template(struct os_stream *stream, const struct pipe_resource *templat)
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   if(!templat) {
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      util_dump_null(stream);
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
265   util_dump_struct_begin(stream, "pipe_resource");
266
267   util_dump_member(stream, int, templat, target);
268   util_dump_member(stream, format, templat, format);
269
270   util_dump_member_begin(stream, "width");
271   util_dump_uint(stream, templat->width0);
272   util_dump_member_end(stream);
273
274   util_dump_member_begin(stream, "height");
275   util_dump_uint(stream, templat->height0);
276   util_dump_member_end(stream);
277
278   util_dump_member_begin(stream, "depth");
279   util_dump_uint(stream, templat->depth0);
280   util_dump_member_end(stream);
281
282   util_dump_member_begin(stream, "array_size");
283   util_dump_uint(stream, templat->array_size);
284   util_dump_member_end(stream);
285
286   util_dump_member(stream, uint, templat, last_level);
287   util_dump_member(stream, uint, templat, usage);
288   util_dump_member(stream, uint, templat, bind);
289   util_dump_member(stream, uint, templat, flags);
290
291   util_dump_struct_end(stream);
292}
293
294
295void
296util_dump_rasterizer_state(struct os_stream *stream, const struct pipe_rasterizer_state *state)
297{
298   if(!state) {
299      util_dump_null(stream);
300      return;
301   }
302
303   util_dump_struct_begin(stream, "pipe_rasterizer_state");
304
305   util_dump_member(stream, bool, state, flatshade);
306   util_dump_member(stream, bool, state, light_twoside);
307   util_dump_member(stream, uint, state, front_ccw);
308   util_dump_member(stream, uint, state, cull_face);
309   util_dump_member(stream, uint, state, fill_front);
310   util_dump_member(stream, uint, state, fill_back);
311   util_dump_member(stream, bool, state, offset_point);
312   util_dump_member(stream, bool, state, offset_line);
313   util_dump_member(stream, bool, state, offset_tri);
314   util_dump_member(stream, bool, state, scissor);
315   util_dump_member(stream, bool, state, poly_smooth);
316   util_dump_member(stream, bool, state, poly_stipple_enable);
317   util_dump_member(stream, bool, state, point_smooth);
318   util_dump_member(stream, uint, state, sprite_coord_enable);
319   util_dump_member(stream, bool, state, sprite_coord_mode);
320   util_dump_member(stream, bool, state, point_quad_rasterization);
321   util_dump_member(stream, bool, state, point_size_per_vertex);
322   util_dump_member(stream, bool, state, multisample);
323   util_dump_member(stream, bool, state, line_smooth);
324   util_dump_member(stream, bool, state, line_stipple_enable);
325   util_dump_member(stream, uint, state, line_stipple_factor);
326   util_dump_member(stream, uint, state, line_stipple_pattern);
327   util_dump_member(stream, bool, state, line_last_pixel);
328   util_dump_member(stream, bool, state, flatshade_first);
329   util_dump_member(stream, bool, state, gl_rasterization_rules);
330
331   util_dump_member(stream, float, state, line_width);
332   util_dump_member(stream, float, state, point_size);
333   util_dump_member(stream, float, state, offset_units);
334   util_dump_member(stream, float, state, offset_scale);
335   util_dump_member(stream, float, state, offset_clamp);
336
337   util_dump_struct_end(stream);
338}
339
340
341void
342util_dump_poly_stipple(struct os_stream *stream, const struct pipe_poly_stipple *state)
343{
344   if(!state) {
345      util_dump_null(stream);
346      return;
347   }
348
349   util_dump_struct_begin(stream, "pipe_poly_stipple");
350
351   util_dump_member_begin(stream, "stipple");
352   util_dump_member_array(stream, uint, state, stipple);
353   util_dump_member_end(stream);
354
355   util_dump_struct_end(stream);
356}
357
358
359void
360util_dump_viewport_state(struct os_stream *stream, const struct pipe_viewport_state *state)
361{
362   if(!state) {
363      util_dump_null(stream);
364      return;
365   }
366
367   util_dump_struct_begin(stream, "pipe_viewport_state");
368
369   util_dump_member_array(stream, float, state, scale);
370   util_dump_member_array(stream, float, state, translate);
371
372   util_dump_struct_end(stream);
373}
374
375
376void
377util_dump_scissor_state(struct os_stream *stream, const struct pipe_scissor_state *state)
378{
379   if(!state) {
380      util_dump_null(stream);
381      return;
382   }
383
384   util_dump_struct_begin(stream, "pipe_scissor_state");
385
386   util_dump_member(stream, uint, state, minx);
387   util_dump_member(stream, uint, state, miny);
388   util_dump_member(stream, uint, state, maxx);
389   util_dump_member(stream, uint, state, maxy);
390
391   util_dump_struct_end(stream);
392}
393
394
395void
396util_dump_clip_state(struct os_stream *stream, const struct pipe_clip_state *state)
397{
398   unsigned i;
399
400   if(!state) {
401      util_dump_null(stream);
402      return;
403   }
404
405   util_dump_struct_begin(stream, "pipe_clip_state");
406
407   util_dump_member_begin(stream, "ucp");
408   util_dump_array_begin(stream);
409   for(i = 0; i < PIPE_MAX_CLIP_PLANES; ++i) {
410      util_dump_elem_begin(stream);
411      util_dump_array(stream, float, state->ucp[i], 4);
412      util_dump_elem_end(stream);
413   }
414   util_dump_array_end(stream);
415   util_dump_member_end(stream);
416
417   util_dump_member(stream, uint, state, nr);
418
419   util_dump_struct_end(stream);
420}
421
422
423void
424util_dump_shader_state(struct os_stream *stream, const struct pipe_shader_state *state)
425{
426   char str[8192];
427
428   if(!state) {
429      util_dump_null(stream);
430      return;
431   }
432
433   tgsi_dump_str(state->tokens, 0, str, sizeof(str));
434
435   util_dump_struct_begin(stream, "pipe_shader_state");
436
437   util_dump_member_begin(stream, "tokens");
438   util_dump_string(stream, str);
439   util_dump_member_end(stream);
440
441   util_dump_struct_end(stream);
442}
443
444
445void
446util_dump_depth_stencil_alpha_state(struct os_stream *stream, const struct pipe_depth_stencil_alpha_state *state)
447{
448   unsigned i;
449
450   if(!state) {
451      util_dump_null(stream);
452      return;
453   }
454
455   util_dump_struct_begin(stream, "pipe_depth_stencil_alpha_state");
456
457   util_dump_member_begin(stream, "depth");
458   util_dump_struct_begin(stream, "pipe_depth_state");
459   util_dump_member(stream, bool, &state->depth, enabled);
460   if (state->depth.enabled) {
461      util_dump_member(stream, bool, &state->depth, writemask);
462      util_dump_member(stream, enum_func, &state->depth, func);
463   }
464   util_dump_struct_end(stream);
465   util_dump_member_end(stream);
466
467   util_dump_member_begin(stream, "stencil");
468   util_dump_array_begin(stream);
469   for(i = 0; i < Elements(state->stencil); ++i) {
470      util_dump_elem_begin(stream);
471      util_dump_struct_begin(stream, "pipe_stencil_state");
472      util_dump_member(stream, bool, &state->stencil[i], enabled);
473      if (state->stencil[i].enabled) {
474         util_dump_member(stream, enum_func, &state->stencil[i], func);
475         util_dump_member(stream, uint, &state->stencil[i], fail_op);
476         util_dump_member(stream, uint, &state->stencil[i], zpass_op);
477         util_dump_member(stream, uint, &state->stencil[i], zfail_op);
478         util_dump_member(stream, uint, &state->stencil[i], valuemask);
479         util_dump_member(stream, uint, &state->stencil[i], writemask);
480      }
481      util_dump_struct_end(stream);
482      util_dump_elem_end(stream);
483   }
484   util_dump_array_end(stream);
485   util_dump_member_end(stream);
486
487   util_dump_member_begin(stream, "alpha");
488   util_dump_struct_begin(stream, "pipe_alpha_state");
489   util_dump_member(stream, bool, &state->alpha, enabled);
490   if (state->alpha.enabled) {
491      util_dump_member(stream, enum_func, &state->alpha, func);
492      util_dump_member(stream, float, &state->alpha, ref_value);
493   }
494   util_dump_struct_end(stream);
495   util_dump_member_end(stream);
496
497   util_dump_struct_end(stream);
498}
499
500void
501util_dump_rt_blend_state(struct os_stream *stream, const struct pipe_rt_blend_state *state)
502{
503   util_dump_struct_begin(stream, "pipe_rt_blend_state");
504
505   util_dump_member(stream, uint, state, blend_enable);
506   if (state->blend_enable) {
507      util_dump_member(stream, enum_blend_func, state, rgb_func);
508      util_dump_member(stream, enum_blend_factor, state, rgb_src_factor);
509      util_dump_member(stream, enum_blend_factor, state, rgb_dst_factor);
510
511      util_dump_member(stream, enum_blend_func, state, alpha_func);
512      util_dump_member(stream, enum_blend_factor, state, alpha_src_factor);
513      util_dump_member(stream, enum_blend_factor, state, alpha_dst_factor);
514   }
515
516   util_dump_member(stream, uint, state, colormask);
517
518   util_dump_struct_end(stream);
519}
520
521void
522util_dump_blend_state(struct os_stream *stream, const struct pipe_blend_state *state)
523{
524   unsigned valid_entries = 1;
525
526   if(!state) {
527      util_dump_null(stream);
528      return;
529   }
530
531   util_dump_struct_begin(stream, "pipe_blend_state");
532
533   util_dump_member(stream, bool, state, dither);
534
535   util_dump_member(stream, bool, state, logicop_enable);
536   if (state->logicop_enable) {
537      util_dump_member(stream, enum_func, state, logicop_func);
538   }
539   else {
540      util_dump_member(stream, bool, state, independent_blend_enable);
541
542      util_dump_member_begin(stream, "rt");
543      if (state->independent_blend_enable)
544         valid_entries = PIPE_MAX_COLOR_BUFS;
545      util_dump_struct_array(stream, rt_blend_state, state->rt, valid_entries);
546      util_dump_member_end(stream);
547   }
548
549   util_dump_struct_end(stream);
550}
551
552
553void
554util_dump_blend_color(struct os_stream *stream, const struct pipe_blend_color *state)
555{
556   if(!state) {
557      util_dump_null(stream);
558      return;
559   }
560
561   util_dump_struct_begin(stream, "pipe_blend_color");
562
563   util_dump_member_array(stream, float, state, color);
564
565   util_dump_struct_end(stream);
566}
567
568void
569util_dump_stencil_ref(struct os_stream *stream, const struct pipe_stencil_ref *state)
570{
571   if(!state) {
572      util_dump_null(stream);
573      return;
574   }
575
576   util_dump_struct_begin(stream, "pipe_stencil_ref");
577
578   util_dump_member_array(stream, uint, state, ref_value);
579
580   util_dump_struct_end(stream);
581}
582
583void
584util_dump_framebuffer_state(struct os_stream *stream, const struct pipe_framebuffer_state *state)
585{
586   util_dump_struct_begin(stream, "pipe_framebuffer_state");
587
588   util_dump_member(stream, uint, state, width);
589   util_dump_member(stream, uint, state, height);
590   util_dump_member(stream, uint, state, nr_cbufs);
591   util_dump_member_array(stream, ptr, state, cbufs);
592   util_dump_member(stream, ptr, state, zsbuf);
593
594   util_dump_struct_end(stream);
595}
596
597
598void
599util_dump_sampler_state(struct os_stream *stream, const struct pipe_sampler_state *state)
600{
601   if(!state) {
602      util_dump_null(stream);
603      return;
604   }
605
606   util_dump_struct_begin(stream, "pipe_sampler_state");
607
608   util_dump_member(stream, uint, state, wrap_s);
609   util_dump_member(stream, uint, state, wrap_t);
610   util_dump_member(stream, uint, state, wrap_r);
611   util_dump_member(stream, uint, state, min_img_filter);
612   util_dump_member(stream, uint, state, min_mip_filter);
613   util_dump_member(stream, uint, state, mag_img_filter);
614   util_dump_member(stream, uint, state, compare_mode);
615   util_dump_member(stream, enum_func, state, compare_func);
616   util_dump_member(stream, bool, state, normalized_coords);
617   util_dump_member(stream, uint, state, max_anisotropy);
618   util_dump_member(stream, float, state, lod_bias);
619   util_dump_member(stream, float, state, min_lod);
620   util_dump_member(stream, float, state, max_lod);
621   util_dump_member_array(stream, float, state, border_color.f);
622
623   util_dump_struct_end(stream);
624}
625
626
627void
628util_dump_surface(struct os_stream *stream, const struct pipe_surface *state)
629{
630   if(!state) {
631      util_dump_null(stream);
632      return;
633   }
634
635   util_dump_struct_begin(stream, "pipe_surface");
636
637   util_dump_member(stream, format, state, format);
638   util_dump_member(stream, uint, state, width);
639   util_dump_member(stream, uint, state, height);
640
641   util_dump_member(stream, uint, state, usage);
642
643   util_dump_member(stream, ptr, state, texture);
644   util_dump_member(stream, uint, state, u.tex.level);
645   util_dump_member(stream, uint, state, u.tex.first_layer);
646   util_dump_member(stream, uint, state, u.tex.last_layer);
647
648   util_dump_struct_end(stream);
649}
650
651
652void
653util_dump_transfer(struct os_stream *stream, const struct pipe_transfer *state)
654{
655   if(!state) {
656      util_dump_null(stream);
657      return;
658   }
659
660   util_dump_struct_begin(stream, "pipe_transfer");
661
662   util_dump_member(stream, ptr, state, resource);
663   /*util_dump_member(stream, uint, state, box);*/
664
665   util_dump_member(stream, uint, state, stride);
666   util_dump_member(stream, uint, state, layer_stride);
667
668   /*util_dump_member(stream, ptr, state, data);*/
669
670   util_dump_struct_end(stream);
671}
672
673
674void
675util_dump_vertex_buffer(struct os_stream *stream, const struct pipe_vertex_buffer *state)
676{
677   if(!state) {
678      util_dump_null(stream);
679      return;
680   }
681
682   util_dump_struct_begin(stream, "pipe_vertex_buffer");
683
684   util_dump_member(stream, uint, state, stride);
685   util_dump_member(stream, uint, state, buffer_offset);
686   util_dump_member(stream, ptr, state, buffer);
687
688   util_dump_struct_end(stream);
689}
690
691
692void
693util_dump_vertex_element(struct os_stream *stream, const struct pipe_vertex_element *state)
694{
695   if(!state) {
696      util_dump_null(stream);
697      return;
698   }
699
700   util_dump_struct_begin(stream, "pipe_vertex_element");
701
702   util_dump_member(stream, uint, state, src_offset);
703
704   util_dump_member(stream, uint, state, vertex_buffer_index);
705
706   util_dump_member(stream, format, state, src_format);
707
708   util_dump_struct_end(stream);
709}
710