GXInit

Syntax

#include <revolution/gx.h>

GXFifoObj* GXInit( void* base, u32 size );

Arguments

base 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. The GXInit function sets up an immediate mode method of communicating graphics commands from the CPU to the GP. The GXInit 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. GXInit returns a pointer to the initialized FIFO. The application must allocate the memory for the FIFO. The base parameter is a pointer to the allocated main memory and must be 32-byte aligned. The size argument is the size of the FIFO in bytes. It must be a multiple of 32 bytes. See the additional notes in the GXInitFIFOBase function for more information on FIFO memory.

It is 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 the GXSetCPUFifo and GXSetGPFifo functions for further information.

The GXInit 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 GXSetCurrentGXThread function.

GXInit State Settings

The following code fragment describes the default state settings after calling the GXInit function.

// 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

2006/03/01 Initial version.


CONFIDENTIAL