From 497a4ff9b742d499b811f60f06785606bf05f239 Mon Sep 17 00:00:00 2001 From: fincs Date: Wed, 25 Nov 2015 22:02:16 +0100 Subject: [PATCH] Add C3D_ColorLogicOp and C3D_FragOpMode --- include/c3d/effect.h | 2 ++ include/c3d/renderbuffer.h | 16 ---------------- source/base.c | 1 + source/context.h | 2 ++ source/effect.c | 19 ++++++++++++++++++- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/include/c3d/effect.h b/include/c3d/effect.h index 5b2d818..cd7b5fd 100644 --- a/include/c3d/effect.h +++ b/include/c3d/effect.h @@ -9,3 +9,5 @@ void C3D_BlendingColor(u32 color); void C3D_DepthTest(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask); void C3D_AlphaTest(bool enable, GPU_TESTFUNC function, int ref); void C3D_AlphaBlend(GPU_BLENDEQUATION colorEq, GPU_BLENDEQUATION alphaEq, GPU_BLENDFACTOR srcClr, GPU_BLENDFACTOR dstClr, GPU_BLENDFACTOR srcAlpha, GPU_BLENDFACTOR dstAlpha); +void C3D_ColorLogicOp(GPU_LOGICOP op); +void C3D_FragOpMode(GPU_FRAGOPMODE mode); diff --git a/include/c3d/renderbuffer.h b/include/c3d/renderbuffer.h index 3610912..74f9e50 100644 --- a/include/c3d/renderbuffer.h +++ b/include/c3d/renderbuffer.h @@ -9,22 +9,6 @@ typedef struct u32 clearColor, clearDepth; } C3D_RenderBuf; -enum -{ - // Renderbuffer color formats - GPU_RB_RGBA8 = 0, - GPU_RB_RGB8, - GPU_RB_RGB5_A1, - GPU_RB_R5_G6_B5, - GPU_RB_RGBA4, - - // Renderbuffer depth formats - GPU_RB_DEPTH16 = 0, - GPU_RB_DEPTHXX, - GPU_RB_DEPTH24, - GPU_RB_DEPTH24_STENCIL8, -}; - bool C3D_RenderBufInit(C3D_RenderBuf* rb, int width, int height, int colorFmt, int depthFmt); void C3D_RenderBufClearAsync(C3D_RenderBuf* rb); void C3D_RenderBufTransferAsync(C3D_RenderBuf* rb, u32* frameBuf, u32 flags); diff --git a/source/base.c b/source/base.c index 40fa8db..f02f59e 100644 --- a/source/base.c +++ b/source/base.c @@ -90,6 +90,7 @@ bool C3D_Init(size_t cmdBufSize) C3D_DepthTest(true, GPU_GREATER, GPU_WRITE_ALL); C3D_AlphaTest(false, GPU_ALWAYS, 0x00); C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); + C3D_FragOpMode(GPU_FRAGOPMODE_GL); ctx->texEnvBuf = 0; ctx->texEnvBufClr = 0xFFFFFFFF; diff --git a/source/context.h b/source/context.h index 903b43c..d28782c 100644 --- a/source/context.h +++ b/source/context.h @@ -11,6 +11,7 @@ typedef struct { + u32 fragOpMode; u32 zScale, zOffset; GPU_CULLMODE cullMode; @@ -20,6 +21,7 @@ typedef struct u32 blendClr; u32 alphaBlend; + GPU_LOGICOP clrLogicOp; } C3D_Effect; typedef struct diff --git a/source/effect.c b/source/effect.c index a9aa76c..be39418 100644 --- a/source/effect.c +++ b/source/effect.c @@ -54,6 +54,22 @@ void C3D_AlphaBlend(GPU_BLENDEQUATION colorEq, GPU_BLENDEQUATION alphaEq, GPU_BL { C3D_Effect* e = getEffect(); e->alphaBlend = colorEq | (alphaEq << 8) | (srcClr << 16) | (dstClr << 20) | (srcAlpha << 24) | (dstAlpha << 28); + e->fragOpMode &= ~0xFF00; + e->fragOpMode |= 0x0100; +} + +void C3D_ColorLogicOp(GPU_LOGICOP op) +{ + C3D_Effect* e = getEffect(); + e->fragOpMode &= ~0xFF00; + e->clrLogicOp = op; +} + +void C3D_FragOpMode(GPU_FRAGOPMODE mode) +{ + C3D_Effect* e = getEffect(); + e->fragOpMode &= ~0xFF00FF; + e->fragOpMode |= 0xE40000 | mode; } void C3Di_EffectBind(C3D_Effect* e) @@ -64,7 +80,8 @@ void C3Di_EffectBind(C3D_Effect* e) GPUCMD_AddIncrementalWrites(GPUREG_ALPHATEST_CONFIG, (u32*)&e->alphaTest, 4); GPUCMD_AddWrite(GPUREG_BLEND_COLOR, e->blendClr); GPUCMD_AddWrite(GPUREG_BLEND_CONFIG, e->alphaBlend); - GPUCMD_AddMaskedWrite(GPUREG_BLEND_ENABLE, 2, 0x00000100); + GPUCMD_AddWrite(GPUREG_LOGICOP_CONFIG, e->clrLogicOp); + GPUCMD_AddMaskedWrite(GPUREG_BLEND_ENABLE, 2, e->fragOpMode); // Disable early depth test? GPUCMD_AddMaskedWrite(GPUREG_0062, 1, 0);