author  Ryan C. Gordon <icculus@icculus.org> 
Wed, 04 Jan 2012 13:07:50 0800  
changeset 1074  3fdc7cbd0c37 
parent 1063  b10281d6eb45 
child 1104  9147482e1ec7 
permissions  rwrr 
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, 
1043
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

17 
const float *inregs, float *outregs) 
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 

1047
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

23 
double *temps = NULL; 
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

24 
if (preshader>temp_count > 0) 
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

25 
{ 
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

26 
temps = (double *) alloca(sizeof (double) * preshader>temp_count); 
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

27 
memset(temps, '\0', sizeof (double) * preshader>temp_count); 
6b92ce2fc809
Don't try to allocate a temp array if the preshader has no temps.
Ryan C. Gordon <icculus@icculus.org>
parents:
1046
diff
changeset

28 
} // if 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

29 

1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

30 
double dst[4] = { 0, 0, 0, 0 }; 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

31 
double src[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

32 
const double *src0 = &src[0][0]; 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

33 
const double *src1 = &src[1][0]; 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

34 
const double *src2 = &src[2][0]; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

35 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

36 
MOJOSHADER_preshaderInstruction *inst = preshader>instructions; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

37 
int instit; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

38 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

39 
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

40 
{ 
1046
097aefb03885
Place preshader destination register last in operand list.
Ryan C. Gordon <icculus@icculus.org>
parents:
1045
diff
changeset

41 
const MOJOSHADER_preshaderOperand *operand = inst>operands; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

42 
const int elems = inst>element_count; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

43 
const int elemsbytes = sizeof (double) * elems; 
1053
513af64373ad
Maybe fix scalar operations in preshader interpreter.
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset

44 
const int isscalarop = (inst>opcode >= scalarstart); 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

45 

1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

46 
assert(elems >= 0); 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

47 
assert(elems <= 4); 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

48 

1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

49 
// load up our operands... 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

50 
int opiter, elemiter; 
1046
097aefb03885
Place preshader destination register last in operand list.
Ryan C. Gordon <icculus@icculus.org>
parents:
1045
diff
changeset

51 
for (opiter = 0; opiter < inst>operand_count1; opiter++, operand++) 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

52 
{ 
1053
513af64373ad
Maybe fix scalar operations in preshader interpreter.
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset

53 
const int isscalar = ((isscalarop) && (opiter == 0)); 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

54 
const unsigned int index = operand>index; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

55 
switch (operand>type) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

56 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

57 
case MOJOSHADER_PRESHADEROPERAND_LITERAL: 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

58 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

59 
const double *lit = &preshader>literals[index]; 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

60 
assert((index + elems) <= preshader>literal_count); 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

61 
if (!isscalar) 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

62 
memcpy(&src[opiter][0], lit, elemsbytes); 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

63 
else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

64 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

65 
const double val = *lit; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

66 
for (elemiter = 0; elemiter < elems; elemiter++) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

67 
src[opiter][elemiter] = val; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

68 
} // else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

69 
break; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

70 
} // case 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

71 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

72 
case MOJOSHADER_PRESHADEROPERAND_INPUT: 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

73 
if (isscalar) 
1043
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

74 
src[opiter][0] = inregs[index]; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

75 
else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

76 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

77 
int cpy; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

78 
for (cpy = 0; cpy < elems; cpy++) 
1043
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

79 
src[opiter][cpy] = inregs[index+cpy]; 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

80 
} // else 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

81 
break; 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

82 

6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

83 
case MOJOSHADER_PRESHADEROPERAND_OUTPUT: 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

84 
if (isscalar) 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

85 
src[opiter][0] = outregs[index]; 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

86 
else 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

87 
{ 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

88 
int cpy; 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

89 
for (cpy = 0; cpy < elems; cpy++) 
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

90 
src[opiter][cpy] = outregs[index+cpy]; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

91 
} // else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

92 
break; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

93 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

94 
case MOJOSHADER_PRESHADEROPERAND_TEMP: 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

95 
if (temps != NULL) 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

96 
{ 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

97 
if (isscalar) 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

98 
src[opiter][0] = temps[index]; 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

99 
else 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

100 
memcpy(src[opiter], temps + index, elemsbytes); 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

101 
} // if 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

102 
break; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

103 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

