1
2 #ifndef _NINE_FF_H_
3 #define _NINE_FF_H_
4
5 #include "device9.h"
6 #include "vertexdeclaration9.h"
7
8 boolean nine_ff_init(struct NineDevice9 *);
9 void nine_ff_fini(struct NineDevice9 *);
10
11 void nine_ff_update(struct NineDevice9 *);
12
13 void
14 nine_d3d_matrix_matrix_mul(D3DMATRIX *, const D3DMATRIX *, const D3DMATRIX *);
15
16 void
17 nine_d3d_vector4_matrix_mul(D3DVECTOR *, const D3DVECTOR *, const D3DMATRIX *);
18 void
19 nine_d3d_vector3_matrix_mul(D3DVECTOR *, const D3DVECTOR *, const D3DMATRIX *);
20
21 float
22 nine_d3d_matrix_det(const D3DMATRIX *);
23
24 void
25 nine_d3d_matrix_inverse(D3DMATRIX *, const D3DMATRIX *);
26
27 void
28 nine_d3d_matrix_transpose(D3DMATRIX *, const D3DMATRIX *);
29
30 #define NINED3DTSS_TCI_DISABLE 0
31 #define NINED3DTSS_TCI_PASSTHRU 1
32 #define NINED3DTSS_TCI_CAMERASPACENORMAL 2
33 #define NINED3DTSS_TCI_CAMERASPACEPOSITION 3
34 #define NINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 4
35 #define NINED3DTSS_TCI_SPHEREMAP 5
36
37 static inline unsigned
nine_decltype_get_dim(BYTE type)38 nine_decltype_get_dim(BYTE type)
39 {
40 switch (type) {
41 case D3DDECLTYPE_FLOAT1: return 1;
42 case D3DDECLTYPE_FLOAT2: return 2;
43 case D3DDECLTYPE_FLOAT3: return 3;
44 case D3DDECLTYPE_FLOAT4: return 4;
45 case D3DDECLTYPE_D3DCOLOR: return 1;
46 case D3DDECLTYPE_UBYTE4: return 4;
47 case D3DDECLTYPE_SHORT2: return 2;
48 case D3DDECLTYPE_SHORT4: return 4;
49 case D3DDECLTYPE_UBYTE4N: return 4;
50 case D3DDECLTYPE_SHORT2N: return 2;
51 case D3DDECLTYPE_SHORT4N: return 4;
52 case D3DDECLTYPE_USHORT2N: return 2;
53 case D3DDECLTYPE_USHORT4N: return 4;
54 case D3DDECLTYPE_UDEC3: return 3;
55 case D3DDECLTYPE_DEC3N: return 3;
56 case D3DDECLTYPE_FLOAT16_2: return 2;
57 case D3DDECLTYPE_FLOAT16_4: return 4;
58 default:
59 assert(!"Implementation error !");
60 }
61 return 0;
62 }
63
64 static inline uint16_t
nine_ff_get_projected_key(struct nine_context * context,unsigned num_stages)65 nine_ff_get_projected_key(struct nine_context *context, unsigned num_stages)
66 {
67 unsigned s, i;
68 uint16_t projected = 0;
69 int8_t input_texture_coord[num_stages];
70 memset(&input_texture_coord, 0, sizeof(input_texture_coord));
71
72 if (context->vdecl) {
73 for (i = 0; i < context->vdecl->nelems; i++) {
74 uint16_t usage = context->vdecl->usage_map[i];
75 if (usage % NINE_DECLUSAGE_COUNT == NINE_DECLUSAGE_TEXCOORD) {
76 s = usage / NINE_DECLUSAGE_COUNT;
77 if (s < num_stages)
78 input_texture_coord[s] = nine_decltype_get_dim(context->vdecl->decls[i].Type);
79 }
80 }
81 }
82
83 for (s = 0; s < num_stages; ++s) {
84 unsigned gen = (context->ff.tex_stage[s][D3DTSS_TEXCOORDINDEX] >> 16) + 1;
85 unsigned dim = context->ff.tex_stage[s][D3DTSS_TEXTURETRANSFORMFLAGS] & 0x7;
86 unsigned proj = !!(context->ff.tex_stage[s][D3DTSS_TEXTURETRANSFORMFLAGS] & D3DTTFF_PROJECTED);
87
88 if (!context->vs) {
89 if (dim > 4)
90 dim = input_texture_coord[s];
91
92 if (!dim && gen == NINED3DTSS_TCI_PASSTHRU)
93 dim = input_texture_coord[s];
94 else if (!dim)
95 dim = 4;
96
97 if (dim == 1) /* NV behaviour */
98 proj = 0;
99 if (dim > input_texture_coord[s] && gen == NINED3DTSS_TCI_PASSTHRU)
100 proj = 0;
101 } else {
102 dim = 4;
103 }
104 if (proj)
105 projected |= (dim-1) << (2 * s);
106 }
107 return projected;
108 }
109
110 static inline uint16_t
nine_ff_get_projected_key_ff(struct nine_context * context)111 nine_ff_get_projected_key_ff(struct nine_context *context)
112 {
113 /* 8 stages */
114 return nine_ff_get_projected_key(context, 8);
115 }
116
117 static inline uint8_t
nine_ff_get_projected_key_programmable(struct nine_context * context)118 nine_ff_get_projected_key_programmable(struct nine_context *context)
119 {
120 /* We only look at the 4 stages because this function
121 * is used only for ps 1.1-3, where only the first four
122 * slots are available */
123 return (uint8_t)nine_ff_get_projected_key(context, 4);
124 }
125
126 #endif /* _NINE_FF_H_ */
127