author | Ryan C. Gordon <icculus@icculus.org> |
Wed, 16 Apr 2008 17:58:11 -0400 | |
branch | trunk |
changeset 130 | e2eeb1f1c902 |
parent 113 | 8ebf445c5305 |
child 142 | e064b4cefb4e |
permissions | -rw-r--r-- |
7 | 1 |
#include <stdio.h> |
9 | 2 |
#include <stdlib.h> |
37 | 3 |
#include "mojoshader.h" |
7 | 4 |
|
46 | 5 |
|
50 | 6 |
#if MOJOSHADER_DEBUG_MALLOC |
46 | 7 |
static void *Malloc(int len) |
8 |
{ |
|
9 |
void *ptr = malloc(len + sizeof (int)); |
|
10 |
int *store = (int *) ptr; |
|
11 |
printf("malloc() %d bytes (%p)\n", len, ptr); |
|
12 |
if (ptr == NULL) return NULL; |
|
13 |
*store = len; |
|
14 |
return (void *) (store + 1); |
|
15 |
} // Malloc |
|
16 |
||
17 |
||
18 |
static void Free(void *_ptr) |
|
19 |
{ |
|
50 | 20 |
int *ptr = (((int *) _ptr) - 1); |
21 |
int len = *ptr; |
|
46 | 22 |
printf("free() %d bytes (%p)\n", len, ptr); |
23 |
free(ptr); |
|
24 |
} // Free |
|
25 |
#else |
|
26 |
#define Malloc NULL |
|
27 |
#define Free NULL |
|
28 |
#endif |
|
29 |
||
48 | 30 |
static const char *shader_type(const MOJOSHADER_shaderType s) |
46 | 31 |
{ |
32 |
switch (s) |
|
33 |
{ |
|
34 |
case MOJOSHADER_TYPE_UNKNOWN: return "unknown"; |
|
35 |
case MOJOSHADER_TYPE_PIXEL: return "pixel"; |
|
36 |
case MOJOSHADER_TYPE_VERTEX: return "vertex"; |
|
37 |
case MOJOSHADER_TYPE_GEOMETRY: return "geometry"; |
|
48 | 38 |
default: return "(bogus value?)"; |
46 | 39 |
} // switch |
40 |
||
48 | 41 |
return NULL; // shouldn't hit this. |
46 | 42 |
} // shader_type |
43 |
||
44 |
||
53 | 45 |
static void do_parse(const unsigned char *buf, const int len, const char *prof) |
46 | 46 |
{ |
47 |
const MOJOSHADER_parseData *pd; |
|
48 |
||
97
4a41e3d17297
Allow instance data to be passed to the allocator.
Ryan C. Gordon <icculus@icculus.org>
parents:
94
diff
changeset
|
49 |
pd = MOJOSHADER_parse(prof, buf, len, Malloc, Free, NULL); |
46 | 50 |
printf("PROFILE: %s\n", prof); |
51 |
if (pd->error != NULL) |
|
52 |
printf("ERROR: %s\n", pd->error); |
|
53 | 53 |
else |
54 |
{ |
|
55 |
printf("SHADER TYPE: %s\n", shader_type(pd->shader_type)); |
|
56 |
printf("VERSION: %d.%d\n", pd->major_ver, pd->minor_ver); |
|
57 |
printf("INSTRUCTION COUNT: %d\n", (int) pd->instruction_count); |
|
100
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
58 |
|
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
59 |
printf("ATTRIBUTES:"); |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
60 |
if (pd->attribute_count == 0) |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
61 |
printf(" (none.)\n"); |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
62 |
else |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
63 |
{ |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
64 |
int i; |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
65 |
printf("\n"); |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
66 |
for (i = 0; i < pd->attribute_count; i++) |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
67 |
{ |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
68 |
static const char *usagenames[] = { |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
69 |
"position", "blendweight", "blendindices", "normal", |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
70 |
"psize", "texcoord", "tangent", "binormal", "tessfactor", |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
71 |
"positiont", "color", "fog", "depth", "sample" |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
72 |
}; |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
73 |
const MOJOSHADER_attribute *a = &pd->attributes[i]; |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
74 |
char numstr[16] = { 0 }; |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
75 |
if (a->index != 0) |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
76 |
snprintf(numstr, sizeof (numstr), "%d", a->index); |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
77 |
printf(" * %s%s\n", usagenames[(int) a->usage], numstr); |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
78 |
} // for |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
79 |
} // else |
2b88649b6f98
First shot at attributes reporting API.
Ryan C. Gordon <icculus@icculus.org>
parents:
97
diff
changeset
|
80 |
|
92
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
81 |
printf("UNIFORMS:"); |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
82 |
if (pd->uniform_count == 0) |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
83 |
printf(" (none.)\n"); |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
84 |
else |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
85 |
{ |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
86 |
int i; |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
87 |
printf("\n"); |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
88 |
for (i = 0; i < pd->uniform_count; i++) |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
89 |
{ |
94
57adfb4769a0
Simplifed public uniform information.
Ryan C. Gordon <icculus@icculus.org>
parents:
92
diff
changeset
|
90 |
static const char *typenames[] = { "float", "int", "bool" }; |
92
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
91 |
const MOJOSHADER_uniform *u = &pd->uniforms[i]; |
94
57adfb4769a0
Simplifed public uniform information.
Ryan C. Gordon <icculus@icculus.org>
parents:
92
diff
changeset
|
92 |
printf(" * %d: %s\n", u->index, typenames[(int) u->type]); |
92
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
93 |
} // for |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
94 |
} // else |
bc1bb138e855
Implemented foundation for reporting uniforms to calling app.
Ryan C. Gordon <icculus@icculus.org>
parents:
53
diff
changeset
|
95 |
|
53 | 96 |
if (pd->output != NULL) |
113
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
97 |
{ |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
98 |
int i; |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
99 |
printf("OUTPUT:\n"); |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
100 |
for (i = 0; i < pd->output_len; i++) |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
101 |
putchar((int) pd->output[i]); |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
102 |
printf("\n"); |
8ebf445c5305
Print output in testparse.c byte-by-byte instead of as an ASCIZ string.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
103 |
} // if |
53 | 104 |
} // else |
46 | 105 |
printf("\n\n"); |
106 |
MOJOSHADER_freeParseData(pd); |
|
107 |
} // do_parse |
|
108 |
||
109 |
||
7 | 110 |
int main(int argc, char **argv) |
111 |
{ |
|
47 | 112 |
printf("MojoShader testparse\n"); |
37 | 113 |
printf("Compiled against version %d\n", MOJOSHADER_VERSION); |
114 |
printf("Linked against version %d\n", MOJOSHADER_version()); |
|
47 | 115 |
printf("\n"); |
37 | 116 |
|
53 | 117 |
if (argc <= 2) |
118 |
printf("\n\nUSAGE: %s <profile> [file1] ... [fileN]\n\n", argv[0]); |
|
47 | 119 |
else |
7 | 120 |
{ |
53 | 121 |
const char *profile = argv[1]; |
122 |
int i; |
|
123 |
||
124 |
for (i = 2; i < argc; i++) |
|
7 | 125 |
{ |
47 | 126 |
FILE *io = fopen(argv[i], "rb"); |
127 |
printf("FILE: %s\n", argv[i]); |
|
128 |
if (io == NULL) |
|
53 | 129 |
printf(" ... fopen('%s') failed.\n", argv[i]); |
47 | 130 |
else |
131 |
{ |
|
132 |
unsigned char *buf = (unsigned char *) malloc(1000000); |
|
133 |
int rc = fread(buf, 1, 1000000, io); |
|
134 |
fclose(io); |
|
53 | 135 |
do_parse(buf, rc, profile); |
47 | 136 |
free(buf); |
137 |
} // else |
|
138 |
} // for |
|
139 |
} // else |
|
7 | 140 |
|
141 |
return 0; |
|
142 |
} // main |
|
143 |
||
144 |
// end of testparse.c ... |
|
145 |