author  Ryan C. Gordon <icculus@icculus.org> 
Wed, 01 Jun 2011 13:22:21 0400  
changeset 1046  097aefb03885 
parent 1045  448766b7c981 
child 1047  6b92ce2fc809 
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 

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

23 
double *temps = (double *) alloca(sizeof (double) * preshader>temp_count); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

24 
memset(temps, '\0', sizeof (double) * preshader>temp_count); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

25 

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

26 
double dst[4]; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

27 
double src[3][4]; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

29 
const double *src1 = src[1]; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

31 

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

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

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

34 

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

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

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

37 
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

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

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

40 
const int elemsbytes = sizeof (double) * elems; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

41 

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

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

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

44 
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

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

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

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

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

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

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

51 
const double *lit = &preshader>literals[index]; 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

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

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

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

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

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

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

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

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

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

62 

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

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

64 
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

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

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

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

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

69 
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

70 
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

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

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

73 

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

74 
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

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

76 
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

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

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

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

80 
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

81 
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

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

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

84 

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

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

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

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

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

89 
memcpy(src[opiter], temps + index, elemsbytes); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

91 

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

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

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

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

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

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

97 

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

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

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

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

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

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

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

104 
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

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

106 

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

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

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

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

110 
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

111 
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

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

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

114 
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

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

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

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

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

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

120 
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

121 
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

122 
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

123 
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

124 
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

125 
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

126 
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

127 
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

128 
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

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

130 
//OPCODE_CASE(MOVC, ???) // !!! FIXME: don't know what this does 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

132 

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

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

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

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

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

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

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

139 
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

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

141 

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

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

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

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

145 
for (i = 0; i < elems; i++) { dst[i] = final; } \ 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

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

148 

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

149 
OPCODE_CASE_SCALAR(MIN, (src0[0] < src1[0]) ? src0[0] : src1[0]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

150 
OPCODE_CASE_SCALAR(MAX, (src0[0] > src1[0]) ? src0[0] : src1[0]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

151 
OPCODE_CASE_SCALAR(LT, (src0[0] < src1[0]) ? 1.0 : 0.0) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

152 
OPCODE_CASE_SCALAR(GE, (src0[0] >= src1[0]) ? 1.0 : 0.0) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

153 
OPCODE_CASE_SCALAR(ADD, src0[0] + src1[0]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

154 
OPCODE_CASE_SCALAR(MUL, src0[0] * src1[0]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

155 
OPCODE_CASE_SCALAR(ATAN2, atan2(src0[0], src1[0])) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

156 
OPCODE_CASE_SCALAR(DIV, src0[0] / src1[0]) 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

157 
//OPCODE_CASE_SCALAR(DOT) // !!! FIXME: isn't this just a MUL? 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

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

160 

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

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

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

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

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

165 

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

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

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

168 
memcpy(temps + operand>index, dst, elemsbytes); 
8a3597b44ff7
First shot at preshader interpreter. Completely untested!
Ryan C. Gordon <icculus@icculus.org>
parents:
1021
diff
changeset

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

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

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

172 
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

173 
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

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

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

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

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

178 

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

179 
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

180 
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

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

182 

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

183 
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

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

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

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

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

188 
else 
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 
const uint32 *ptr = (const uint32 *) *_ptr; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

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

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

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

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

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

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

197 

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

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

199 
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

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

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

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

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

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

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

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

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

208 
if ( ((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

209 
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

210 

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

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

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

213 

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

214 
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

215 
if (retval == 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 
memset(retval, '\0', sizeof (*retval)); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

218 

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

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

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

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

222 

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

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

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

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

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

227 

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

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

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

230 

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

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

232 
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

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

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

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

236 
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

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

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

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

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

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

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

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

244 

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

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

246 

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

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

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

249 

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

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

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

252 

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

253 
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

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

255 

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

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

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

258 
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

259 
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

260 
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

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

262 
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

263 

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

264 
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

265 

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

266 
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

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

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

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

270 

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

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

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

273 
/*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

274 
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

275 
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

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

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

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

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

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

281 
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 
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 
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

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

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

287 
/*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

288 
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

289 
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

290 

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

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

292 
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

293 
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

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

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

296 
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

297 
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

298 
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

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

300 
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

301 
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

302 
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

303 
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

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

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

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

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

308 

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

309 
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

310 

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

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

312 

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

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

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

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

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

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

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

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

320 

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

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

322 

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

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

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

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

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

327 

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

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

329 

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

330 
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

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

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

333 

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

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

335 
goto parseEffect_unexpectedEOF; 
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 
if (numannos > 0) 
b102a563d9cb
Filled in and fixed some stuff in the Effect parser.
Ryan C. Gordon <icculus@icculus.org>
parents:
1036
diff
changeset

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

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

340 
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

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

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

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

344 
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

345 
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

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

347 
} // if 
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 
// !!! 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

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

351 
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

352 
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

353 
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

354 
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

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

356 
technique>name = strptr; 
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 

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

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

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

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

362 

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

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

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

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

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

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

368 

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

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

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

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

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

373 

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

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

375 

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

376 
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

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

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

379 

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

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

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

382 

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

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

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

385 
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

386 
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

387 
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

388 
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

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

390 
pass>name = strptr; 
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 

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

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

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

395 
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

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

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

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

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

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

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

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

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

404 

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

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

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

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

408 

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

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

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

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

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

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

414 

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

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

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

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

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

419 

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

420 
MOJOSHADER_effectState *state = &pass>states[k]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

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

422 
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

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

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

425 
state>type = type; 
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 
if ((type == 0x92)  (type == 0x93)) 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

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

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

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

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

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

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

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

435 

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

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

437 

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

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

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

440 

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

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

442 
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

443 

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

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

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

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

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

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

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

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

451 

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

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

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

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

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

456 

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

457 
MOJOSHADER_effectTexture *texture = &retval>textures[i]; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

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

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

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

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

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

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

464 

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

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

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

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

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

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

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

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

472 

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

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

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

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

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

477 

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

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

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

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

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

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

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

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

487 

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

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

489 

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

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

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

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

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

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

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

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

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

500 
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

501 
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

502 
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

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

504 

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

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

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

507 

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

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

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

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

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

512 

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

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

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

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

518 
} // if 
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: 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

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

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

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

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

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

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

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

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

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

530 

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

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

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

533 
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

534 
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

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

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

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

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

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

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

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

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

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

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

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

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

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

550 

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

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

552 

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

553 

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

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

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

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

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

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

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

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

561 

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

562 

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

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

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

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

566 
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

567 
return; // noop. 
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 
MOJOSHADER_free f = effect>free; 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

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

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

572 

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

573 
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

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

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

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

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

578 
f((void *) effect>errors, d); 
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 
f((void *) effect>profile, d); 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

581 

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

582 
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

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

584 
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

585 
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

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

587 
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

588 

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

589 
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

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

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

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

593 
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

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

595 
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

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

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

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

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

600 

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

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

602 

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

603 
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

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

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

606 

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

607 
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

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

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

610 

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

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

612 
} // MOJOSHADER_freeEffect 
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 
// end of mojoshader_effects.c ... 
e8988ca01c6d
Initial work on parsing binary Effects files.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset

615 