1#include "Debug.h" 2 3#include <stdarg.h> 4#include <stdio.h> 5 6 7#ifdef DEBUG 8 9unsigned st_debug = 0; 10 11static const 12struct debug_named_value st_debug_flags[] = { 13 {"oldtexops", ST_DEBUG_OLD_TEX_OPS, "oldtexops"}, 14 {"tgsi", ST_DEBUG_TGSI, "tgsi"}, 15 {NULL, 0, NULL}, 16}; 17void 18st_debug_parse(void) 19{ 20 st_debug = debug_get_flags_option("ST_DEBUG", st_debug_flags, st_debug); 21} 22 23#endif 24 25 26void 27DebugPrintf(const char *format, ...) 28{ 29 char buf[4096]; 30 31 va_list ap; 32 va_start(ap, format); 33 vsnprintf(buf, sizeof buf, format, ap); 34 va_end(ap); 35 36 OutputDebugStringA(buf); 37} 38 39 40/** 41 * Produce a human readable message from HRESULT. 42 * 43 * @sa http://msdn.microsoft.com/en-us/library/ms679351(VS.85).aspx 44 */ 45void 46CheckHResult(HRESULT hr, const char *function, unsigned line) 47{ 48 if (FAILED(hr)) { 49 LPSTR lpMessageBuffer = NULL; 50 51 FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | 52 FORMAT_MESSAGE_FROM_SYSTEM, 53 NULL, 54 hr, 55 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 56 (LPSTR)&lpMessageBuffer, 57 0, 58 NULL); 59 60 DebugPrintf("%s: %u: 0x%08lX: %s", function, line, hr, lpMessageBuffer); 61 62 LocalFree(lpMessageBuffer); 63 } 64} 65 66 67void 68AssertFail(const char *expr, 69 const char *file, 70 unsigned line, 71 const char *function) 72{ 73 DebugPrintf("%s:%u:%s: Assertion `%s' failed.\n", file, line, function, expr); 74#if defined(__GNUC__) 75 __asm("int3"); 76#elif defined(_MSC_VER) 77 __debugbreak(); 78#else 79 DebugBreak(); 80#endif 81} 82