mesa: additional debug flags for glsl debug/disassembly
[mesa.git] / src / mesa / shader / slang / slang_log.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.5.3
4 *
5 * Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 #include "main/imports.h"
26 #include "main/context.h"
27 #include "slang_log.h"
28 #include "slang_utility.h"
29
30
31
32 static char *out_of_memory = "Error: Out of memory.\n";
33
34 void
35 slang_info_log_construct(slang_info_log * log)
36 {
37 log->text = NULL;
38 log->dont_free_text = GL_FALSE;
39 log->error_flag = GL_FALSE;
40 }
41
42 void
43 slang_info_log_destruct(slang_info_log * log)
44 {
45 if (!log->dont_free_text)
46 #if 0
47 slang_alloc_free(log->text);
48 #else
49 _mesa_free(log->text);
50 #endif
51 }
52
53 static int
54 slang_info_log_message(slang_info_log * log, const char *prefix,
55 const char *msg)
56 {
57 GLuint size;
58
59 if (log->dont_free_text)
60 return 0;
61 size = slang_string_length(msg) + 2;
62 if (prefix != NULL)
63 size += slang_string_length(prefix) + 2;
64 if (log->text != NULL) {
65 GLuint old_len = slang_string_length(log->text);
66 log->text = (char *)
67 #if 0
68 slang_alloc_realloc(log->text, old_len + 1, old_len + size);
69 #else
70 _mesa_realloc(log->text, old_len + 1, old_len + size);
71 #endif
72 }
73 else {
74 #if 0
75 log->text = (char *) (slang_alloc_malloc(size));
76 #else
77 log->text = (char *) (_mesa_malloc(size));
78 #endif
79 if (log->text != NULL)
80 log->text[0] = '\0';
81 }
82 if (log->text == NULL)
83 return 0;
84 if (prefix != NULL) {
85 slang_string_concat(log->text, prefix);
86 slang_string_concat(log->text, ": ");
87 }
88 slang_string_concat(log->text, msg);
89 slang_string_concat(log->text, "\n");
90
91 if (MESA_VERBOSE & VERBOSE_GLSL) {
92 _mesa_printf("Mesa: GLSL %s\n", log->text);
93 }
94
95 return 1;
96 }
97
98 int
99 slang_info_log_print(slang_info_log * log, const char *msg, ...)
100 {
101 va_list va;
102 char buf[1024];
103
104 va_start(va, msg);
105 _mesa_vsprintf(buf, msg, va);
106 va_end(va);
107 return slang_info_log_message(log, NULL, buf);
108 }
109
110 int
111 slang_info_log_error(slang_info_log * log, const char *msg, ...)
112 {
113 va_list va;
114 char buf[1024];
115
116 va_start(va, msg);
117 _mesa_vsprintf(buf, msg, va);
118 va_end(va);
119 log->error_flag = GL_TRUE;
120 if (slang_info_log_message(log, "Error", buf))
121 return 1;
122 slang_info_log_memory(log);
123 return 0;
124 }
125
126 int
127 slang_info_log_warning(slang_info_log * log, const char *msg, ...)
128 {
129 va_list va;
130 char buf[1024];
131
132 va_start(va, msg);
133 _mesa_vsprintf(buf, msg, va);
134 va_end(va);
135 if (slang_info_log_message(log, "Warning", buf))
136 return 1;
137 slang_info_log_memory(log);
138 return 0;
139 }
140
141 void
142 slang_info_log_memory(slang_info_log * log)
143 {
144 if (!slang_info_log_message(log, "Error", "Out of memory.")) {
145 log->dont_free_text = GL_TRUE;
146 log->error_flag = GL_TRUE;
147 log->text = out_of_memory;
148 }
149 }