author | Ryan C. Gordon <icculus@icculus.org> |
Tue, 31 May 2011 16:25:00 -0400 | |
changeset 1038 | 9b23f9a8aa31 |
parent 1037 | b102a563d9cb |
child 1041 | 200cde29af83 |
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 |
|
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
13 |
#include <math.h> |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
14 |
|
1038
9b23f9a8aa31
Allow preshader support to be #ifdef'd out, to reduce binary size.
Ryan C. Gordon <icculus@icculus.org>
parents:
1037
diff
changeset
|
15 |
#if SUPPORT_PRESHADERS |
9b23f9a8aa31
Allow preshader support to be #ifdef'd out, to reduce binary size.
Ryan C. Gordon <icculus@icculus.org>
parents:
1037
diff
changeset
|
16 |
void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader, |
9b23f9a8aa31
Allow preshader support to be #ifdef'd out, to reduce binary size.
Ryan C. Gordon <icculus@icculus.org>
parents:
1037
diff
changeset
|
17 |
float *regs) |
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
18 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
19 |
// this is fairly straightforward, as there aren't any branching |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
20 |
// opcodes in the preshader instruction set (at the moment, at least). |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
21 |
const int scalarstart = (int) MOJOSHADER_PRESHADEROP_SCALAR_OPS; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
22 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
23 |
double *temps = (double *) alloca(sizeof (double) * preshader->temp_count); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
24 |
memset(temps, '\0', sizeof (double) * preshader->temp_count); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
25 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
26 |
double dst[4]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
27 |
double src[3][4]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
28 |
const double *src0 = src[0]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
29 |
const double *src1 = src[1]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
30 |
const double *src2 = src[2]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
31 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
32 |
MOJOSHADER_preshaderInstruction *inst = preshader->instructions; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
33 |
int instit; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
34 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
35 |
for (instit = 0; instit < preshader->instruction_count; instit++, inst++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
36 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
37 |
const MOJOSHADER_preshaderOperand *operand = inst->operands; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
38 |
const int isscalar = (inst->opcode >= scalarstart); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
39 |
const int elems = inst->element_count; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
40 |
const int elemsbytes = sizeof (double) * elems; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
41 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
42 |
// load up our operands... |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
43 |
int opiter, elemiter; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
44 |
for (opiter = 1; opiter < inst->operand_count; opiter++, operand++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
45 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
46 |
const unsigned int index = operand->index; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
47 |
switch (operand->type) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
48 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
49 |
case MOJOSHADER_PRESHADEROPERAND_LITERAL: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
50 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
51 |
const double *lit = &preshader->literals[index]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
52 |
if (!isscalar) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
53 |
memcpy(src[opiter], lit, elemsbytes); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
54 |
else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
55 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
56 |
const double val = *lit; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
57 |
for (elemiter = 0; elemiter < elems; elemiter++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
58 |
src[opiter][elemiter] = val; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
59 |
} // else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
60 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
61 |
} // case |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
62 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
63 |
case MOJOSHADER_PRESHADEROPERAND_INPUT: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
64 |
case MOJOSHADER_PRESHADEROPERAND_OUTPUT: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
65 |
if (isscalar) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
66 |
src[opiter][0] = regs[index]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
67 |
else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
68 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
69 |
int cpy; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
70 |
for (cpy = 0; cpy < elems; cpy++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
71 |
src[opiter][cpy] = regs[index+cpy]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
72 |
} // else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
73 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
74 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
75 |
case MOJOSHADER_PRESHADEROPERAND_TEMP: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
76 |
if (isscalar) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
77 |
src[opiter][0] = temps[index]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
78 |
else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
79 |
memcpy(src[opiter], temps + index, elemsbytes); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
80 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
81 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
82 |
default: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
83 |
assert(0 && "unexpected preshader operand type."); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
84 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
85 |
} // switch |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
86 |
} // for |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
87 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
88 |
// run the actual instruction, store result to dst. |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
89 |
int i; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
90 |
switch (inst->opcode) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
91 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
92 |
#define OPCODE_CASE(op, val) \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
93 |
case MOJOSHADER_PRESHADEROP_##op: \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
94 |
for (i = 0; i < elems; i++) { dst[i] = val; } \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
95 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
96 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
97 |
//OPCODE_CASE(NOP, 0.0) // not a real instruction. |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
98 |
OPCODE_CASE(MOV, src0[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
99 |
OPCODE_CASE(NEG, -src0[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
100 |
OPCODE_CASE(RCP, 1.0 / src0[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
101 |
OPCODE_CASE(FRC, src0[i] - floor(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
102 |
OPCODE_CASE(EXP, exp(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
103 |
OPCODE_CASE(LOG, log(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
104 |
OPCODE_CASE(RSQ, 1.0 / sqrt(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
105 |
OPCODE_CASE(SIN, sin(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
106 |
OPCODE_CASE(COS, cos(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
107 |
OPCODE_CASE(ASIN, asin(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
108 |
OPCODE_CASE(ACOS, acos(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
109 |
OPCODE_CASE(ATAN, atan(src0[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
110 |
OPCODE_CASE(MIN, (src0[i] < src1[i]) ? src0[i] : src1[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
111 |
OPCODE_CASE(MAX, (src0[i] > src1[i]) ? src0[i] : src1[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
112 |
OPCODE_CASE(LT, (src0[i] < src1[i]) ? 1.0 : 0.0) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
113 |
OPCODE_CASE(GE, (src0[i] >= src1[i]) ? 1.0 : 0.0) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
114 |
OPCODE_CASE(ADD, src0[i] + src1[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
115 |
OPCODE_CASE(MUL, src0[i] * src1[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
116 |
OPCODE_CASE(ATAN2, atan2(src0[i], src1[i])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
117 |
OPCODE_CASE(DIV, src0[i] / src1[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
118 |
OPCODE_CASE(CMP, (src0[i] >= 0.0) ? src1[i] : src2[i]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
119 |
//OPCODE_CASE(NOISE, ???) // !!! FIXME: don't know what this does |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
120 |
//OPCODE_CASE(MOVC, ???) // !!! FIXME: don't know what this does |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
121 |
#undef OPCODE_CASE |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
122 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
123 |
case MOJOSHADER_PRESHADEROP_DOT: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
124 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
125 |
double final = 0.0; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
126 |
for (i = 0; i < elems; i++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
127 |
final += src0[i] * src1[i]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
128 |
for (i = 0; i < elems; i++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
129 |
dst[i] = final; // !!! FIXME: is this right? |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
130 |
} // case |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
131 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
132 |
#define OPCODE_CASE_SCALAR(op, val) \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
133 |
case MOJOSHADER_PRESHADEROP_##op##_SCALAR: { \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
134 |
const double final = val; \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
135 |
for (i = 0; i < elems; i++) { dst[i] = final; } \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
136 |
break; \ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
137 |
} |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
138 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
139 |
OPCODE_CASE_SCALAR(MIN, (src0[0] < src1[0]) ? src0[0] : src1[0]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
140 |
OPCODE_CASE_SCALAR(MAX, (src0[0] > src1[0]) ? src0[0] : src1[0]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
141 |
OPCODE_CASE_SCALAR(LT, (src0[0] < src1[0]) ? 1.0 : 0.0) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
142 |
OPCODE_CASE_SCALAR(GE, (src0[0] >= src1[0]) ? 1.0 : 0.0) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
143 |
OPCODE_CASE_SCALAR(ADD, src0[0] + src1[0]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
144 |
OPCODE_CASE_SCALAR(MUL, src0[0] * src1[0]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
145 |
OPCODE_CASE_SCALAR(ATAN2, atan2(src0[0], src1[0])) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
146 |
OPCODE_CASE_SCALAR(DIV, src0[0] / src1[0]) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
147 |
//OPCODE_CASE_SCALAR(DOT) // !!! FIXME: isn't this just a MUL? |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
148 |
//OPCODE_CASE_SCALAR(NOISE, ???) // !!! FIXME: ? |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
149 |
#undef OPCODE_CASE_SCALAR |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
150 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
151 |
default: |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
152 |
assert(0 && "Unhandled preshader opcode!"); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
153 |
break; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
154 |
} // switch |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
155 |
|
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
156 |
// Figure out where dst wants to be stored. |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
157 |
operand = inst->operands; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
158 |
if (operand->type == MOJOSHADER_PRESHADEROPERAND_TEMP) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
159 |
memcpy(temps + operand->index, dst, elemsbytes); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
160 |
else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
161 |
{ |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
162 |
assert(operand->type == MOJOSHADER_PRESHADEROPERAND_OUTPUT); |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
163 |
for (i = 0; i < elems; i++) |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
164 |
regs[operand->index + i] = (float) dst[i]; |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
165 |
} // else |
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset
|
166 |
} // for |
1038
9b23f9a8aa31
Allow preshader support to be #ifdef'd out, to reduce binary size.
Ryan C. Gordon <icculus@icculus.org>
parents:
1037
diff
changeset
|
167 |
} // MOJOSHADER_runPreshader |
9b23f9a8aa31
Allow preshader support to be #ifdef'd out, to reduce binary size.
Ryan C. Gordon <icculus@icculus.org>
parents:
1037
diff
changeset
|
168 |
#endif |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
169 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
170 |
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
|
171 |
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
|
172 |
}; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 |
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
|
175 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
176 |
uint32 retval = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 |
if (*_len < sizeof (retval)) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 |
*_len = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 |
else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
180 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
181 |
const uint32 *ptr = (const uint32 *) *_ptr; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
182 |
retval = SWAP32(*ptr); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
183 |
*_ptr += sizeof (retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
184 |
*_len -= sizeof (retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 |
} // else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
186 |
return retval; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 |
} // readui32 |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
189 |
// !!! 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
|
190 |
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
|
191 |
const unsigned char *buf, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 |
const unsigned int _len, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 |
const MOJOSHADER_swizzle *swiz, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 |
const unsigned int swizcount, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 |
MOJOSHADER_malloc m, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 |
MOJOSHADER_free f, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 |
void *d) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
198 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
199 |
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
|
200 |
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
|
201 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
202 |
if (m == NULL) m = MOJOSHADER_internal_malloc; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
203 |
if (f == NULL) f = MOJOSHADER_internal_free; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
204 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
205 |
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
|
206 |
if (retval == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
207 |
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
|
208 |
memset(retval, '\0', sizeof (*retval)); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
209 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
210 |
retval->malloc = m; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
211 |
retval->free = f; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
212 |
retval->malloc_data = d; |
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 |
const uint8 *ptr = (const uint8 *) buf; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
215 |
uint32 len = (uint32) _len; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
216 |
size_t siz = 0; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
217 |
int i, j, k; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
218 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
219 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
220 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
221 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
222 |
const uint8 *base = NULL; |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
223 |
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
|
224 |
goto parseEffect_notAnEffectsFile; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
225 |
else |
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 |
const uint32 offset = readui32(&ptr, &len); |
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
228 |
base = ptr; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
229 |
//printf("base offset == %u\n", offset); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
230 |
if (offset > len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
231 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
232 |
ptr += offset; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
233 |
len -= offset; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
234 |
} // else |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
235 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
236 |
// params... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
237 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
238 |
if (len < 16) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
239 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
240 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
241 |
const uint32 numparams = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
242 |
const uint32 numtechniques = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
243 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
244 |
readui32(&ptr, &len); // !!! FIXME: there are 8 unknown bytes here. Annotations? |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
245 |
/*const uint32 numobjects = */ readui32(&ptr, &len); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
246 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
247 |
if (numparams > 0) |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
248 |
{ |
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
249 |
siz = sizeof (MOJOSHADER_effectParam) * numparams; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
250 |
retval->params = (MOJOSHADER_effectParam *) m(siz, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
251 |
if (retval->params == NULL) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
252 |
goto parseEffect_outOfMemory; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
253 |
memset(retval->params, '\0', siz); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
254 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
255 |
retval->param_count = numparams; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
256 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
257 |
for (i = 0; i < numparams; i++) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
258 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
259 |
if (len < 16) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
260 |
goto parseEffect_unexpectedEOF; |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
261 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
262 |
const uint32 typeoffset = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
263 |
const uint32 valoffset = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
264 |
const uint32 flags = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
265 |
const uint32 numannos = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
266 |
for (j = 0; j < numannos; j++) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
267 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
268 |
if (len < 8) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
269 |
goto parseEffect_unexpectedEOF; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
270 |
// !!! FIXME: parse annotations. |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
271 |
readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
272 |
readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
273 |
} // for |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
274 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
275 |
const uint8 *typeptr = base + typeoffset; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
276 |
unsigned int typelen = 9999999; // !!! FIXME |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
277 |
const uint32 paramtype = readui32(&typeptr, &typelen); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
278 |
const uint32 paramclass = readui32(&typeptr, &typelen); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
279 |
const uint32 paramname = readui32(&typeptr, &typelen); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
280 |
const uint32 paramsemantic = readui32(&typeptr, &typelen); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
281 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
282 |
// !!! FIXME: sanity checks! |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
283 |
const char *namestr = ((const char *) base) + paramname; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
284 |
const char *semstr = ((const char *) base) + paramsemantic; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
285 |
uint32 len; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
286 |
char *strptr; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
287 |
len = *((const uint32 *) namestr); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
288 |
strptr = (char *) m(len + 1, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
289 |
memcpy(strptr, namestr + 4, len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
290 |
strptr[len] = '\0'; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
291 |
retval->params[i].name = strptr; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
292 |
len = *((const uint32 *) semstr); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
293 |
strptr = (char *) m(len + 1, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
294 |
memcpy(strptr, semstr + 4, len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
295 |
strptr[len] = '\0'; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
296 |
retval->params[i].semantic = strptr; |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
297 |
} // for |
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
298 |
} // if |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
299 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
300 |
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
|
301 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
302 |
// techniques... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
303 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
304 |
if (numtechniques > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
305 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
306 |
siz = sizeof (MOJOSHADER_effectTechnique) * numtechniques; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
307 |
retval->techniques = (MOJOSHADER_effectTechnique *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
308 |
if (retval->techniques == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
309 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
310 |
memset(retval->techniques, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
311 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
312 |
retval->technique_count = numtechniques; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
313 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
314 |
for (i = 0; i < numtechniques; i++) |
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 |
if (len < 12) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
317 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
318 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
319 |
MOJOSHADER_effectTechnique *technique = &retval->techniques[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
320 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
321 |
const uint32 nameoffset = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
322 |
const uint32 numannos = readui32(&ptr, &len); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
323 |
const uint32 numpasses = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
324 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
325 |
if (nameoffset >= _len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
326 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
327 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
328 |
if (numannos > 0) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
329 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
330 |
// !!! FIXME: expose these to the caller? |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
331 |
for (j = 0; j < numannos; j++) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
332 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
333 |
if (len < 8) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
334 |
goto parseEffect_unexpectedEOF; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
335 |
readui32(&ptr, &len); // typedef offset |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
336 |
readui32(&ptr, &len); // value offset |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
337 |
} // for |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
338 |
} // if |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
339 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
340 |
// !!! FIXME: verify this doesn't go past EOF looking for a null. |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
341 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
342 |
const char *namestr = ((char *) base) + nameoffset; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
343 |
uint32 len = *((const uint32 *) namestr); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
344 |
char *strptr = (char *) m(len + 1, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
345 |
memcpy(strptr, namestr + 4, len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
346 |
strptr[len] = '\0'; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
347 |
technique->name = strptr; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
348 |
} |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
349 |
|
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
350 |
if (numpasses > 0) |
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 |
technique->pass_count = numpasses; |
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 |
siz = sizeof (MOJOSHADER_effectPass) * numpasses; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
355 |
technique->passes = (MOJOSHADER_effectPass *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
356 |
if (technique->passes == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
357 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
358 |
memset(technique->passes, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
359 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
360 |
for (j = 0; j < numpasses; j++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
361 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
362 |
if (len < 12) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
363 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
364 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
365 |
MOJOSHADER_effectPass *pass = &technique->passes[j]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
366 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
367 |
const uint32 passnameoffset = readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
368 |
const uint32 numannos = readui32(&ptr, &len); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
369 |
const uint32 numstates = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
370 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
371 |
if (passnameoffset >= _len) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
372 |
goto parseEffect_unexpectedEOF; |
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 |
// !!! FIXME: verify this doesn't go past EOF looking for a null. |
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
375 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
376 |
const char *namestr = ((char *) base) + passnameoffset; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
377 |
uint32 len = *((const uint32 *) namestr); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
378 |
char *strptr = (char *) m(len + 1, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
379 |
memcpy(strptr, namestr + 4, len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
380 |
strptr[len] = '\0'; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
381 |
pass->name = strptr; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
382 |
} |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
383 |
|
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
384 |
if (numannos > 0) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
385 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
386 |
for (k = 0; k < numannos; k++) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
387 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
388 |
if (len < 8) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
389 |
goto parseEffect_unexpectedEOF; |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
390 |
// !!! FIXME: do something with this. |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
391 |
readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
392 |
readui32(&ptr, &len); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
393 |
} // for |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
394 |
} // if |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
395 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
396 |
if (numstates > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
397 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
398 |
pass->state_count = numstates; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
399 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
400 |
siz = sizeof (MOJOSHADER_effectState) * numstates; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
401 |
pass->states = (MOJOSHADER_effectState *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
402 |
if (pass->states == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
403 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
404 |
memset(pass->states, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
405 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
406 |
for (k = 0; k < numstates; k++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
407 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
408 |
if (len < 16) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
409 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
410 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
411 |
MOJOSHADER_effectState *state = &pass->states[k]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
412 |
const uint32 type = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
413 |
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
|
414 |
/*const uint32 offsetend = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
415 |
/*const uint32 offsetstart = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
416 |
state->type = type; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
417 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
418 |
if ((type == 0x92) || (type == 0x93)) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
419 |
numshaders++; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
420 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
421 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
422 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
423 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
424 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
425 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
426 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
427 |
// textures... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
428 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
429 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
430 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
431 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
432 |
const int numtextures = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
433 |
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
|
434 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
435 |
if (numtextures > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
436 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
437 |
siz = sizeof (MOJOSHADER_effectTexture) * numtextures; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
438 |
retval->textures = m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
439 |
if (retval->textures == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
440 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
441 |
memset(retval->textures, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
442 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
443 |
for (i = 0; i < numtextures; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
444 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
445 |
if (len < 8) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
446 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
447 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
448 |
MOJOSHADER_effectTexture *texture = &retval->textures[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
449 |
const uint32 texparam = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
450 |
const uint32 texsize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
451 |
// 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
|
452 |
const uint32 readsize = (((texsize + 3) / 4) * 4); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
453 |
if (len < readsize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
454 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
455 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
456 |
texture->param = texparam; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
457 |
char *str = m(texsize + 1, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
458 |
if (str == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
459 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
460 |
memcpy(str, ptr, texsize); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
461 |
str[texsize] = '\0'; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
462 |
texture->name = str; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
463 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
464 |
ptr += readsize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
465 |
len -= readsize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
466 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
467 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
468 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
469 |
// shaders... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
470 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
471 |
if (numshaders > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
472 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
473 |
siz = sizeof (MOJOSHADER_effectShader) * numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
474 |
retval->shaders = (MOJOSHADER_effectShader *) m(siz, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
475 |
if (retval->shaders == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
476 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
477 |
memset(retval->shaders, '\0', siz); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
478 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
479 |
retval->shader_count = numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
480 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
481 |
// !!! 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
|
482 |
// !!! 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
|
483 |
for (i = 0; i < numshaders; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
484 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
485 |
if (len < 24) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
486 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
487 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
488 |
MOJOSHADER_effectShader *shader = &retval->shaders[i]; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
489 |
const uint32 technique = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
490 |
const uint32 pass = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
491 |
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
|
492 |
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
|
493 |
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
|
494 |
const uint32 shadersize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
495 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
496 |
if (len < shadersize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
497 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
498 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
499 |
shader->technique = technique; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
500 |
shader->pass = pass; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
501 |
shader->shader = MOJOSHADER_parse(profile, ptr, shadersize, |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
502 |
swiz, swizcount, m, f, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
503 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
504 |
// !!! FIXME: check for errors. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
505 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
506 |
ptr += shadersize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
507 |
len -= shadersize; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
508 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
509 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
510 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
511 |
// !!! 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
|
512 |
// mappings ... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
513 |
assert(numshaders <= numobjects); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
514 |
const uint32 nummappings = numobjects - numshaders; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
515 |
if (nummappings > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
516 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
517 |
for (i = 0; i < nummappings; i++) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
518 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
519 |
if (len < 24) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
520 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
521 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
522 |
/*const uint32 magic = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
523 |
/*const uint32 index = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
524 |
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
|
525 |
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
|
526 |
/*const uint32 type = */ readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
527 |
const uint32 mapsize = readui32(&ptr, &len); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
528 |
if (mapsize > 0) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
529 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
530 |
const uint32 readsize = (((mapsize + 3) / 4) * 4); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
531 |
if (len < readsize) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
532 |
goto parseEffect_unexpectedEOF; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
533 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
534 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
535 |
} // if |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
536 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
537 |
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
|
538 |
if (retval->profile == NULL) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
539 |
goto parseEffect_outOfMemory; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
540 |
strcpy((char *) retval->profile, profile); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
541 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
542 |
return retval; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
543 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
544 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
545 |
// !!! FIXME: do something with this. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
546 |
parseEffect_notAnEffectsFile: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
547 |
parseEffect_unexpectedEOF: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
548 |
parseEffect_outOfMemory: |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
549 |
MOJOSHADER_freeEffect(retval); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
550 |
return &MOJOSHADER_out_of_mem_effect; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
551 |
} // MOJOSHADER_parseEffect |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
552 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
553 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
554 |
void MOJOSHADER_freeEffect(const MOJOSHADER_effect *_effect) |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
555 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
556 |
MOJOSHADER_effect *effect = (MOJOSHADER_effect *) _effect; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
557 |
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
|
558 |
return; // no-op. |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
559 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
560 |
MOJOSHADER_free f = effect->free; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
561 |
void *d = effect->malloc_data; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
562 |
int i, j; |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
563 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
564 |
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
|
565 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
566 |
f((void *) effect->errors[i].error, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
567 |
f((void *) effect->errors[i].filename, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
568 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
569 |
f((void *) effect->errors, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
570 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
571 |
f((void *) effect->profile, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
572 |
|
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
573 |
for (i = 0; i < effect->param_count; i++) |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
574 |
{ |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
575 |
f((void *) effect->params[i].name, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
576 |
f((void *) effect->params[i].semantic, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
577 |
} // for |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
578 |
f(effect->params, d); |
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset
|
579 |
|
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
580 |
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
|
581 |
{ |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
582 |
MOJOSHADER_effectTechnique *technique = &effect->techniques[i]; |
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
583 |
f((void *) technique->name, d); |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
584 |
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
|
585 |
{ |
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
586 |
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
|
587 |
f(technique->passes[j].states, d); |
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset
|
588 |
} // for |
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
589 |
f(technique->passes, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
590 |
} // for |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
591 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
592 |
f(effect->techniques, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
593 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
594 |
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
|
595 |
f((void *) effect->textures[i].name, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
596 |
f(effect->textures, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
597 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
598 |
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
|
599 |
MOJOSHADER_freeParseData(effect->shaders[i].shader); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
600 |
f(effect->shaders, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
601 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
602 |
f(effect, d); |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
603 |
} // MOJOSHADER_freeEffect |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
604 |
|
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
605 |
// end of mojoshader_effects.c ... |
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
606 |