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 <revolution/gx.h> 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. 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. <code>GXInit</code> returns a pointer to the initialized FIFO. The application must allocate the memory for the FIFO. 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->fbWidth, // width 96(float)rmode->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->fbWidth, (u32)rmode->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 < 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 < 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->field_rendering), 231((rmode->viHeight == 2*rmode->xfbHeight) ? 232GX_ENABLE : GX_DISABLE)); 233 234// 235// Frame buffer 236// 237GXSetCopyClear(GX_DEFAULT_BG, GX_MAX_Z24); 238GXSetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); 239GXSetDispCopyDst(rmode->fbWidth, rmode->efbHeight); 240GXSetDispCopyYScale((f32)(rmode->xfbHeight) / (f32)(rmode->efbHeight)); 241GXSetCopyClamp((GXFBClamp)(GX_CLAMP_TOP | GX_CLAMP_BOTTOM)); 242GXSetCopyFilter(rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->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>