1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin GD library
3   File:     GDPIXEL.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: GDPixel.h,v $
14   Revision 1.2  2006/02/04 11:56:46  hashida
15   (none)
16 
17   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
18   Ported from dolphin source tree.
19 
20 
21     2     2001/10/13 2:22a Hirose
22     Added GDSetBlendMode().
23 
24     1     2001/09/12 1:55p Carl
25     Initial revision of GD: Graphics Display List Library.
26 
27   $NoKeywords: $
28  *---------------------------------------------------------------------------*/
29 
30 #ifndef __GDPIXEL_H__
31 #define __GDPIXEL_H__
32 
33 /*---------------------------------------------------------------------------*/
34 #include <revolution/types.h>
35 #include <revolution/gx/GXEnum.h>
36 #include <revolution/gx/GXStruct.h>
37 /*---------------------------------------------------------------------------*/
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 /*---------------------------------------------------------------------------*/
44 
45 
46 /*---------------------------------------------------------------------------*/
47 
48 void GDSetFog(
49     GXFogType   type,
50     f32         startz,
51     f32         endz,
52     f32         nearz,
53     f32         farz,
54     GXColor     color );
55 
56 void GDSetBlendMode(
57     GXBlendMode     type,
58     GXBlendFactor   src_factor,
59     GXBlendFactor   dst_factor,
60     GXLogicOp       logic_op );
61 
62 void GDSetBlendModeEtc(
63     GXBlendMode     type,
64     GXBlendFactor   src_factor,
65     GXBlendFactor   dst_factor,
66     GXLogicOp       logic_op,
67     GXBool          color_update_enable,
68     GXBool          alpha_update_enable,
69     GXBool          dither_enable );
70 
71 void GDSetZMode(
72     GXBool          compare_enable,
73     GXCompare       func,
74     GXBool          update_enable );
75 
76 void GDSetDstAlpha( GXBool enable, u8 alpha );
77 
78 void GDSetDrawSync( u16 token );
79 
80 /*---------------------------------------------------------------------------*/
81 
82 // Defines for setting PE (and some TEV) registers...
83 
84 /*
85  *  tev_fog_param_0 struct
86  */
87 #define TEV_FOG_PARAM_0_A_MANT_SHIFT    0
88 #define TEV_FOG_PARAM_0_A_EXPN_SHIFT    11
89 #define TEV_FOG_PARAM_0_A_SIGN_SHIFT    19
90 #define TEV_FOG_PARAM_0_RID_SHIFT   24
91 #define TEV_FOG_PARAM_0(a_mant, a_expn, a_sign, rid) \
92     ((((unsigned long)(a_mant)) << TEV_FOG_PARAM_0_A_MANT_SHIFT) | \
93      (((unsigned long)(a_expn)) << TEV_FOG_PARAM_0_A_EXPN_SHIFT) | \
94      (((unsigned long)(a_sign)) << TEV_FOG_PARAM_0_A_SIGN_SHIFT) | \
95      (((unsigned long)(rid)) << TEV_FOG_PARAM_0_RID_SHIFT))
96 
97 #define TEV_FOG_PARAM_0_PS(a_preshifted, rid) \
98     ( ((unsigned long)(a_preshifted)) | \
99      (((unsigned long)(rid)) << TEV_FOG_PARAM_0_RID_SHIFT))
100 
101 /*
102  *  tev_fog_param_1 struct
103  */
104 #define TEV_FOG_PARAM_1_B_MAG_SHIFT 0
105 #define TEV_FOG_PARAM_1_RID_SHIFT   24
106 #define TEV_FOG_PARAM_1(b_mag, rid) \
107     ((((unsigned long)(b_mag)) << TEV_FOG_PARAM_1_B_MAG_SHIFT) | \
108      (((unsigned long)(rid)) << TEV_FOG_PARAM_1_RID_SHIFT))
109 
110 /*
111  *  tev_fog_param_2 struct
112  */
113 #define TEV_FOG_PARAM_2_B_SHF_SHIFT 0
114 #define TEV_FOG_PARAM_2_RID_SHIFT   24
115 #define TEV_FOG_PARAM_2(b_shf, rid) \
116     ((((unsigned long)(b_shf)) << TEV_FOG_PARAM_2_B_SHF_SHIFT) | \
117      (((unsigned long)(rid)) << TEV_FOG_PARAM_2_RID_SHIFT))
118 
119 /*
120  *  tev_fog_param_3 struct
121  */
122 #define TEV_FOG_PARAM_3_C_MANT_SHIFT    0
123 #define TEV_FOG_PARAM_3_C_EXPN_SHIFT    11
124 #define TEV_FOG_PARAM_3_C_SIGN_SHIFT    19
125 #define TEV_FOG_PARAM_3_PROJ_SHIFT  20
126 #define TEV_FOG_PARAM_3_FSEL_SHIFT  21
127 #define TEV_FOG_PARAM_3_RID_SHIFT   24
128 #define TEV_FOG_PARAM_3(c_mant, c_expn, c_sign, proj, fsel, rid) \
129     ((((unsigned long)(c_mant)) << TEV_FOG_PARAM_3_C_MANT_SHIFT) | \
130      (((unsigned long)(c_expn)) << TEV_FOG_PARAM_3_C_EXPN_SHIFT) | \
131      (((unsigned long)(c_sign)) << TEV_FOG_PARAM_3_C_SIGN_SHIFT) | \
132      (((unsigned long)(proj)) << TEV_FOG_PARAM_3_PROJ_SHIFT) | \
133      (((unsigned long)(fsel)) << TEV_FOG_PARAM_3_FSEL_SHIFT) | \
134      (((unsigned long)(rid)) << TEV_FOG_PARAM_3_RID_SHIFT))
135 
136 #define TEV_FOG_PARAM_3_PS(c_preshifted, proj, fsel, rid) \
137     ( ((unsigned long)(c_preshifted)) | \
138      (((unsigned long)(proj)) << TEV_FOG_PARAM_3_PROJ_SHIFT) | \
139      (((unsigned long)(fsel)) << TEV_FOG_PARAM_3_FSEL_SHIFT) | \
140      (((unsigned long)(rid)) << TEV_FOG_PARAM_3_RID_SHIFT))
141 
142 /*
143  *  tev_fog_color struct
144  */
145 #define TEV_FOG_COLOR_B_SHIFT   0
146 #define TEV_FOG_COLOR_G_SHIFT   8
147 #define TEV_FOG_COLOR_R_SHIFT   16
148 #define TEV_FOG_COLOR_RID_SHIFT 24
149 #define TEV_FOG_COLOR(b, g, r, rid) \
150     ((((unsigned long)(b)) << TEV_FOG_COLOR_B_SHIFT) | \
151      (((unsigned long)(g)) << TEV_FOG_COLOR_G_SHIFT) | \
152      (((unsigned long)(r)) << TEV_FOG_COLOR_R_SHIFT) | \
153      (((unsigned long)(rid)) << TEV_FOG_COLOR_RID_SHIFT))
154 
155 /*
156  *  pe_zmode struct
157  */
158 #define PE_ZMODE_ENABLE_SHIFT   0
159 #define PE_ZMODE_FUNC_SHIFT 1
160 #define PE_ZMODE_MASK_SHIFT 4
161 #define PE_ZMODE_RID_SHIFT  24
162 #define PE_ZMODE(enable, func, mask, rid) \
163     ((((unsigned long)(enable)) << PE_ZMODE_ENABLE_SHIFT) | \
164      (((unsigned long)(func)) << PE_ZMODE_FUNC_SHIFT) | \
165      (((unsigned long)(mask)) << PE_ZMODE_MASK_SHIFT) | \
166      (((unsigned long)(rid)) << PE_ZMODE_RID_SHIFT))
167 
168 /*
169  *  pe_cmode0 struct
170  */
171 #define PE_CMODE0_BLEND_ENABLE_SHIFT    0
172 #define PE_CMODE0_LOGICOP_ENABLE_SHIFT  1
173 #define PE_CMODE0_DITHER_ENABLE_SHIFT   2
174 #define PE_CMODE0_COLOR_MASK_SHIFT  3
175 #define PE_CMODE0_ALPHA_MASK_SHIFT  4
176 #define PE_CMODE0_DFACTOR_SHIFT 5
177 #define PE_CMODE0_SFACTOR_SHIFT 8
178 #define PE_CMODE0_BLENDOP_SHIFT 11
179 #define PE_CMODE0_LOGICOP_SHIFT 12
180 #define PE_CMODE0_RID_SHIFT 24
181 #define PE_CMODE0(blend_enable, logicop_enable, dither_enable, color_mask, alpha_mask, dfactor, sfactor, blendop, logicop, rid) \
182     ((((unsigned long)(blend_enable)) << PE_CMODE0_BLEND_ENABLE_SHIFT) | \
183      (((unsigned long)(logicop_enable)) << PE_CMODE0_LOGICOP_ENABLE_SHIFT) | \
184      (((unsigned long)(dither_enable)) << PE_CMODE0_DITHER_ENABLE_SHIFT) | \
185      (((unsigned long)(color_mask)) << PE_CMODE0_COLOR_MASK_SHIFT) | \
186      (((unsigned long)(alpha_mask)) << PE_CMODE0_ALPHA_MASK_SHIFT) | \
187      (((unsigned long)(dfactor)) << PE_CMODE0_DFACTOR_SHIFT) | \
188      (((unsigned long)(sfactor)) << PE_CMODE0_SFACTOR_SHIFT) | \
189      (((unsigned long)(blendop)) << PE_CMODE0_BLENDOP_SHIFT) | \
190      (((unsigned long)(logicop)) << PE_CMODE0_LOGICOP_SHIFT) | \
191      (((unsigned long)(rid)) << PE_CMODE0_RID_SHIFT))
192 
193 /*
194  *  pe_cmode1 struct
195  */
196 #define PE_CMODE1_CONSTANT_ALPHA_SHIFT  0
197 #define PE_CMODE1_CONSTANT_ALPHA_ENABLE_SHIFT   8
198 #define PE_CMODE1_RID_SHIFT 24
199 #define PE_CMODE1(constant_alpha, constant_alpha_enable, rid) \
200     ((((unsigned long)(constant_alpha)) << PE_CMODE1_CONSTANT_ALPHA_SHIFT) | \
201      (((unsigned long)(constant_alpha_enable)) << PE_CMODE1_CONSTANT_ALPHA_ENABLE_SHIFT) | \
202      (((unsigned long)(rid)) << PE_CMODE1_RID_SHIFT))
203 
204 /*
205  *  pe_token struct
206  */
207 #define PE_TOKEN_TOKEN_SHIFT    0
208 #define PE_TOKEN_RID_SHIFT  24
209 #define PE_TOKEN(token, rid) \
210     ((((unsigned long)(token)) << PE_TOKEN_TOKEN_SHIFT) | \
211      (((unsigned long)(rid)) << PE_TOKEN_RID_SHIFT))
212 
213 /*
214  *  PE (and some TEV) register addresses (BP address space)
215  */
216 #define PE_ZMODE_ID         0x00000040
217 #define PE_CMODE0_ID        0x00000041
218 #define PE_CMODE1_ID        0x00000042
219 #define PE_CONTROL_ID       0x00000043
220 #define PE_TOKEN_ID         0x00000047
221 #define PE_TOKEN_INT_ID     0x00000048
222 
223 #define TEV_FOG_PARAM_0_ID  0x000000ee
224 #define TEV_FOG_PARAM_1_ID  0x000000ef
225 #define TEV_FOG_PARAM_2_ID  0x000000f0
226 #define TEV_FOG_PARAM_3_ID  0x000000f1
227 #define TEV_FOG_COLOR_ID    0x000000f2
228 
229 /*
230  *  TEV register field definitions
231  */
232 
233 //  tev_proj enum
234 #define TEV_PROJ_PERSP      0x00000000
235 #define TEV_PROJ_ORTHO      0x00000001
236 
237 /*---------------------------------------------------------------------------*/
238 #ifdef __cplusplus
239 }
240 #endif
241 
242 #endif // __GDPIXEL_H__
243