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