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