Add C3D_ColorLogicOp and C3D_FragOpMode

This commit is contained in:
fincs 2015-11-25 22:02:16 +01:00
parent 8992e6fd18
commit 497a4ff9b7
5 changed files with 23 additions and 17 deletions

View File

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

View File

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

View File

@ -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;

View File

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

View File

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