#include <revolution/gx.h>
GXFifoObj* GXInit( void* base, u32 size )
base |
a pointer to the FIFO memory 32-byte aligned |
size |
memory size in bytes in 32-byte multiples |
Returns a pointer to the initialized GXFifoObj structure.
This function sets the default state of the graphics processor (GP). It should be called before any other GX functions. 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. GXInit()returns a pointer to the initialized FIFO. The application must allocate the memory for the FIFO. The argument base is a pointer to the allocated main memory and must be 32-B aligned. The parameter size is the size of the FIFO in bytes; it must be a multiple of 32B. Refer to the additional notes in GXInitFIFOBase for more information on FIFO memory.
It's possible to override the default immediate-mode format and instead buffer the graphics for frame n+1 while the GP is reading the graphics for frame n. See GXSetCPUFifo and GXSetGPFifo for further information.
GXInit also designates the calling thread as the default GX thread. I.e., 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 GXSetCurrentGXThread.
The following code fragment describes the default state settings after calling GXInit.
// Color definitions #define GX_DEFAULT_BG {64, 64, 64, 255} #define BLACK {0, 0, 0, 0} #define WHITE {255, 255, 255, 255} // // Render Mode // // (set 'rmode' based upon VIGetTvFormat(); code not shown) // // Geometry and Vertex // GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX2, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD3, GX_TG_MTX2x4, GX_TG_TEX3, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD4, GX_TG_MTX2x4, GX_TG_TEX4, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD5, GX_TG_MTX2x4, GX_TG_TEX5, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD6, GX_TG_MTX2x4, GX_TG_TEX6, GX_IDENTITY); GXSetTexCoordGen(GX_TEXCOORD7, GX_TG_MTX2x4, GX_TG_TEX7, GX_IDENTITY); GXSetNumTexGens(1); GXClearVtxDesc(); GXInvalidateVtxCache(); GXSetLineWidth(6, GX_TO_ZERO); GXSetPointSize(6, GX_TO_ZERO); GXEnableTexOffsets( GX_TEXCOORD0, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD1, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD2, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD3, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD4, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD5, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD6, GX_DISABLE, GX_DISABLE ); GXEnableTexOffsets( GX_TEXCOORD7, GX_DISABLE, GX_DISABLE ); // // Transformation and Matrix // // (initialize 'identity_mtx' to identity; code not shown) // Note: projection matrix is not initialized! GXLoadPosMtxImm(identity_mtx, GX_PNMTX0); GXLoadNrmMtxImm(identity_mtx, GX_PNMTX0); GXSetCurrentMtx(GX_PNMTX0); GXLoadTexMtxImm(identity_mtx, GX_IDENTITY, GX_MTX3x4); GXLoadTexMtxImm(identity_mtx, GX_PTIDENTITY, GX_MTX3x4); GXSetViewport(0.0F, // left 0.0F, // top (float)rmode->fbWidth, // width (float)rmode->xfbHeight, // height 0.0F, // nearz 1.0F); // farz // // Clipping and Culling // GXSetCoPlanar(GX_DISABLE); GXSetCullMode(GX_CULL_BACK); GXSetClipMode(GX_CLIP_ENABLE); GXSetScissor(0, 0, (u32)rmode->fbWidth, (u32)rmode->efbHeight); GXSetScissorBoxOffset(0, 0); // // Lighting - pass vertex color through // GXSetNumChans(0); // no colors by default GXSetChanCtrl( GX_COLOR0A0, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE ); GXSetChanAmbColor(GX_COLOR0A0, BLACK); GXSetChanMatColor(GX_COLOR0A0, WHITE); GXSetChanCtrl( GX_COLOR1A1, GX_DISABLE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, GX_AF_NONE ); GXSetChanAmbColor(GX_COLOR1A1, BLACK); GXSetChanMatColor(GX_COLOR1A1, WHITE); // // Texture // GXInvalidateTexAll(); // Allocate 8 32k caches for RGBA texture mipmaps. // Equal size caches to support 32b RGBA textures. // // (code not shown) // Allocate color index caches in low bank of TMEM. // Each cache is 32kB. // Even and odd regions should be allocated on different address. // // (code not shown) // Allocate TLUTs, 16 256-entry TLUTs and 4 1K-entry TLUTs. // 256-entry TLUTs are 8kB, 1k-entry TLUTs are 32kB. // // (code not shown) // // Set texture region and tlut region Callbacks // GXSetTexRegionCallback(__GXDefaultTexRegionCallback); GXSetTlutRegionCallback(__GXDefaultTlutRegionCallback); // // Texture Environment // GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD2, GX_TEXMAP2, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE3, GX_TEXCOORD3, GX_TEXMAP3, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE4, GX_TEXCOORD4, GX_TEXMAP4, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE5, GX_TEXCOORD5, GX_TEXMAP5, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE6, GX_TEXCOORD6, GX_TEXMAP6, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE7, GX_TEXCOORD7, GX_TEXMAP7, GX_COLOR0A0); GXSetTevOrder(GX_TEVSTAGE8, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE9, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE10,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE11,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE12,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE13,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE14,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetTevOrder(GX_TEVSTAGE15,GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR_NULL); GXSetNumTevStages(1); GXSetTevOp(GX_TEVSTAGE0, GX_REPLACE); GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); GXSetZTexture(GX_ZT_DISABLE, GX_TF_Z8, 0); for (i = GX_TEVSTAGE0; i < GX_MAX_TEVSTAGE; i++) { GXSetTevKColorSel((GXTevStageID) i, GX_TEV_KCSEL_1_4 ); GXSetTevKAlphaSel((GXTevStageID) i, GX_TEV_KASEL_1 ); GXSetTevSwapMode ((GXTevStageID) i, GX_TEV_SWAP0, GX_TEV_SWAP0 ); } GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GXSetTevSwapModeTable(GX_TEV_SWAP1, GX_CH_RED, GX_CH_RED, GX_CH_RED, GX_CH_ALPHA); GXSetTevSwapModeTable(GX_TEV_SWAP2, GX_CH_GREEN, GX_CH_GREEN, GX_CH_GREEN, GX_CH_ALPHA); GXSetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA); // Indirect Textures. for (i = GX_TEVSTAGE0; i < GX_MAX_TEVSTAGE; i++) { GXSetTevDirect((GXTevStageID) i); } GXSetNumIndStages(0); GXSetIndTexCoordScale( GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1 ); GXSetIndTexCoordScale( GX_INDTEXSTAGE1, GX_ITS_1, GX_ITS_1 ); GXSetIndTexCoordScale( GX_INDTEXSTAGE2, GX_ITS_1, GX_ITS_1 ); GXSetIndTexCoordScale( GX_INDTEXSTAGE3, GX_ITS_1, GX_ITS_1 ); // // Pixel Processing // GXSetFog(GX_FOG_NONE, 0.0F, 1.0F, 0.1F, 1.0F, BLACK); GXSetFogRangeAdj( GX_DISABLE, 0, 0 ); GXSetBlendMode(GX_BM_NONE, GX_BL_SRCALPHA, // src factor GX_BL_INVSRCALPHA, // dst factor GX_LO_CLEAR); GXSetColorUpdate(GX_ENABLE); GXSetAlphaUpdate(GX_ENABLE); GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); GXSetZCompLoc(GX_TRUE); // before texture GXSetDither(GX_ENABLE); GXSetDstAlpha(GX_DISABLE, 0); GXSetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); GXSetFieldMask( GX_ENABLE, GX_ENABLE ); GXSetFieldMode((GXBool)(rmode->field_rendering), ((rmode->viHeight == 2*rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); // // Frame buffer // GXSetCopyClear(GX_DEFAULT_BG, GX_MAX_Z24); GXSetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); GXSetDispCopyDst(rmode->fbWidth, rmode->efbHeight); GXSetDispCopyYScale((f32)(rmode->xfbHeight) / (f32)(rmode->efbHeight)); GXSetCopyClamp((GXFBClamp)(GX_CLAMP_TOP | GX_CLAMP_BOTTOM)); GXSetCopyFilter(rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->vfilter); GXSetDispCopyGamma( GX_GM_1_0 ); GXSetDispCopyFrame2Field(GX_COPY_PROGRESSIVE); GXClearBoundingBox(); // // CPU direct EFB access // GXPokeColorUpdate(GX_TRUE); GXPokeAlphaUpdate(GX_TRUE); GXPokeDither(GX_FALSE); GXPokeBlendMode(GX_BM_NONE, GX_BL_ZERO, GX_BL_ONE, GX_LO_SET); GXPokeAlphaMode(GX_ALWAYS, 0); GXPokeAlphaRead(GX_READ_FF); GXPokeDstAlpha(GX_DISABLE, 0); GXPokeZMode(GX_TRUE, GX_ALWAYS, GX_TRUE); // // Performance Counters // GXSetGPMetric(GX_PERF0_NONE, GX_PERF1_NONE); GXClearGPMetric();
GXInitFIFOBase,GXSetCPUFifo, GXSetGPFifo, GXSetCurrentGXThread
03/01/2006 Initial version.