author | Ryan C. Gordon <icculus@icculus.org> |
Sun, 22 May 2011 17:23:57 -0400 | |
changeset 1021 | cad933999680 |
parent 1019 | e8988ca01c6d |
child 1036 | 8a3597b44ff7 |
permissions | -rw-r--r-- |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1 |
/** |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
2 |
* MojoShader; generate shader programs from bytecode of compiled |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
3 |
* Direct3D shaders. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
4 |
* |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
5 |
* Please see the file LICENSE.txt in the source's root directory. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
6 |
* |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
7 |
* This file written by Ryan C. Gordon. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
8 |
*/ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
9 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
10 |
#define __MOJOSHADER_INTERNAL__ 1 |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
11 |
#include "mojoshader_internal.h" |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
12 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
13 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
14 |
static MOJOSHADER_effect MOJOSHADER_out_of_mem_effect = { |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
15 |
1, &MOJOSHADER_out_of_mem_error, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
16 |
}; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
17 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
18 |
static uint32 readui32(const uint8 **_ptr, uint32 *_len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
19 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
20 |
uint32 retval = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
21 |
if (*_len < sizeof (retval)) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
22 |
*_len = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
23 |
else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
24 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
25 |
const uint32 *ptr = (const uint32 *) *_ptr; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
26 |
retval = SWAP32(*ptr); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
27 |
*_ptr += sizeof (retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
28 |
*_len -= sizeof (retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
29 |
} // else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
30 |
return retval; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
31 |
} // readui32 |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
32 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
33 |
// !!! FIXME: this is sort of a big, ugly function. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
34 |
const MOJOSHADER_effect *MOJOSHADER_parseEffect(const char *profile, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
35 |
const unsigned char *buf, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
36 |
const unsigned int _len, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
37 |
const MOJOSHADER_swizzle *swiz, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
38 |
const unsigned int swizcount, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
39 |
MOJOSHADER_malloc m, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
40 |
MOJOSHADER_free f, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
41 |
void *d) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
42 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
43 |
if ( ((m == NULL) && (f != NULL)) || ((m != NULL) && (f == NULL)) ) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
44 |
return &MOJOSHADER_out_of_mem_effect; // supply both or neither. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
45 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
46 |
if (m == NULL) m = MOJOSHADER_internal_malloc; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
47 |
if (f == NULL) f = MOJOSHADER_internal_free; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
48 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
49 |
MOJOSHADER_effect *retval = m(sizeof (MOJOSHADER_effect), d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
50 |
if (retval == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
51 |
return &MOJOSHADER_out_of_mem_effect; // supply both or neither. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
52 |
memset(retval, '\0', sizeof (*retval)); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
53 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
54 |
retval->malloc = m; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
55 |
retval->free = f; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
56 |
retval->malloc_data = d; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
57 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
58 |
const uint8 *ptr = (const uint8 *) buf; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
59 |
uint32 len = (uint32) _len; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
60 |
size_t siz = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
61 |
int i, j, k; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
62 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
63 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
64 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
65 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
66 |
if (readui32(&ptr, &len) != 0xFEFF0901) // !!! FIXME: is this always magic? |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
67 |
goto parseEffect_notAnEffectsFile; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
68 |
else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
69 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
70 |
const uint32 offset = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
71 |
if (offset > len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
72 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
73 |
ptr += offset; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
74 |
len -= offset; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
75 |
} // else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
76 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
77 |
// params... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
78 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
79 |
if (len < 16) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
80 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
81 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
82 |
const uint32 numparams = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
83 |
const uint32 numtechniques = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
84 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
85 |
readui32(&ptr, &len); // !!! FIXME: there are 8 unknown bytes here. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
86 |
readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
87 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
88 |
for (i = 0; i < numparams; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
89 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
90 |
if (len < 16) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
91 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
92 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
93 |
/*const uint32 startoffset = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
94 |
/*const uint32 endoffset = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
95 |
readui32(&ptr, &len); // !!! FIXME: don't know what this is. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
96 |
const uint32 numannos = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
97 |
for (j = 0; j < numannos; j++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
98 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
99 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
100 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
101 |
// !!! FIXME: parse annotations. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
102 |
readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
103 |
readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
104 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
105 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
106 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
107 |
uint32 numshaders = 0; // we'll calculate this later. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
108 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
109 |
// techniques... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
110 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
111 |
if (numtechniques > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
112 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
113 |
siz = sizeof (MOJOSHADER_effectTechnique) * numtechniques; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
114 |
retval->techniques = (MOJOSHADER_effectTechnique *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
115 |
if (retval->techniques == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
116 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
117 |
memset(retval->techniques, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
118 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
119 |
retval->technique_count = numtechniques; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
120 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
121 |
for (i = 0; i < numtechniques; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
122 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
123 |
if (len < 12) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
124 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
125 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
126 |
MOJOSHADER_effectTechnique *technique = &retval->techniques[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
127 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
128 |
// !!! FIXME: is this always 12? |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
129 |
const uint32 nameoffset = readui32(&ptr, &len) + 12; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
130 |
readui32(&ptr, &len); // !!! FIXME: don't know what this field does. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
131 |
const uint32 numpasses = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
132 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
133 |
if (nameoffset >= _len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
134 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
135 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
136 |
if (numpasses > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
137 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
138 |
// !!! FIXME: verify this doesn't go past EOF looking for a null. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
139 |
siz = strlen(((const char *) buf) + nameoffset) + 1; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
140 |
technique->name = (char *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
141 |
if (technique->name == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
142 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
143 |
strcpy((char *) technique->name, ((const char *) buf) + nameoffset); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
144 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
145 |
technique->pass_count = numpasses; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
146 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
147 |
siz = sizeof (MOJOSHADER_effectPass) * numpasses; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
148 |
technique->passes = (MOJOSHADER_effectPass *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
149 |
if (technique->passes == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
150 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
151 |
memset(technique->passes, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
152 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
153 |
for (j = 0; j < numpasses; j++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
154 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
155 |
if (len < 12) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
156 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
157 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
158 |
MOJOSHADER_effectPass *pass = &technique->passes[j]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
159 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
160 |
// !!! FIXME: is this always 12? |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
161 |
const uint32 passnameoffset = readui32(&ptr, &len) + 12; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
162 |
readui32(&ptr, &len); // !!! FIXME: don't know what this field does. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
163 |
const uint32 numstates = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
164 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
165 |
if (passnameoffset >= _len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
166 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
167 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
168 |
// !!! FIXME: verify this doesn't go past EOF looking for a null. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
169 |
siz = strlen(((const char *) buf) + passnameoffset) + 1; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
170 |
pass->name = (char *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
171 |
if (pass->name == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
172 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 |
strcpy((char *) pass->name, ((const char *) buf) + passnameoffset); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
175 |
if (numstates > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
176 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 |
pass->state_count = numstates; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 |
siz = sizeof (MOJOSHADER_effectState) * numstates; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
180 |
pass->states = (MOJOSHADER_effectState *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
181 |
if (pass->states == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
182 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
183 |
memset(pass->states, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
184 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 |
for (k = 0; k < numstates; k++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
186 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 |
if (len < 16) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
189 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
190 |
MOJOSHADER_effectState *state = &pass->states[k]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
191 |
const uint32 type = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 |
readui32(&ptr, &len); // !!! FIXME: don't know what this field does. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 |
/*const uint32 offsetend = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 |
/*const uint32 offsetstart = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 |
state->type = type; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 |
if ((type == 0x92) || (type == 0x93)) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
198 |
numshaders++; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
199 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
200 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
201 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
202 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
203 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
204 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
205 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
206 |
// textures... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
207 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
208 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
209 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
210 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
211 |
const int numtextures = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
212 |
const int numobjects = readui32(&ptr, &len); // !!! FIXME: "objects" for lack of a better word. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
213 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
214 |
if (numtextures > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
215 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
216 |
siz = sizeof (MOJOSHADER_effectTexture) * numtextures; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
217 |
retval->textures = m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
218 |
if (retval->textures == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
219 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
220 |
memset(retval->textures, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
221 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
222 |
for (i = 0; i < numtextures; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
223 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
224 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
225 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
226 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
227 |
MOJOSHADER_effectTexture *texture = &retval->textures[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
228 |
const uint32 texparam = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
229 |
const uint32 texsize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
230 |
// apparently texsize will pad out to 32 bits. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
231 |
const uint32 readsize = (((texsize + 3) / 4) * 4); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
232 |
if (len < readsize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
233 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
234 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
235 |
texture->param = texparam; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
236 |
char *str = m(texsize + 1, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
237 |
if (str == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
238 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
239 |
memcpy(str, ptr, texsize); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
240 |
str[texsize] = '\0'; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
241 |
texture->name = str; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
242 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
243 |
ptr += readsize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
244 |
len -= readsize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
245 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
246 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
247 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
248 |
// shaders... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
249 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
250 |
if (numshaders > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
251 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
252 |
siz = sizeof (MOJOSHADER_effectShader) * numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
253 |
retval->shaders = (MOJOSHADER_effectShader *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
254 |
if (retval->shaders == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
255 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
256 |
memset(retval->shaders, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
257 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
258 |
retval->shader_count = numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
259 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
260 |
// !!! FIXME: I wonder if we should pull these from offsets and not |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
261 |
// !!! FIXME: count on them all being in a line like this. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
262 |
for (i = 0; i < numshaders; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
263 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
264 |
if (len < 24) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
265 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
266 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
267 |
MOJOSHADER_effectShader *shader = &retval->shaders[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
268 |
const uint32 technique = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
269 |
const uint32 pass = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
270 |
readui32(&ptr, &len); // !!! FIXME: don't know what this does. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
271 |
readui32(&ptr, &len); // !!! FIXME: don't know what this does (vertex/pixel/geometry?) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
272 |
readui32(&ptr, &len); // !!! FIXME: don't know what this does. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
273 |
const uint32 shadersize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
274 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
275 |
if (len < shadersize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
276 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
277 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
278 |
shader->technique = technique; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
279 |
shader->pass = pass; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
280 |
shader->shader = MOJOSHADER_parse(profile, ptr, shadersize, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
281 |
swiz, swizcount, m, f, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
282 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
283 |
// !!! FIXME: check for errors. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
284 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
285 |
ptr += shadersize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
286 |
len -= shadersize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
287 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
288 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
289 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
290 |
// !!! FIXME: we parse this, but don't expose the data, yet. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
291 |
// mappings ... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
292 |
assert(numshaders <= numobjects); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
293 |
const uint32 nummappings = numobjects - numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
294 |
if (nummappings > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
295 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
296 |
for (i = 0; i < nummappings; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
297 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
298 |
if (len < 24) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
299 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
300 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
301 |
/*const uint32 magic = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
302 |
/*const uint32 index = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
303 |
readui32(&ptr, &len); // !!! FIXME: what is this field? |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
304 |
readui32(&ptr, &len); // !!! FIXME: what is this field? |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
305 |
/*const uint32 type = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
306 |
const uint32 mapsize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
307 |
if (mapsize > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
308 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
309 |
const uint32 readsize = (((mapsize + 3) / 4) * 4); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
310 |
if (len < readsize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
311 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
312 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
313 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
314 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
315 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
316 |
retval->profile = (char *) m(strlen(profile) + 1, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
317 |
if (retval->profile == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
318 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
319 |
strcpy((char *) retval->profile, profile); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
320 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
321 |
return retval; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
322 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
323 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
324 |
// !!! FIXME: do something with this. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
325 |
parseEffect_notAnEffectsFile: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
326 |
parseEffect_unexpectedEOF: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
327 |
parseEffect_outOfMemory: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
328 |
MOJOSHADER_freeEffect(retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
329 |
return &MOJOSHADER_out_of_mem_effect; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
330 |
} // MOJOSHADER_parseEffect |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
331 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
332 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
333 |
void MOJOSHADER_freeEffect(const MOJOSHADER_effect *_effect) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
334 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
335 |
MOJOSHADER_effect *effect = (MOJOSHADER_effect *) _effect; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
336 |
if ((effect == NULL) || (effect == &MOJOSHADER_out_of_mem_effect)) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
337 |
return; // no-op. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
338 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
339 |
MOJOSHADER_free f = effect->free; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
340 |
void *d = effect->malloc_data; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
341 |
int i, j; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
342 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
343 |
for (i = 0; i < effect->error_count; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
344 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
345 |
f((void *) effect->errors[i].error, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
346 |
f((void *) effect->errors[i].filename, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
347 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
348 |
f((void *) effect->errors, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
349 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
350 |
f((void *) effect->profile, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
351 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
352 |
for (i = 0; i < effect->technique_count; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
353 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
354 |
MOJOSHADER_effectTechnique *technique = &effect->techniques[i]; |
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
355 |
f((void *) technique->name, d); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
356 |
for (j = 0; j < technique->pass_count; j++) |
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
357 |
{ |
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
358 |
f((void *) technique->passes[j].name, d); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
359 |
f(technique->passes[j].states, d); |
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
360 |
} // for |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
361 |
f(technique->passes, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
362 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
363 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
364 |
f(effect->techniques, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
365 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
366 |
for (i = 0; i < effect->texture_count; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
367 |
f((void *) effect->textures[i].name, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
368 |
f(effect->textures, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
369 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
370 |
for (i = 0; i < effect->shader_count; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
371 |
MOJOSHADER_freeParseData(effect->shaders[i].shader); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
372 |
f(effect->shaders, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
373 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
374 |
f(effect, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
375 |
} // MOJOSHADER_freeEffect |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
376 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
377 |
// end of mojoshader_effects.c ... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
378 |