GXInit

C Specification

#include <revolution/gx.h>
GXFifoObj* GXInit( void* base, u32 size )

Arguments

base a pointer to the FIFO memory
32-byte aligned
size memory size in bytes
in 32-byte multiples

Return Values

Returns a pointer to the initialized GXFifoObj structure.

Description

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.

GXInit State Settings

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();

See Also

GXInitFIFOBase,GXSetCPUFifo, GXSetGPFifo, GXSetCurrentGXThread

Revision History

03/01/2006 Initial version.