summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/XFMemory.h
blob: 99d01f2d450ba4cb888947f91ddb9fac7b53e428 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
// Copyright 2008 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include "Common/CommonTypes.h"
#include "VideoCommon/CPMemory.h"

class DataReader;

// Lighting

// Projection
enum : u32
{
	XF_TEXPROJ_ST  = 0,
	XF_TEXPROJ_STQ = 1
};

// Input form
enum : u32
{
	XF_TEXINPUT_AB11 = 0,
	XF_TEXINPUT_ABC1 = 1
};

// Texture generation type
enum : u32
{
	XF_TEXGEN_REGULAR       = 0,
	XF_TEXGEN_EMBOSS_MAP    = 1, // Used when bump mapping
	XF_TEXGEN_COLOR_STRGBC0 = 2,
	XF_TEXGEN_COLOR_STRGBC1 = 3
};

// Source row
enum : u32
{
	XF_SRCGEOM_INROW       = 0, // Input is abc
	XF_SRCNORMAL_INROW     = 1, // Input is abc
	XF_SRCCOLORS_INROW     = 2,
	XF_SRCBINORMAL_T_INROW = 3, // Input is abc
	XF_SRCBINORMAL_B_INROW = 4, // Input is abc
	XF_SRCTEX0_INROW       = 5,
	XF_SRCTEX1_INROW       = 6,
	XF_SRCTEX2_INROW       = 7,
	XF_SRCTEX3_INROW       = 8,
	XF_SRCTEX4_INROW       = 9,
	XF_SRCTEX5_INROW       = 10,
	XF_SRCTEX6_INROW       = 11,
	XF_SRCTEX7_INROW       = 12
};

// Control source
enum : u32
{
	GX_SRC_REG = 0,
	GX_SRC_VTX = 1
};

// Light diffuse attenuation function
enum : u32
{
	LIGHTDIF_NONE  = 0,
	LIGHTDIF_SIGN  = 1,
	LIGHTDIF_CLAMP = 2
};

// Light attenuation function
enum : u32
{
	LIGHTATTN_NONE = 0, // No attenuation
	LIGHTATTN_SPEC = 1, // Point light attenuation
	LIGHTATTN_DIR  = 2, // Directional light attenuation
	LIGHTATTN_SPOT = 3  // Spot light attenuation
};

// Projection type
enum : u32
{
	GX_PERSPECTIVE  = 0,
	GX_ORTHOGRAPHIC = 1
};

// Registers and register ranges
enum
{
	XFMEM_POSMATRICES         = 0x000,
	XFMEM_POSMATRICES_END     = 0x100,
	XFMEM_NORMALMATRICES      = 0x400,
	XFMEM_NORMALMATRICES_END  = 0x460,
	XFMEM_POSTMATRICES        = 0x500,
	XFMEM_POSTMATRICES_END    = 0x600,
	XFMEM_LIGHTS              = 0x600,
	XFMEM_LIGHTS_END          = 0x680,
	XFMEM_ERROR               = 0x1000,
	XFMEM_DIAG                = 0x1001,
	XFMEM_STATE0              = 0x1002,
	XFMEM_STATE1              = 0x1003,
	XFMEM_CLOCK               = 0x1004,
	XFMEM_CLIPDISABLE         = 0x1005,
	XFMEM_SETGPMETRIC         = 0x1006,
	XFMEM_VTXSPECS            = 0x1008,
	XFMEM_SETNUMCHAN          = 0x1009,
	XFMEM_SETCHAN0_AMBCOLOR   = 0x100a,
	XFMEM_SETCHAN1_AMBCOLOR   = 0x100b,
	XFMEM_SETCHAN0_MATCOLOR   = 0x100c,
	XFMEM_SETCHAN1_MATCOLOR   = 0x100d,
	XFMEM_SETCHAN0_COLOR      = 0x100e,
	XFMEM_SETCHAN1_COLOR      = 0x100f,
	XFMEM_SETCHAN0_ALPHA      = 0x1010,
	XFMEM_SETCHAN1_ALPHA      = 0x1011,
	XFMEM_DUALTEX             = 0x1012,
	XFMEM_SETMATRIXINDA       = 0x1018,
	XFMEM_SETMATRIXINDB       = 0x1019,
	XFMEM_SETVIEWPORT         = 0x101a,
	XFMEM_SETZSCALE           = 0x101c,
	XFMEM_SETZOFFSET          = 0x101f,
	XFMEM_SETPROJECTION       = 0x1020,
	// XFMEM_SETPROJECTIONB      = 0x1021,
	// XFMEM_SETPROJECTIONC      = 0x1022,
	// XFMEM_SETPROJECTIOND      = 0x1023,
	// XFMEM_SETPROJECTIONE      = 0x1024,
	// XFMEM_SETPROJECTIONF      = 0x1025,
	// XFMEM_SETPROJECTIONORTHO1 = 0x1026,
	// XFMEM_SETPROJECTIONORTHO2 = 0x1027,
	XFMEM_SETNUMTEXGENS       = 0x103f,
	XFMEM_SETTEXMTXINFO       = 0x1040,
	XFMEM_SETPOSMTXINFO       = 0x1050,
};

