1 /*---------------------------------------------------------------------------*
2 Project: Dolphin GD library
3 File: GDTexture.h
4
5 Copyright 2001 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Log: GDTexture.h,v $
14 Revision 1.3 2006/02/04 11:56:46 hashida
15 (none)
16
17 Revision 1.2 2006/02/03 05:26:28 hirose
18 Updated for longer memory support.
19
20 Revision 1.1.1.1 2005/05/12 02:41:07 yasuh-to
21 Ported from dolphin source tree.
22
23
24 3 2001/10/13 2:22a Hirose
25 Changed GDSetTexCoordScale function.
26
27 2 2001/10/04 4:46p Carl
28 Added GDLoadTlut, etc.
29
30 1 2001/09/12 1:55p Carl
31 Initial revision of GD: Graphics Display List Library.
32
33 $NoKeywords: $
34 *---------------------------------------------------------------------------*/
35
36 #ifndef __GDTEXTURE_H__
37 #define __GDTEXTURE_H__
38
39 /*---------------------------------------------------------------------------*/
40 #include <revolution/types.h>
41 #include <revolution/gx/GXEnum.h>
42 /*---------------------------------------------------------------------------*/
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /*---------------------------------------------------------------------------*/
49
50 #define GX_TMEM_HALF 524288
51 #define GX_TMEM_MAX 1048576
52
53 /*---------------------------------------------------------------------------*/
54
55 void GDSetTexLookupMode (
56 GXTexMapID id,
57 GXTexWrapMode wrap_s,
58 GXTexWrapMode wrap_t,
59 GXTexFilter min_filt,
60 GXTexFilter mag_filt,
61 f32 min_lod,
62 f32 max_lod,
63 f32 lod_bias,
64 GXBool bias_clamp,
65 GXBool do_edge_lod,
66 GXAnisotropy max_aniso );
67
68 void GDSetTexImgAttr ( GXTexMapID id, u16 width, u16 height, GXTexFmt format );
69 void GDSetTexImgPtr ( GXTexMapID id, void *image_ptr );
70 void GDSetTexImgPtrRaw ( GXTexMapID id, u32 image_ptr_raw );
71 void GDPatchTexImgPtr ( void *image_ptr );
72
73 void GDSetTexTlut ( GXTexMapID id, u32 tmem_addr, GXTlutFmt format );
74
75 void GDSetTexCached ( GXTexMapID id,
76 u32 tmem_even, GXTexCacheSize size_even,
77 u32 tmem_odd, GXTexCacheSize size_odd );
78
79 void GDSetTexPreLoaded ( GXTexMapID id, u32 tmem_even, u32 tmem_odd );
80
81 void GDSetTexCoordScale ( GXTexCoordID coord, u16 s_scale, u16 t_scale );
82
83 void GDSetTexCoordScale2 ( GXTexCoordID coord,
84 u16 s_scale, GXBool s_bias, GXBool s_wrap,
85 u16 t_scale, GXBool t_bias, GXBool t_wrap);
86
87 void GDSetTexCoordScaleAndTOEs ( GXTexCoordID coord,
88 u16 s_scale, GXBool s_bias, GXBool s_wrap,
89 u16 t_scale, GXBool t_bias, GXBool t_wrap,
90 GXBool line_offset, GXBool point_offset);
91
92 void GDLoadTlut ( void *tlut_ptr, u32 tmem_addr, GXTlutSize size );
93 void GDLoadTlutRaw ( u32 tlut_ptr_raw, u32 tmem_addr, GXTlutSize size );
94 static inline void GDPatchTlutPtr ( void *tlut_ptr );
95
96 /*---------------------------------------------------------------------------*/
97
98 // This uses the same code as GDPatchTexImgPtr:
GDPatchTlutPtr(void * tlut_ptr)99 static inline void GDPatchTlutPtr ( void *tlut_ptr )
100 {
101 GDPatchTexImgPtr( tlut_ptr );
102 }
103
104 /*---------------------------------------------------------------------------*/
105
106 // Defines for setting texture registers...
107
108 //
109 // tx_setmode0 register
110 //
111 #define TX_SETMODE0_WRAP_S_SHIFT 0
112 #define TX_SETMODE0_WRAP_T_SHIFT 2
113 #define TX_SETMODE0_MAG_FILTER_SHIFT 4
114 #define TX_SETMODE0_MIN_FILTER_SHIFT 5
115 #define TX_SETMODE0_DIAGLOD_SHIFT 8
116 #define TX_SETMODE0_LODBIAS_SHIFT 9
117 #define TX_SETMODE0_MAXANISO_SHIFT 19
118 #define TX_SETMODE0_LODCLAMP_SHIFT 21
119 #define TX_SETMODE0_RID_SHIFT 24
120 #define TX_SETMODE0(wrap_s, wrap_t, mag_filter, min_filter, diaglod, lodbias, maxaniso, lodclamp, rid) \
121 ((((u32)(wrap_s)) << TX_SETMODE0_WRAP_S_SHIFT) | \
122 (((u32)(wrap_t)) << TX_SETMODE0_WRAP_T_SHIFT) | \
123 (((u32)(mag_filter)) << TX_SETMODE0_MAG_FILTER_SHIFT) | \
124 (((u32)(min_filter)) << TX_SETMODE0_MIN_FILTER_SHIFT) | \
125 (((u32)(diaglod)) << TX_SETMODE0_DIAGLOD_SHIFT) | \
126 (((u32)(lodbias)) << TX_SETMODE0_LODBIAS_SHIFT) | \
127 (((u32)(maxaniso)) << TX_SETMODE0_MAXANISO_SHIFT) | \
128 (((u32)(lodclamp)) << TX_SETMODE0_LODCLAMP_SHIFT) | \
129 (((u32)(rid)) << TX_SETMODE0_RID_SHIFT))
130
131 //
132 // tx_setmode1 register
133 //
134 #define TX_SETMODE1_MINLOD_SHIFT 0
135 #define TX_SETMODE1_MAXLOD_SHIFT 8
136 #define TX_SETMODE1_RID_SHIFT 24
137 #define TX_SETMODE1(minlod, maxlod, rid) \
138 ((((u32)(minlod)) << TX_SETMODE1_MINLOD_SHIFT) | \
139 (((u32)(maxlod)) << TX_SETMODE1_MAXLOD_SHIFT) | \
140 (((u32)(rid)) << TX_SETMODE1_RID_SHIFT))
141
142 //
143 // tx_setimage0 register
144 //
145 #define TX_SETIMAGE0_WIDTH_SHIFT 0
146 #define TX_SETIMAGE0_HEIGHT_SHIFT 10
147 #define TX_SETIMAGE0_FORMAT_SHIFT 20
148 #define TX_SETIMAGE0_RID_SHIFT 24
149 #define TX_SETIMAGE0(width, height, format, rid) \
150 ((((u32)(width)) << TX_SETIMAGE0_WIDTH_SHIFT) | \
151 (((u32)(height)) << TX_SETIMAGE0_HEIGHT_SHIFT) | \
152 (((u32)(format)) << TX_SETIMAGE0_FORMAT_SHIFT) | \
153 (((u32)(rid)) << TX_SETIMAGE0_RID_SHIFT))
154
155 //
156 // tx_setimage1 register
157 //
158 #define TX_SETIMAGE1_TMEM_OFFSET_SHIFT 0
159 #define TX_SETIMAGE1_CACHE_WIDTH_SHIFT 15
160 #define TX_SETIMAGE1_CACHE_HEIGHT_SHIFT 18
161 #define TX_SETIMAGE1_IMAGE_TYPE_SHIFT 21
162 #define TX_SETIMAGE1_RID_SHIFT 24
163 #define TX_SETIMAGE1(tmem_offset, cache_width, cache_height, image_type, rid) \
164 ((((u32)(tmem_offset)) << TX_SETIMAGE1_TMEM_OFFSET_SHIFT) | \
165 (((u32)(cache_width)) << TX_SETIMAGE1_CACHE_WIDTH_SHIFT) | \
166 (((u32)(cache_height)) << TX_SETIMAGE1_CACHE_HEIGHT_SHIFT) | \
167 (((u32)(image_type)) << TX_SETIMAGE1_IMAGE_TYPE_SHIFT) | \
168 (((u32)(rid)) << TX_SETIMAGE1_RID_SHIFT))
169
170 //
171 // tx_setimage2 register
172 //
173 #define TX_SETIMAGE2_TMEM_OFFSET_SHIFT 0
174 #define TX_SETIMAGE2_CACHE_WIDTH_SHIFT 15
175 #define TX_SETIMAGE2_CACHE_HEIGHT_SHIFT 18
176 #define TX_SETIMAGE2_RID_SHIFT 24
177 #define TX_SETIMAGE2(tmem_offset, cache_width, cache_height, rid) \
178 ((((u32)(tmem_offset)) << TX_SETIMAGE2_TMEM_OFFSET_SHIFT) | \
179 (((u32)(cache_width)) << TX_SETIMAGE2_CACHE_WIDTH_SHIFT) | \
180 (((u32)(cache_height)) << TX_SETIMAGE2_CACHE_HEIGHT_SHIFT) | \
181 (((u32)(rid)) << TX_SETIMAGE2_RID_SHIFT))
182
183 //
184 // tx_setimage3 register
185 //
186 #define TX_SETIMAGE3_IMAGE_BASE_SHIFT 0
187 #define TX_SETIMAGE3_RID_SHIFT 24
188 #define TX_SETIMAGE3(image_base, rid) \
189 ((((u32)(image_base)) << TX_SETIMAGE3_IMAGE_BASE_SHIFT) | \
190 (((u32)(rid)) << TX_SETIMAGE3_RID_SHIFT))
191
192 //
193 // tx_settlut register
194 //
195 #define TX_SETTLUT_TMEM_OFFSET_SHIFT 0
196 #define TX_SETTLUT_FORMAT_SHIFT 10
197 #define TX_SETTLUT_RID_SHIFT 24
198 #define TX_SETTLUT(tmem_offset, format, rid) \
199 ((((u32)(tmem_offset)) << TX_SETTLUT_TMEM_OFFSET_SHIFT) | \
200 (((u32)(format)) << TX_SETTLUT_FORMAT_SHIFT) | \
201 (((u32)(rid)) << TX_SETTLUT_RID_SHIFT))
202
203 //
204 // su_ts0 struct
205 //
206 #define SU_TS0_SSIZE_SHIFT 0
207 #define SU_TS0_BS_SHIFT 16
208 #define SU_TS0_WS_SHIFT 17
209 #define SU_TS0_LF_SHIFT 18
210 #define SU_TS0_PF_SHIFT 19
211 #define SU_TS0_RID_SHIFT 24
212 #define SU_TS0(ssize, bs, ws, lf, pf, rid) \
213 ((((u32)(ssize)) << SU_TS0_SSIZE_SHIFT) | \
214 (((u32)(bs)) << SU_TS0_BS_SHIFT) | \
215 (((u32)(ws)) << SU_TS0_WS_SHIFT) | \
216 (((u32)(lf)) << SU_TS0_LF_SHIFT) | \
217 (((u32)(pf)) << SU_TS0_PF_SHIFT) | \
218 (((u32)(rid)) << SU_TS0_RID_SHIFT))
219
220 //
221 // su_ts1 struct
222 //
223 #define SU_TS1_TSIZE_SHIFT 0
224 #define SU_TS1_BT_SHIFT 16
225 #define SU_TS1_WT_SHIFT 17
226 #define SU_TS1_RID_SHIFT 24
227 #define SU_TS1(tsize, bt, wt, rid) \
228 ((((u32)(tsize)) << SU_TS1_TSIZE_SHIFT) | \
229 (((u32)(bt)) << SU_TS1_BT_SHIFT) | \
230 (((u32)(wt)) << SU_TS1_WT_SHIFT) | \
231 (((u32)(rid)) << SU_TS1_RID_SHIFT))
232
233 //
234 // tx_loadtlut0 struct
235 //
236 #define TX_LOADTLUT0_TLUT_BASE_SHIFT 0
237 #define TX_LOADTLUT0_RID_SHIFT 24
238 #define TX_LOADTLUT0(tlut_base, rid) \
239 ((((unsigned long)(tlut_base)) << TX_LOADTLUT0_TLUT_BASE_SHIFT) | \
240 (((unsigned long)(rid)) << TX_LOADTLUT0_RID_SHIFT))
241
242 //
243 // tx_loadtlut1 struct
244 //
245 #define TX_LOADTLUT1_TMEM_OFFSET_SHIFT 0
246 #define TX_LOADTLUT1_COUNT_SHIFT 10
247 #define TX_LOADTLUT1_PAD0_SHIFT 21
248 #define TX_LOADTLUT1_RID_SHIFT 24
249 #define TX_LOADTLUT1(tmem_offset, count, rid) \
250 ((((unsigned long)(tmem_offset)) << TX_LOADTLUT1_TMEM_OFFSET_SHIFT) | \
251 (((unsigned long)(count)) << TX_LOADTLUT1_COUNT_SHIFT) | \
252 (((unsigned long)(rid)) << TX_LOADTLUT1_RID_SHIFT))
253
254
255 // These register ID's can also be found in GD or GX run-time arrays.
256 // However, we need these #define's here for compile-time access.
257 //
258 // The following are defined per texture ID
259 //
260 #define TX_SETMODE0_I0_ID 0x80
261 #define TX_SETMODE0_I1_ID 0x81
262 #define TX_SETMODE0_I2_ID 0x82
263 #define TX_SETMODE0_I3_ID 0x83
264 #define TX_SETMODE0_I4_ID 0xa0
265 #define TX_SETMODE0_I5_ID 0xa1
266 #define TX_SETMODE0_I6_ID 0xa2
267 #define TX_SETMODE0_I7_ID 0xa3
268
269 #define TX_SETMODE1_I0_ID 0x84
270 #define TX_SETMODE1_I1_ID 0x85
271 #define TX_SETMODE1_I2_ID 0x86
272 #define TX_SETMODE1_I3_ID 0x87
273 #define TX_SETMODE1_I4_ID 0xa4
274 #define TX_SETMODE1_I5_ID 0xa5
275 #define TX_SETMODE1_I6_ID 0xa6
276 #define TX_SETMODE1_I7_ID 0xa7
277
278 #define TX_SETIMAGE0_I0_ID 0x88
279 #define TX_SETIMAGE0_I1_ID 0x89
280 #define TX_SETIMAGE0_I2_ID 0x8a
281 #define TX_SETIMAGE0_I3_ID 0x8b
282 #define TX_SETIMAGE0_I4_ID 0xa8
283 #define TX_SETIMAGE0_I5_ID 0xa9
284 #define TX_SETIMAGE0_I6_ID 0xaa
285 #define TX_SETIMAGE0_I7_ID 0xab
286
287 #define TX_SETIMAGE1_I0_ID 0x8c
288 #define TX_SETIMAGE1_I1_ID 0x8d
289 #define TX_SETIMAGE1_I2_ID 0x8e
290 #define TX_SETIMAGE1_I3_ID 0x8f
291 #define TX_SETIMAGE1_I4_ID 0xac
292 #define TX_SETIMAGE1_I5_ID 0xad
293 #define TX_SETIMAGE1_I6_ID 0xae
294 #define TX_SETIMAGE1_I7_ID 0xaf
295
296 #define TX_SETIMAGE2_I0_ID 0x90
297 #define TX_SETIMAGE2_I1_ID 0x91
298 #define TX_SETIMAGE2_I2_ID 0x92
299 #define TX_SETIMAGE2_I3_ID 0x93
300 #define TX_SETIMAGE2_I4_ID 0xb0
301 #define TX_SETIMAGE2_I5_ID 0xb1
302 #define TX_SETIMAGE2_I6_ID 0xb2
303 #define TX_SETIMAGE2_I7_ID 0xb3
304
305 #define TX_SETIMAGE3_I0_ID 0x94
306 #define TX_SETIMAGE3_I1_ID 0x95
307 #define TX_SETIMAGE3_I2_ID 0x96
308 #define TX_SETIMAGE3_I3_ID 0x97
309 #define TX_SETIMAGE3_I4_ID 0xb4
310 #define TX_SETIMAGE3_I5_ID 0xb5
311 #define TX_SETIMAGE3_I6_ID 0xb6
312 #define TX_SETIMAGE3_I7_ID 0xb7
313
314 #define TX_SETTLUT_I0_ID 0x98
315 #define TX_SETTLUT_I1_ID 0x99
316 #define TX_SETTLUT_I2_ID 0x9a
317 #define TX_SETTLUT_I3_ID 0x9b
318 #define TX_SETTLUT_I4_ID 0xb8
319 #define TX_SETTLUT_I5_ID 0xb9
320 #define TX_SETTLUT_I6_ID 0xba
321 #define TX_SETTLUT_I7_ID 0xbb
322
323 // The following are defined per texcoord
324
325 #define SU_SSIZE0_ID 0x30
326 #define SU_TSIZE0_ID 0x31
327 #define SU_SSIZE1_ID 0x32
328 #define SU_TSIZE1_ID 0x33
329 #define SU_SSIZE2_ID 0x34
330 #define SU_TSIZE2_ID 0x35
331 #define SU_SSIZE3_ID 0x36
332 #define SU_TSIZE3_ID 0x37
333 #define SU_SSIZE4_ID 0x38
334 #define SU_TSIZE4_ID 0x39
335 #define SU_SSIZE5_ID 0x3a
336 #define SU_TSIZE5_ID 0x3b
337 #define SU_SSIZE6_ID 0x3c
338 #define SU_TSIZE6_ID 0x3d
339 #define SU_SSIZE7_ID 0x3e
340 #define SU_TSIZE7_ID 0x3f
341
342 // The following are non-ID specific:
343
344 #define TX_LOADTLUT0_ID 0x64
345 #define TX_LOADTLUT1_ID 0x65
346 #define BU_IMASK_ID 0x0f
347
348 /*---------------------------------------------------------------------------*/
349 #ifdef __cplusplus
350 }
351 #endif
352
353 #endif // __GDTEXTURE_H__
354