1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2<HTML>
3<HEAD>
4<META http-equiv="Content-Type" content="text/html; charset=windows-1252">
5<META name="GENERATOR" content="Microsoft FrontPage 5.0">
6<META http-equiv="Content-Style-Type" content="text/css">
7<LINK rel="stylesheet" type="text/css" href="../../CSS/revolution.css">
8<TITLE>GXInit</TITLE>
9</HEAD>
10<BODY>
11<H1 align="left">GXInit</H1>
12<H2>C Specification</H2>
13<DL>
14  <DD>
15  <PRE><CODE>#include &lt;revolution/gx.h&gt;</CODE></PRE>
16  <DD>
17  <PRE><CODE>GXFifoObj* GXInit( void* base, u32 size )</CODE></PRE>
18</DL>
19<H2>Arguments</H2>
20<DIV align="left">
21<TABLE border="1" cellpadding="3" cellspacing="0.1">
22  <TBODY>
23    <TR>
24<TD width="120" bgcolor="#ffffe8"><CODE><STRONG><EM>base</EM></STRONG></CODE></TD>
25<TD width="520">a pointer to the FIFO memory <BR>32-byte aligned</TD>
26    </TR>
27    <TR>
28<TD width="120" bgcolor="#ffffe8"><CODE><STRONG><EM>size</EM></STRONG></CODE></TD>
29<TD width="520">memory size in bytes <BR>in 32-byte multiples</TD>
30    </TR>
31  </TBODY>
32</TABLE>
33</DIV>
34<H2>Return Values</H2>
35<P>Returns a pointer to the initialized <A href="../Structures/GXFifoObj.html"><CODE>GXFifoObj</CODE></A> structure.</P>
36<H2>Description</H2>
37<P>This function sets the default state of the graphics processor (GP). It should be called before any other GX functions.&nbsp;It sets up an immediate-mode method of communicating graphics commands from the CPU to the GP. It initializes a FIFO and attaches it to both the CPU and GP. The CPU writes commands to the FIFO and the GP reads them.&nbsp;<code>GXInit()</font>returns a pointer to the initialized FIFO.&nbsp;The application must allocate the memory for the FIFO.&nbsp;The argument <CODE><STRONG><EM>base</EM></STRONG></CODE> is a pointer to the allocated main memory and must be 32-B aligned. The parameter <CODE><STRONG><EM>size</EM></STRONG></CODE> is the size of the FIFO in bytes; it must be a multiple of 32B. Refer to the additional notes in <CODE><a href="../GfxFIFO/GXInitFifoBase.html">GXInitFIFOBase</a></CODE> for more information on FIFO memory.</P>
38<P>It's possible to override the default immediate-mode format and instead buffer the graphics for frame <em>n+1</em> while the GP is reading the graphics for frame <em>n</em>. See <a href="../GfxFIFO/GXSetCPUFifo.html"><code>GXSetCPUFifo</code></a> and <a href="../GfxFIFO/GXSetGPFifo.html"><code>GXSetGPFifo</code></a> for further information.</P>
39<P><code>GXInit</code> also designates the calling thread as the default GX thread. That is, it assumes the calling thread is responsible for generating graphics data. This thread will be the one suspended when the FIFO gets full. The current GX thread can be changed by calling <code><a href="../GfxFIFO/GXSetCurrentGXThread.html">GXSetCurrentGXThread</a></code>.</P>
40<H3>GXInit State Settings</H3>
41<P>The following code fragment describes the default state settings after calling <code>GXInit</code>.</P>
42<BLOCKQUOTE>
43<PRE><CODE>// Color definitions
44
45#define GX_DEFAULT_BG {64, 64, 64, 255}
46#define BLACK {0, 0, 0, 0}
47#define WHITE {255, 255, 255, 255}
48
49//
50// Render Mode
51//
52// (set 'rmode' based upon VIGetTvFormat(); code not shown)
53
54//
55// Geometry and Vertex
56//
57GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
58GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY);
59GXSetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX2, GX_IDENTITY);
60GXSetTexCoordGen(GX_TEXCOORD3, GX_TG_MTX2x4, GX_TG_TEX3, GX_IDENTITY);
61GXSetTexCoordGen(GX_TEXCOORD4, GX_TG_MTX2x4, GX_TG_TEX4, GX_IDENTITY);
62GXSetTexCoordGen(GX_TEXCOORD5, GX_TG_MTX2x4, GX_TG_TEX5, GX_IDENTITY);
63GXSetTexCoordGen(GX_TEXCOORD6, GX_TG_MTX2x4, GX_TG_TEX6, GX_IDENTITY);
64GXSetTexCoordGen(GX_TEXCOORD7, GX_TG_MTX2x4, GX_TG_TEX7, GX_IDENTITY);
65GXSetNumTexGens(1);
66GXClearVtxDesc();
67GXInvalidateVtxCache();
68
69GXSetLineWidth(6, GX_TO_ZERO);
70GXSetPointSize(6, GX_TO_ZERO);
71GXEnableTexOffsets( GX_TEXCOORD0, GX_DISABLE, GX_DISABLE );
72GXEnableTexOffsets( GX_TEXCOORD1, GX_DISABLE, GX_DISABLE );
73GXEnableTexOffsets( GX_TEXCOORD2, GX_DISABLE, GX_DISABLE );
74GXEnableTexOffsets( GX_TEXCOORD3, GX_DISABLE, GX_DISABLE );
75GXEnableTexOffsets( GX_TEXCOORD4, GX_DISABLE, GX_DISABLE );
76GXEnableTexOffsets( GX_TEXCOORD5, GX_DISABLE, GX_DISABLE );
77GXEnableTexOffsets( GX_TEXCOORD6, GX_DISABLE, GX_DISABLE );
78GXEnableTexOffsets( GX_TEXCOORD7, GX_DISABLE, GX_DISABLE );
79
80//
81// Transformation and Matrix
82//
83// (initialize 'identity_mtx' to identity; code not shown)
84
85// Note: projection matrix is not initialized!
86GXLoadPosMtxImm(identity_mtx, GX_PNMTX0);
87GXLoadNrmMtxImm(identity_mtx, GX_PNMTX0);
88GXSetCurrentMtx(GX_PNMTX0);
89GXLoadTexMtxImm(identity_mtx, GX_IDENTITY, GX_MTX3x4);
90GXLoadTexMtxImm(identity_mtx, GX_PTIDENTITY, GX_MTX3x4);
91GXSetViewport(0.0F, // left
920.0F, // top
93(float)rmode-&gt;fbWidth, // width
94(float)rmode-&gt;xfbHeight, // height
950.0F, // nearz
961.0F); // farz
97
98//
99// Clipping and Culling
100//
101GXSetCoPlanar(GX_DISABLE);
102GXSetCullMode(GX_CULL_BACK);
103GXSetClipMode(GX_CLIP_ENABLE);
104GXSetScissor(0, 0, (u32)rmode-&gt;fbWidth, (u32)rmode-&gt;efbHeight);
105GXSetScissorBoxOffset(0, 0);
106
107//
108// Lighting - pass vertex color through
109//
110GXSetNumChans(0); // no colors by default
111
112GXSetChanCtrl(
113GX_COLOR0A0,
114GX_DISABLE,
115GX_SRC_REG,
116GX_SRC_VTX,
117GX_LIGHT_NULL,
118GX_DF_NONE,
119GX_AF_NONE );
120
121GXSetChanAmbColor(GX_COLOR0A0, BLACK);
122GXSetChanMatColor(GX_COLOR0A0, WHITE);
123
124GXSetChanCtrl(
125GX_COLOR1A1,
126GX_DISABLE,
127GX_SRC_REG,
128GX_SRC_VTX,
129GX_LIGHT_NULL,
130GX_DF_NONE,
131GX_AF_NONE );
132
133GXSetChanAmbColor(GX_COLOR1A1, BLACK);
134GXSetChanMatColor(GX_COLOR1A1, WHITE);
135
136//
137// Texture
138//
139GXInvalidateTexAll();
140
141// Allocate 8 32k caches for RGBA texture mipmaps.
142// Equal size caches to support 32b RGBA textures.
143//
144// (code not shown)
145
146// Allocate color index caches in low bank of TMEM.
147// Each cache is 32kB.
148// Even and odd regions should be allocated on different address.
149//
150// (code not shown)
151
152// Allocate TLUTs, 16 256-entry TLUTs and 4 1K-entry TLUTs.
153// 256-entry TLUTs are 8kB, 1k-entry TLUTs are 32kB.
154//
155// (code not shown)
156
157//
158// Set texture region and tlut region Callbacks
159//
160GXSetTexRegionCallback(__GXDefaultTexRegionCallback);
161GXSetTlutRegionCallback(__GXDefaultTlutRegionCallback);
162
163//
164// Texture Environment
165//
166GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
167GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0);
168GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD2, GX_TEXMAP2, GX_COLOR0A0);
169GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD3, GX_TEXMAP3, GX_COLOR0A0);
170GXSetTevOrder(GX_TEVSTAGE4, GX_TEXCOORD4, GX_TEXMAP4, GX_COLOR0A0);
171GXSetTevOrder(GX_TEVSTAGE5, GX_TEXCOORD5, GX_TEXMAP5, GX_COLOR0A0);
172GXSetTevOrder(GX_TEVSTAGE6, GX_TEXCOORD6, GX_TEXMAP6, GX_COLOR0A0);
173GXSetTevOrder(GX_TEVSTAGE7, GX_TEXCOORD7, GX_TEXMAP7, GX_COLOR0A0);
174GXSetTevOrder(GX_TEVSTAGE8, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
175GXSetTevOrder(GX_TEVSTAGE9, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
176GXSetTevOrder(GX_TEVSTAGE10,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
177GXSetTevOrder(GX_TEVSTAGE11,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
178GXSetTevOrder(GX_TEVSTAGE12,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
179GXSetTevOrder(GX_TEVSTAGE13,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
180GXSetTevOrder(GX_TEVSTAGE14,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
181GXSetTevOrder(GX_TEVSTAGE15,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL);
182GXSetNumTevStages(1);
183GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE);
184GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
185GXSetZTexture(GX_ZT_DISABLE, GX_TF_Z8, 0);
186
187for (i = GX_TEVSTAGE0; i &lt; GX_MAX_TEVSTAGE; i++) {
188GXSetTevKColorSel((GXTevStageID) i, GX_TEV_KCSEL_1_4 );
189GXSetTevKAlphaSel((GXTevStageID) i, GX_TEV_KASEL_1 );
190GXSetTevSwapMode ((GXTevStageID) i, GX_TEV_SWAP0, GX_TEV_SWAP0 );
191}
192GXSetTevSwapModeTable(GX_TEV_SWAP0,
193GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA);
194GXSetTevSwapModeTable(GX_TEV_SWAP1,
195GX_CH_RED, GX_CH_RED, GX_CH_RED, GX_CH_ALPHA);
196GXSetTevSwapModeTable(GX_TEV_SWAP2,
197GX_CH_GREEN, GX_CH_GREEN, GX_CH_GREEN, GX_CH_ALPHA);
198GXSetTevSwapModeTable(GX_TEV_SWAP3,
199GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA);
200
201// Indirect Textures.
202for (i = GX_TEVSTAGE0; i &lt; GX_MAX_TEVSTAGE; i++) {
203GXSetTevDirect((GXTevStageID) i);
204}
205GXSetNumIndStages(0);
206GXSetIndTexCoordScale( GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1 );
207GXSetIndTexCoordScale( GX_INDTEXSTAGE1, GX_ITS_1, GX_ITS_1 );
208GXSetIndTexCoordScale( GX_INDTEXSTAGE2, GX_ITS_1, GX_ITS_1 );
209GXSetIndTexCoordScale( GX_INDTEXSTAGE3, GX_ITS_1, GX_ITS_1 );
210
211//
212// Pixel Processing
213//
214GXSetFog(GX_FOG_NONE, 0.0F, 1.0F, 0.1F, 1.0F, BLACK);
215GXSetFogRangeAdj( GX_DISABLE, 0, 0 );
216GXSetBlendMode(GX_BM_NONE,
217GX_BL_SRCALPHA, // src factor
218GX_BL_INVSRCALPHA, // dst factor
219GX_LO_CLEAR);
220GXSetColorUpdate(GX_ENABLE);
221GXSetAlphaUpdate(GX_ENABLE);
222GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
223GXSetZCompLoc(GX_TRUE); // before texture
224GXSetDither(GX_ENABLE);
225GXSetDstAlpha(GX_DISABLE, 0);
226GXSetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
227GXSetFieldMask( GX_ENABLE, GX_ENABLE );
228GXSetFieldMode((GXBool)(rmode-&gt;field_rendering),
229((rmode-&gt;viHeight == 2*rmode-&gt;xfbHeight) ?
230GX_ENABLE : GX_DISABLE));
231
232//
233// Frame buffer
234//
235GXSetCopyClear(GX_DEFAULT_BG, GX_MAX_Z24);
236GXSetDispCopySrc(0, 0, rmode-&gt;fbWidth, rmode-&gt;efbHeight);
237GXSetDispCopyDst(rmode-&gt;fbWidth, rmode-&gt;efbHeight);
238GXSetDispCopyYScale((f32)(rmode-&gt;xfbHeight) / (f32)(rmode-&gt;efbHeight));
239GXSetCopyClamp((GXFBClamp)(GX_CLAMP_TOP | GX_CLAMP_BOTTOM));
240GXSetCopyFilter(rmode-&gt;aa, rmode-&gt;sample_pattern, GX_TRUE, rmode-&gt;vfilter);
241GXSetDispCopyGamma( GX_GM_1_0 );
242GXSetDispCopyFrame2Field(GX_COPY_PROGRESSIVE);
243GXClearBoundingBox();
244
245//
246// CPU direct EFB access
247//
248GXPokeColorUpdate(GX_TRUE);
249GXPokeAlphaUpdate(GX_TRUE);
250GXPokeDither(GX_FALSE);
251GXPokeBlendMode(GX_BM_NONE, GX_BL_ZERO, GX_BL_ONE, GX_LO_SET);
252GXPokeAlphaMode(GX_ALWAYS, 0);
253GXPokeAlphaRead(GX_READ_FF);
254GXPokeDstAlpha(GX_DISABLE, 0);
255GXPokeZMode(GX_TRUE, GX_ALWAYS, GX_TRUE);
256
257//
258// Performance Counters
259//
260GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE);
261GXClearGPMetric();</CODE></PRE>
262</BLOCKQUOTE>
263
264
265<H2>See Also</H2>
266<P><CODE><A href="../GfxFIFO/GXInitFifoBase.html">GXInitFIFOBase</A>,</FONT><A href="../GfxFIFO/GXSetCPUFifo.html">GXSetCPUFifo</A>, <A href="../GfxFIFO/GXSetCPUFifo.html">GXSetGPFifo</A>, <A href="../GfxFIFO/GXSetCurrentGXThread.html">GXSetCurrentGXThread</A></CODE></P>
267<H2>Revision History</H2>
268<P>2006/03/01 Initial version.</P>
269<hr>
270<P>CONFIDENTIAL</p>
271</BODY>
272</HTML>