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