104 
default: 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

105 
assert(0 && "unexpected preshader operand type."); 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

106 
return; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

107 
} // switch 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

108 
} // for 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

109 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

110 
// 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

111 
int i; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

112 
switch (inst>opcode) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

113 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

114 
#define OPCODE_CASE(op, val) \ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

115 
case MOJOSHADER_PRESHADEROP_##op: \ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

116 
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

117 
break; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

118 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

119 
//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

120 
OPCODE_CASE(MOV, src0[i]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

121 
OPCODE_CASE(NEG, src0[i]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

122 
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

123 
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

124 
OPCODE_CASE(EXP, exp(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

125 
OPCODE_CASE(LOG, log(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

126 
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

127 
OPCODE_CASE(SIN, sin(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

128 
OPCODE_CASE(COS, cos(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

129 
OPCODE_CASE(ASIN, asin(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

130 
OPCODE_CASE(ACOS, acos(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

131 
OPCODE_CASE(ATAN, atan(src0[i])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

132 
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

133 
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

134 
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

135 
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

136 
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

137 
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

138 
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

139 
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

140 
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

141 
//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

142 
//OPCODE_CASE(MOVC, ???) // !!! FIXME: don't know what this does 
1074
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

143 
OPCODE_CASE(MIN_SCALAR, (src0[0] < src1[i]) ? src0[0] : src1[i]) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

144 
OPCODE_CASE(MAX_SCALAR, (src0[0] > src1[i]) ? src0[0] : src1[i]) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

145 
OPCODE_CASE(LT_SCALAR, (src0[0] < src1[i]) ? 1.0 : 0.0) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

146 
OPCODE_CASE(GE_SCALAR, (src0[0] >= src1[i]) ? 1.0 : 0.0) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

147 
OPCODE_CASE(ADD_SCALAR, src0[0] + src1[i]) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

148 
OPCODE_CASE(MUL_SCALAR, src0[0] * src1[i]) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

149 
OPCODE_CASE(ATAN2_SCALAR, atan2(src0[0], src1[i])) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

150 
OPCODE_CASE(DIV_SCALAR, src0[0] / src1[i]) 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

151 
//OPCODE_CASE(DOT_SCALAR) // !!! FIXME: isn't this just a MUL? 
3fdc7cbd0c37
Corrected scalar opcode behavior in the preshader virtual machine.
Ryan C. Gordon <icculus@icculus.org>
parents:
1063
diff
changeset

152 
//OPCODE_CASE(NOISE_SCALAR, ???) // !!! FIXME: ? 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

153 
#undef OPCODE_CASE 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

154 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

155 
case MOJOSHADER_PRESHADEROP_DOT: 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

156 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

157 
double final = 0.0; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

158 
for (i = 0; i < elems; i++) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

159 
final += src0[i] * src1[i]; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

160 
for (i = 0; i < elems; i++) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

161 
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

162 
} // case 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

163 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

164 
default: 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

165 
assert(0 && "Unhandled preshader opcode!"); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

166 
break; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

167 
} // switch 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

168 

8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

169 
// 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

170 
if (operand>type == MOJOSHADER_PRESHADEROPERAND_TEMP) 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

171 
{ 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

172 
assert(preshader>temp_count >= 
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

173 
operand>index + (elemsbytes / sizeof (double))); 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

174 
memcpy(temps + operand>index, dst, elemsbytes); 
1063
b10281d6eb45
Several preshader fixes and static analysis tweaks.
Ryan C. Gordon <icculus@icculus.org>
parents:
1053
diff
changeset

175 
} // if 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

176 
else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

177 
{ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

178 
assert(operand>type == MOJOSHADER_PRESHADEROPERAND_OUTPUT); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

179 
for (i = 0; i < elems; i++) 
1043
6227066350b4
Preshader input registers are separate from the actual shader constant file!
Ryan C. Gordon <icculus@icculus.org>
parents:
1041
diff
changeset

180 
outregs[operand>index + i] = (float) dst[i]; 
1036
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

181 
} // else 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

182 
} // 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

183 
} // 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

184 
#endif 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

185 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

186 
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

187 
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

188 
}; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

189 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

190 
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

191 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

192 
uint32 retval = 0; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

193 
if (*_len < sizeof (retval)) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

194 
*_len = 0; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

195 
else 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

196 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

197 
const uint32 *ptr = (const uint32 *) *_ptr; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

198 
retval = SWAP32(*ptr); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

199 
*_ptr += sizeof (retval); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

200 
*_len = sizeof (retval); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

201 
} // else 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

202 
return retval; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

203 
} // readui32 
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 
// !!! 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

206 
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

207 
const unsigned char *buf, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

208 
const unsigned int _len, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

209 
const MOJOSHADER_swizzle *swiz, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

210 
const unsigned int swizcount, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

211 
MOJOSHADER_malloc m, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

212 
MOJOSHADER_free f, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

213 
void *d) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

214 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

215 
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

216 
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

217 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

218 
if (m == NULL) m = MOJOSHADER_internal_malloc; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

219 
if (f == NULL) f = MOJOSHADER_internal_free; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

220 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

221 
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

222 
if (retval == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

223 
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

224 
memset(retval, '\0', sizeof (*retval)); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

225 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

226 
retval>malloc = m; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

227 
retval>free = f; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

228 
retval>malloc_data = d; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

229 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

230 
const uint8 *ptr = (const uint8 *) buf; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

231 
uint32 len = (uint32) _len; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

232 
size_t siz = 0; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

233 
int i, j, k; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

234 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

235 
if (len < 8) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

236 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

237 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

238 
const uint8 *base = NULL; 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

239 
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

240 
goto parseEffect_notAnEffectsFile; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

241 
else 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

242 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

243 
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

244 
base = ptr; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

245 
//printf("base offset == %u\n", offset); 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

246 
if (offset > len) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

247 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

248 
ptr += offset; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

249 
len = offset; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

250 
} // else 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

251 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

252 
// params... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

253 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

254 
if (len < 16) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

255 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

256 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

257 
const uint32 numparams = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

258 
const uint32 numtechniques = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

259 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

260 
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

261 
/*const uint32 numobjects = */ readui32(&ptr, &len); 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

262 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

263 
if (numparams > 0) 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

264 
{ 
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

265 
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

266 
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

267 
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

268 
goto parseEffect_outOfMemory; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

269 
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

270 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

271 
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

272 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

273 
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

274 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

275 
if (len < 16) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

276 
goto parseEffect_unexpectedEOF; 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

277 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

278 
const uint32 typeoffset = readui32(&ptr, &len); 
1041
200cde29af83
Fixed compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
1038
diff
changeset

279 
/*const uint32 valoffset =*/ readui32(&ptr, &len); 
200cde29af83
Fixed compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
1038
diff
changeset

280 
/*const uint32 flags =*/ 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

281 
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

282 
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

283 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

284 
if (len < 8) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

285 
goto parseEffect_unexpectedEOF; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

286 
// !!! FIXME: parse annotations. 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

287 
readui32(&ptr, &len); 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

288 
readui32(&ptr, &len); 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

289 
} // for 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

290 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

291 
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

292 
unsigned int typelen = 9999999; // !!! FIXME 
1041
200cde29af83
Fixed compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
1038
diff
changeset

293 
/*const uint32 paramtype =*/ readui32(&typeptr, &typelen); 
200cde29af83
Fixed compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
1038
diff
changeset

294 
/*const uint32 paramclass =*/ readui32(&typeptr, &typelen); 
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

295 
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

296 
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

297 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

298 
// !!! FIXME: sanity checks! 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

299 
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

300 
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

301 
uint32 len; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

302 
char *strptr; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

303 
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

304 
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

305 
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

306 
strptr[len] = '\0'; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

307 
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

308 
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

309 
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

310 
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

311 
strptr[len] = '\0'; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

312 
retval>params[i].semantic = strptr; 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

313 
} // for 
1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

314 
} // if 
1019
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 
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

317 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

318 
// techniques... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

319 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

320 
if (numtechniques > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

321 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

322 
siz = sizeof (MOJOSHADER_effectTechnique) * numtechniques; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

323 
retval>techniques = (MOJOSHADER_effectTechnique *) m(siz, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

324 
if (retval>techniques == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

325 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

326 
memset(retval>techniques, '\0', siz); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

327 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

328 
retval>technique_count = numtechniques; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

329 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

330 
for (i = 0; i < numtechniques; i++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

331 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

332 
if (len < 12) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

333 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

334 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

335 
MOJOSHADER_effectTechnique *technique = &retval>techniques[i]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

336 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

337 
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

338 
const uint32 numannos = readui32(&ptr, &len); 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

339 
const uint32 numpasses = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

340 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

341 
if (nameoffset >= _len) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

342 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

343 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

344 
if (numannos > 0) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

345 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

346 
// !!! 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

347 
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

348 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

349 
if (len < 8) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

350 
goto parseEffect_unexpectedEOF; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

351 
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

352 
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

353 
} // for 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

354 
} // if 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

355 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

356 
// !!! 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

357 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

358 
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

359 
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

360 
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

361 
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

362 
strptr[len] = '\0'; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

363 
technique>name = strptr; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

364 
} 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

365 

1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

366 
if (numpasses > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

367 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

368 
technique>pass_count = numpasses; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

369 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

370 
siz = sizeof (MOJOSHADER_effectPass) * numpasses; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

371 
technique>passes = (MOJOSHADER_effectPass *) m(siz, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

372 
if (technique>passes == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

373 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

374 
memset(technique>passes, '\0', siz); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

375 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

376 
for (j = 0; j < numpasses; j++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

377 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

378 
if (len < 12) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

379 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

380 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

381 
MOJOSHADER_effectPass *pass = &technique>passes[j]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

382 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

383 
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

384 
const uint32 numannos = readui32(&ptr, &len); 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

385 
const uint32 numstates = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

386 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

387 
if (passnameoffset >= _len) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

388 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

389 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

390 
// !!! 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

391 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

392 
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

393 
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

394 
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

395 
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

396 
strptr[len] = '\0'; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

397 
pass>name = strptr; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

398 
} 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

399 

b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

400 
if (numannos > 0) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

401 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

402 
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

403 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

404 
if (len < 8) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

405 
goto parseEffect_unexpectedEOF; 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

406 
// !!! 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

407 
readui32(&ptr, &len); 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

408 
readui32(&ptr, &len); 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

409 
} // for 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

410 
} // if 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

411 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

412 
if (numstates > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

413 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

414 
pass>state_count = numstates; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

415 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

416 
siz = sizeof (MOJOSHADER_effectState) * numstates; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

417 
pass>states = (MOJOSHADER_effectState *) m(siz, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

418 
if (pass>states == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

419 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

420 
memset(pass>states, '\0', siz); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

421 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

422 
for (k = 0; k < numstates; k++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

423 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

424 
if (len < 16) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

425 
goto parseEffect_unexpectedEOF; 
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 
MOJOSHADER_effectState *state = &pass>states[k]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

428 
const uint32 type = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

429 
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

430 
/*const uint32 offsetend = */ readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

431 
/*const uint32 offsetstart = */ readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

432 
state>type = type; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

433 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

434 
if ((type == 0x92)  (type == 0x93)) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

435 
numshaders++; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

436 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

437 
} // if 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

438 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

439 
} // if 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

440 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

441 
} // if 
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 
// textures... 
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 
const int numtextures = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

449 
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

450 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

451 
if (numtextures > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

452 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

453 
siz = sizeof (MOJOSHADER_effectTexture) * numtextures; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

454 
retval>textures = m(siz, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

455 
if (retval>textures == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

456 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

457 
memset(retval>textures, '\0', siz); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

458 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

459 
for (i = 0; i < numtextures; i++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

460 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

461 
if (len < 8) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

462 
goto parseEffect_unexpectedEOF; 
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 
MOJOSHADER_effectTexture *texture = &retval>textures[i]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

465 
const uint32 texparam = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

466 
const uint32 texsize = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

467 
// 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

468 
const uint32 readsize = (((texsize + 3) / 4) * 4); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

469 
if (len < readsize) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

470 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

471 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

472 
texture>param = texparam; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

473 
char *str = m(texsize + 1, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

474 
if (str == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

475 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

476 
memcpy(str, ptr, texsize); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

477 
str[texsize] = '\0'; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

478 
texture>name = str; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

479 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

480 
ptr += readsize; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

481 
len = readsize; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

482 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

483 
} // if 
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 
// shaders... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

486 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

487 
if (numshaders > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

488 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

489 
siz = sizeof (MOJOSHADER_effectShader) * numshaders; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

490 
retval>shaders = (MOJOSHADER_effectShader *) m(siz, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

491 
if (retval>shaders == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

492 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

493 
memset(retval>shaders, '\0', siz); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

494 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

495 
retval>shader_count = numshaders; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

496 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

497 
// !!! 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

498 
// !!! 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

499 
for (i = 0; i < numshaders; i++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

500 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

501 
if (len < 24) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

502 
goto parseEffect_unexpectedEOF; 
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 
MOJOSHADER_effectShader *shader = &retval>shaders[i]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

505 
const uint32 technique = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

506 
const uint32 pass = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

507 
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

508 
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

509 
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

510 
const uint32 shadersize = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

511 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

512 
if (len < shadersize) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

513 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

514 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

515 
shader>technique = technique; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

516 
shader>pass = pass; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

517 
shader>shader = MOJOSHADER_parse(profile, ptr, shadersize, 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

518 
swiz, swizcount, m, f, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

519 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

520 
// !!! FIXME: check for errors. 
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 
ptr += shadersize; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

523 
len = shadersize; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

524 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

525 
} // if 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

526 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

527 
// !!! 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

528 
// mappings ... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

529 
assert(numshaders <= numobjects); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

530 
const uint32 nummappings = numobjects  numshaders; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

531 
if (nummappings > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

532 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

533 
for (i = 0; i < nummappings; i++) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

534 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

535 
if (len < 24) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

536 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

537 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

538 
/*const uint32 magic = */ readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

539 
/*const uint32 index = */ readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

540 
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

541 
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

542 
/*const uint32 type = */ readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

543 
const uint32 mapsize = readui32(&ptr, &len); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

544 
if (mapsize > 0) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

545 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

546 
const uint32 readsize = (((mapsize + 3) / 4) * 4); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

547 
if (len < readsize) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

548 
goto parseEffect_unexpectedEOF; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

549 
} // if 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

550 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

551 
} // if 
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 
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

554 
if (retval>profile == NULL) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

555 
goto parseEffect_outOfMemory; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

556 
strcpy((char *) retval>profile, profile); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

557 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

558 
return retval; 
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 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

561 
// !!! FIXME: do something with this. 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

562 
parseEffect_notAnEffectsFile: 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

563 
parseEffect_unexpectedEOF: 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

564 
parseEffect_outOfMemory: 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

565 
MOJOSHADER_freeEffect(retval); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

566 
return &MOJOSHADER_out_of_mem_effect; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

567 
} // MOJOSHADER_parseEffect 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

568 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

569 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

570 
void MOJOSHADER_freeEffect(const MOJOSHADER_effect *_effect) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

571 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

572 
MOJOSHADER_effect *effect = (MOJOSHADER_effect *) _effect; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

573 
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

574 
return; // noop. 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

575 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

576 
MOJOSHADER_free f = effect>free; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

577 
void *d = effect>malloc_data; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

578 
int i, j; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

579 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

580 
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

581 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

582 
f((void *) effect>errors[i].error, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

583 
f((void *) effect>errors[i].filename, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

584 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

585 
f((void *) effect>errors, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

586 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

587 
f((void *) effect>profile, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

588 

1037
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

589 
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

590 
{ 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

591 
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

592 
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

593 
} // for 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

594 
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

595 

1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

596 
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

597 
{ 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

598 
MOJOSHADER_effectTechnique *technique = &effect>techniques[i]; 
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset

599 
f((void *) technique>name, d); 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

600 
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

601 
{ 
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset

602 
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

603 
f(technique>passes[j].states, d); 
1021
cad933999680
Fixed memory leak in MOJOSHADER_freeEffect().
Ryan C. Gordon <icculus@icculus.org>
parents:
1019
diff
changeset

604 
} // for 
1019
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

605 
f(technique>passes, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

606 
} // for 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

607 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

608 
f(effect>techniques, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

609 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

610 
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

611 
f((void *) effect>textures[i].name, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

612 
f(effect>textures, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

613 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

614 
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

615 
MOJOSHADER_freeParseData(effect>shaders[i].shader); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

616 
f(effect>shaders, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

617 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

618 
f(effect, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

619 
} // MOJOSHADER_freeEffect 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

620 

e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

621 
// end of mojoshader_effects.c ... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

622 