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