Skip to content

Latest commit

 

History

History
248 lines (215 loc) · 6.7 KB

finderrors.c

File metadata and controls

248 lines (215 loc) · 6.7 KB
 
Apr 29, 2008
Apr 29, 2008
1
2
3
4
5
6
7
8
9
/**
* MojoShader; generate shader programs from bytecode of compiled
* Direct3D shaders.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <sys/types.h>
#include <errno.h>
#include "mojoshader.h"
Apr 22, 2008
Apr 22, 2008
19
20
#if FINDERRORS_COMPILE_SHADERS
#include "SDL.h"
Feb 21, 2014
Feb 21, 2014
21
static SDL_Window *sdlwindow = NULL;
Mar 31, 2010
Mar 31, 2010
22
23
24
25
26
static void *lookup(const char *fnname, void *unused)
{
(void) unused;
return SDL_GL_GetProcAddress(fnname);
} // lookup
Apr 22, 2008
Apr 22, 2008
27
28
#endif
Apr 30, 2008
Apr 30, 2008
29
#ifdef _MSC_VER
Apr 30, 2008
Apr 30, 2008
30
31
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
Apr 30, 2008
Apr 30, 2008
32
#include <malloc.h> // for alloca().
Apr 30, 2008
Apr 30, 2008
33
#define snprintf _snprintf
Apr 30, 2008
Apr 30, 2008
34
35
#else
#include <dirent.h>
Apr 30, 2008
Apr 30, 2008
36
37
#endif
Apr 22, 2008
Apr 22, 2008
38
#define report printf
Apr 22, 2008
Apr 22, 2008
39
Apr 30, 2008
Apr 30, 2008
40
41
42
43
44
45
46
47
48
49
50
static int do_file(const char *profile, const char *dname, const char *fn, int *total)
{
int do_quit = 0;
#if FINDERRORS_COMPILE_SHADERS
SDL_Event e; // pump event queue to keep OS happy.
while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
do_quit = 1;
} // while
Feb 21, 2014
Feb 21, 2014
51
SDL_GL_SwapWindow(sdlwindow);
Apr 30, 2008
Apr 30, 2008
52
53
54
55
56
57
58
59
#endif
if (do_quit)
{
report("FAIL: user requested quit!\n");
return 0;
} // if
Dec 12, 2008
Dec 12, 2008
60
61
int assembly = 0;
if (strstr(fn, ".bytecode") != NULL)
Dec 13, 2008
Dec 13, 2008
62
assembly = 0;
Dec 12, 2008
Dec 12, 2008
63
64
65
else if (strstr(fn, ".disasm") != NULL)
assembly = 1;
else
Apr 30, 2008
Apr 30, 2008
66
67
68
69
return 1;
(*total)++;
Feb 25, 2014
Feb 25, 2014
70
char *fname = (char *) alloca(strlen(fn) + strlen(dname) + 2);
Apr 30, 2008
Apr 30, 2008
71
72
73
74
75
76
77
78
79
sprintf(fname, "%s/%s", dname, fn);
FILE *io = fopen(fname, "rb");
if (io == NULL)
{
report("FAIL: %s fopen() failed.\n", fname);
return 1;
} // if
static unsigned char buf[1024 * 256];
Feb 11, 2009
Feb 11, 2009
80
int rc = fread(buf, 1, sizeof (buf), io);
Apr 30, 2008
Apr 30, 2008
81
82
83
84
85
86
87
fclose(io);
if (rc == -1)
{
report("FAIL: %s %s\n", fname, strerror(errno));
return 1;
} // if
Dec 12, 2008
Dec 12, 2008
88
89
90
91
if (assembly)
{
const MOJOSHADER_parseData *a;
Dec 12, 2008
Dec 12, 2008
92
buf[rc] = '\0'; // make sure the source is null-terminated.
Feb 12, 2009
Feb 12, 2009
93
a = MOJOSHADER_assemble(fname, (char *) buf, rc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
Feb 11, 2009
Feb 11, 2009
94
Feb 3, 2009
Feb 3, 2009
95
if (a->error_count > 0)
Dec 12, 2008
Dec 12, 2008
96
{
Feb 12, 2009
Feb 12, 2009
97
98
99
100
report("FAIL: %s (line %d) %s\n",
a->errors[0].filename ? a->errors[0].filename : "???",
a->errors[0].error_position,
a->errors[0].error);
Dec 12, 2008
Dec 12, 2008
101
102
103
104
105
106
107
108
109
110
111
112
113
114
return 1;
} // if
else if (a->output_len > sizeof (buf))
{
report("FAIL: %s buffer overflow in finderrors.c\n", fname);
return 1;
} // if
rc = a->output_len;
memcpy(buf, a->output, rc);
MOJOSHADER_freeParseData(a);
} // if
Apr 30, 2008
Apr 30, 2008
115
#if FINDERRORS_COMPILE_SHADERS
May 29, 2012
May 29, 2012
116
MOJOSHADER_glShader *shader = MOJOSHADER_glCompileShader(buf, rc, NULL, 0, NULL, 0);
Apr 30, 2008
Apr 30, 2008
117
118
119
if (shader == NULL)
report("FAIL: %s %s\n", fname, MOJOSHADER_glGetError());
else
Jul 31, 2008
Jul 31, 2008
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{
const MOJOSHADER_parseData *pd = MOJOSHADER_glGetShaderParseData(shader);
MOJOSHADER_glShader *v = (pd->shader_type == MOJOSHADER_TYPE_VERTEX) ? shader : NULL;
MOJOSHADER_glShader *p = (pd->shader_type == MOJOSHADER_TYPE_PIXEL) ? shader : NULL;
MOJOSHADER_glProgram *program = MOJOSHADER_glLinkProgram(v, p);
if (program == NULL)
report("FAIL: %s %s\n", fname, MOJOSHADER_glGetError());
else
{
report("PASS: %s\n", fname);
MOJOSHADER_glDeleteProgram(program);
} // else
MOJOSHADER_glDeleteShader(shader);
}
Apr 30, 2008
Apr 30, 2008
134
#else
Nov 2, 2012
Nov 2, 2012
135
const MOJOSHADER_parseData *pd = MOJOSHADER_parse(profile, buf, rc, NULL, 0, NULL, 0, NULL, NULL, NULL);
Nov 19, 2010
Nov 19, 2010
136
if (pd->error_count == 0)
Apr 30, 2008
Apr 30, 2008
137
report("PASS: %s\n", fname);
Nov 19, 2010
Nov 19, 2010
138
139
140
141
142
143
144
145
146
else
{
int i;
for (i = 0; i < pd->error_count; i++)
{
report("FAIL: %s (position %d) %s\n", pd->errors[i].filename,
pd->errors[i].error_position, pd->errors[i].error);
} // for
} // else
Apr 30, 2008
Apr 30, 2008
147
148
149
150
151
152
153
MOJOSHADER_freeParseData(pd);
#endif
return 1;
} // do_file
Apr 22, 2008
Apr 22, 2008
154
static int do_dir(const char *dname, const char *profile)
155
156
{
int total = 0;
Apr 30, 2008
Apr 30, 2008
157
158
#ifdef _MSC_VER
Feb 25, 2014
Feb 25, 2014
159
160
161
162
163
164
const size_t wildcardlen = strlen(dname) + 3;
char *wildcard = (char *) alloca(wildcardlen);
SDL_snprintf(wildcard, wildcardlen, "%s\\*", dname);
WIN32_FIND_DATAA dent;
HANDLE dirp = FindFirstFileA(wildcard, &dent);
Apr 30, 2008
Apr 30, 2008
165
166
167
168
169
170
if (dirp != INVALID_HANDLE_VALUE)
{
do
{
if (!do_file(profile, dname, dent.cFileName, &total))
break;
Apr 30, 2008
Apr 30, 2008
171
} while (FindNextFileA(dirp, &dent) != 0);
Feb 25, 2014
Feb 25, 2014
172
FindClose(dirp);
Apr 30, 2008
Apr 30, 2008
173
174
175
} // if
#else
struct dirent *dent = NULL;
176
177
178
179
180
DIR *dirp = opendir(dname);
if (dirp != NULL)
{
while ((dent = readdir(dirp)) != NULL)
{
Apr 30, 2008
Apr 30, 2008
181
if (!do_file(profile, dname, dent->d_name, &total))
Apr 22, 2008
Apr 22, 2008
182
break;
183
184
185
} // while
closedir(dirp);
} // if
Apr 30, 2008
Apr 30, 2008
186
#endif
187
188
189
190
191
192
193
194
return total;
} // do_dir
int main(int argc, char **argv)
{
//printf("MojoShader finderrors\n");
Mar 24, 2010
Mar 24, 2010
195
196
//printf("Compiled against changeset %s\n", MOJOSHADER_CHANGESET);
//printf("Linked against changeset %s\n", MOJOSHADER_changeset());
197
198
199
200
201
202
//printf("\n");
if (argc <= 2)
printf("\n\nUSAGE: %s <profile> [dir1] ... [dirN]\n\n", argv[0]);
else
{
Feb 21, 2014
Feb 21, 2014
203
int okay = 0;
204
int total = 0;
Apr 22, 2008
Apr 22, 2008
205
int i;
Apr 27, 2008
Apr 27, 2008
206
const char *profile = argv[1];
207
Apr 22, 2008
Apr 22, 2008
208
#if FINDERRORS_COMPILE_SHADERS
Feb 21, 2014
Feb 21, 2014
209
210
211
212
213
214
215
216
217
218
219
220
MOJOSHADER_glContext *ctx = NULL;
if (SDL_Init(SDL_INIT_VIDEO) == -1)
fprintf(stderr, "SDL_Init() error: %s\n", SDL_GetError());
else if (SDL_GL_LoadLibrary(NULL) == -1)
fprintf(stderr, "SDL_GL_LoadLibrary() error: %s\n", SDL_GetError());
else if ((sdlwindow = SDL_CreateWindow(argv[0], SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL)) == NULL)
fprintf(stderr, "SDL_CreateWindow() error: %s\n", SDL_GetError());
else if (SDL_GL_CreateContext(sdlwindow) == NULL)
fprintf(stderr, "SDL_GL_CreateContext() error: %s\n", SDL_GetError());
else if ((ctx = MOJOSHADER_glCreateContext(profile, lookup, 0, 0, 0, 0)) == NULL)
fprintf(stderr, "MOJOSHADER_glCreateContext() fail: %s\n", MOJOSHADER_glGetError());
else
Apr 27, 2008
Apr 27, 2008
221
{
Feb 21, 2014
Feb 21, 2014
222
223
224
225
226
227
printf("Best profile is '%s'\n", MOJOSHADER_glBestProfile(lookup, 0, NULL, NULL, NULL));
MOJOSHADER_glMakeContextCurrent(ctx);
okay = 1;
}
#else
okay = 1;
Apr 22, 2008
Apr 22, 2008
228
229
#endif
Feb 21, 2014
Feb 21, 2014
230
231
232
233
234
235
if (okay)
{
for (i = 2; i < argc; i++)
total += do_dir(argv[i], profile);
printf("Saw %d files.\n", total);
} // if
236
Apr 22, 2008
Apr 22, 2008
237
#if FINDERRORS_COMPILE_SHADERS
Feb 21, 2014
Feb 21, 2014
238
239
if (ctx)
MOJOSHADER_glDestroyContext(ctx);
Apr 22, 2008
Apr 22, 2008
240
241
SDL_Quit();
#endif
242
243
244
245
246
247
} // else
return 0;
} // main
// end of finderrors.c ...