diff --git a/include/dolphin/gx/GXPriv.h b/include/dolphin/gx/GXPriv.h index ea3d2318..6df69ed5 100644 --- a/include/dolphin/gx/GXPriv.h +++ b/include/dolphin/gx/GXPriv.h @@ -291,6 +291,9 @@ void __GXInitGX(); } #endif +#define GX_BITFIELD(field, pos, size, value) (__rlwimi((field), (value), 31 - (pos) - (size) + 1, (pos), (pos) + (size) - 1)) +#define GX_BITFIELD_SET(field, pos, size, value) ((field) = GX_BITFIELD(field, pos, size, value)) + #define CP_STREAM_REG_INDEX_SIZE 4 #define CP_STREAM_REG_INDEX_SHIFT 0 #define CP_STREAM_REG_INDEX_MASK 0x0000000f diff --git a/src/Dolphin/gx/GXPixel.c b/src/Dolphin/gx/GXPixel.c new file mode 100644 index 00000000..75afd983 --- /dev/null +++ b/src/Dolphin/gx/GXPixel.c @@ -0,0 +1,51 @@ +#include "dolphin/gx.h" +#include "dolphin/gx/GXPriv.h" + +void GXSetFog(GXFogType type, f32 startz, f32 endz, f32 nearz, f32 farz, GXColor color); +void GXSetFogColor(GXColor color); +// ? GXSetFogRangeAdj(); +void GXSetBlendMode(GXBlendMode type, GXBlendFactor src_factor, GXBlendFactor dst_factor, + GXLogicOp op); +void GXSetColorUpdate(GXBool update_enable) { + GXData* gxdata = gx; + u32 r6 = gxdata->cmode0; + + GX_BITFIELD_SET(r6, 28, 1, update_enable); + GX_WRITE_RA_REG(r6); + + gxdata->cmode0 = r6; + gxdata->bpSentNot = GX_FALSE; +}; +void GXSetAlphaUpdate(GXBool update_enable) { + GXData* gxdata = gx; + u32 r6 = gxdata->cmode0; + + GX_BITFIELD_SET(r6, 27, 1, update_enable); + GX_WRITE_RA_REG(r6); + + gxdata->cmode0 = r6; + gxdata->bpSentNot = GX_FALSE; +}; +void GXSetZMode(GXBool compare_enable, GXCompare func, GXBool update_enable); +void GXSetZCompLoc(GXBool before_tex) { + GXData* gxdata = gx; + gxdata->peCtrl = gxdata->peCtrl & 0xffffffbf | (u32)before_tex << 6; + + GX_WRITE_RA_REG(gxdata->peCtrl); + + gxdata->bpSentNot = GX_FALSE; +}; +void GXSetPixelFmt(GXPixelFmt pix_fmt, GXZFmt16 z_fmt); +void GXSetDither(GXBool dither) { + GXData* gxdata = gx; + u32 r6 = gxdata->cmode0; + + r6 = r6 & 0xfffffffb | (u32)dither << 2; + GX_WRITE_RA_REG(r6); + + gxdata->cmode0 = r6; + gxdata->bpSentNot = GX_FALSE; +}; +void GXSetDstAlpha(GXBool enable, u8 alpha); +// ? GXSetFieldMask(); +void GXSetFieldMode(u8 field_mode, u8 half_aspect_ratio);