union LitChannel
{
	struct
	{
		u32 matsource      : 1;
		u32 enablelighting : 1;
		u32 lightMask0_3   : 4;
		u32 ambsource      : 1;
		u32 diffusefunc    : 2; // LIGHTDIF_X
		u32 attnfunc       : 2; // LIGHTATTN_X
		u32 lightMask4_7   : 4;
	};
	struct
	{
		u32 hex : 15;
		u32 unused : 17;
	};
	struct
	{
		u32 dummy0 : 7;
		u32 lightparams : 4;
		u32 dummy1 : 21;
	};
	unsigned int GetFullLightMask() const
	{
		return enablelighting ? (lightMask0_3 | (lightMask4_7 << 4)) : 0;
	}
};


union INVTXSPEC
{
	struct
	{
		u32 numcolors   : 2;
		u32 numnormals  : 2; // 0 - nothing, 1 - just normal, 2 - normals and binormals
		u32 numtextures : 4;
		u32 unused : 24;
	};
	u32 hex;
};

union TexMtxInfo
{
	struct
	{
		u32 unknown    : 1;
		u32 projection : 1; // XF_TEXPROJ_X
		u32 inputform  : 1; // XF_TEXINPUT_X
		u32 unknown2   : 1;
		u32 texgentype : 3; // XF_TEXGEN_X
		u32 sourcerow  : 5; // XF_SRCGEOM_X
		u32 embosssourceshift : 3; // what generated texcoord to use
		u32 embosslightshift  : 3; // light index that is used
	};
	u32 hex;
};

union PostMtxInfo
{
	struct
	{
		u32 index     : 6; // base row of dual transform matrix
		u32 unused    : 2;
		u32 normalize : 1; // normalize before send operation
	};
	u32 hex;
};

union NumColorChannel
{
	struct
	{
		u32 numColorChans : 2;
	};
	u32 hex;
};

union NumTexGen
{
	struct
	{
		u32 numTexGens : 4;
	};
	u32 hex;
};

union DualTexInfo
{
	struct
	{
		u32 enabled : 1;
	};
	u32 hex;
};



struct Light
{
	u32 useless[3];
	u8 color[4];
	float cosatt[3]; // cos attenuation
	float distatt[3]; // dist attenuation

	union
	{
		struct
		{
			float dpos[3];
			float ddir[3]; // specular lights only
		};

		struct
		{
			float sdir[3];
			float shalfangle[3]; // specular lights only
		};
	};
};

struct Viewport
{
	float wd;
	float ht;
	float zRange;
	float xOrig;
	float yOrig;
	float farZ;
};

struct Projection
{
	float rawProjection[6];
	u32 type;                      // only GX_PERSPECTIVE or GX_ORTHOGRAPHIC are allowed
};

struct XFMemory
{
	float posMatrices[256];         // 0x0000 - 0x00ff
	u32 unk0[768];                  // 0x0100 - 0x03ff
	float normalMatrices[96];       // 0x0400 - 0x045f
	u32 unk1[160];                  // 0x0460 - 0x04ff
	float postMatrices[256];        // 0x0500 - 0x05ff
	Light lights[8];                // 0x0600 - 0x067f
	u32 unk2[2432];                 // 0x0680 - 0x0fff
	u32 error;                      // 0x1000
	u32 diag;                       // 0x1001
	u32 state0;                     // 0x1002
	u32 state1;                     // 0x1003
	u32 xfClock;                    // 0x1004
	u32 clipDisable;                // 0x1005
	u32 perf0;                      // 0x1006
	u32 perf1;                      // 0x1007
	INVTXSPEC hostinfo;             // 0x1008 number of textures,colors,normals from vertex input
	NumColorChannel numChan;        // 0x1009
	u32 ambColor[2];                // 0x100a, 0x100b
	u32 matColor[2];                // 0x100c, 0x100d
	LitChannel color[2];            // 0x100e, 0x100f
	LitChannel alpha[2];            // 0x1010, 0x1011
	DualTexInfo dualTexTrans;       // 0x1012
	u32 unk3;                       // 0x1013
	u32 unk4;                       // 0x1014
	u32 unk5;                       // 0x1015
	u32 unk6;                       // 0x1016
	u32 unk7;                       // 0x1017
	TMatrixIndexA MatrixIndexA;     // 0x1018
	TMatrixIndexB MatrixIndexB;     // 0x1019
	Viewport viewport;              // 0x101a - 0x101f
	Projection projection;          // 0x1020 - 0x1026
	u32 unk8[24];                   // 0x1027 - 0x103e
	NumTexGen numTexGen;            // 0x103f
	TexMtxInfo texMtxInfo[8];       // 0x1040 - 0x1047
	u32 unk9[8];                    // 0x1048 - 0x104f
	PostMtxInfo postMtxInfo[8];     // 0x1050 - 0x1057
};


extern XFMemory xfmem;

void LoadXFReg(u32 transferSize, u32 address, DataReader src);
void LoadIndexedXF(u32 val, int array);
void PreprocessIndexedXF(u32 val, int refarray);