Add stencil op and other related stuff to make that functionality mostly complete.

Add color/depth write mask support (and rename GPU_SetDepthTest() accordingly).
Add blending color.

Blending color must be set right after stencil op. GPU freezes otherwise.
This commit is contained in:
StapleButter 2014-10-27 15:19:27 +01:00
parent 51850d5e6a
commit cb6b23b884
2 changed files with 39 additions and 9 deletions

View File

@ -44,6 +44,26 @@ typedef enum
GPU_GEQUAL = 7 GPU_GEQUAL = 7
}GPU_TESTFUNC; }GPU_TESTFUNC;
typedef enum
{
GPU_KEEP = 0, // keep destination value
GPU_AND_NOT = 1, // destination & ~source
GPU_XOR = 5, // destination ^ source
// 2 is the same as 1. Other values are too weird to even be usable.
} GPU_STENCILOP;
typedef enum
{
GPU_WRITE_RED = 0x01,
GPU_WRITE_GREEN = 0x02,
GPU_WRITE_BLUE = 0x04,
GPU_WRITE_ALPHA = 0x08,
GPU_WRITE_DEPTH = 0x10,
GPU_WRITE_COLOR = 0x0F,
GPU_WRITE_ALL = 0x1F
} GPU_WRITEMASK;
typedef enum typedef enum
{ {
GPU_BLEND_ADD = 0, GPU_BLEND_ADD = 0,
@ -144,8 +164,9 @@ void GPU_SetViewport(u32* depthBuffer, u32* colorBuffer, u32 x, u32 y, u32 w, u3
void GPU_DepthRange(float nearVal, float farVal); void GPU_DepthRange(float nearVal, float farVal);
void GPU_SetAlphaTest(bool enable, GPU_TESTFUNC function, u8 ref); void GPU_SetAlphaTest(bool enable, GPU_TESTFUNC function, u8 ref);
void GPU_SetDepthTest(bool enable, GPU_TESTFUNC function, u8 ref); void GPU_SetDepthTestAndWriteMask(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask); // GPU_WRITEMASK values can be ORed together
void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref); void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref, u8 mask, u8 replace);
void GPU_SetStencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass);
void GPU_SetFaceCulling(GPU_CULLMODE mode); void GPU_SetFaceCulling(GPU_CULLMODE mode);
// these two can't be used together // these two can't be used together
@ -154,6 +175,8 @@ void GPU_SetAlphaBlending(GPU_BLENDEQUATION colorEquation, GPU_BLENDEQUATION alp
GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst); GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst);
void GPU_SetColorLogicOp(GPU_LOGICOP op); void GPU_SetColorLogicOp(GPU_LOGICOP op);
void GPU_SetBlendingColor(u8 r, u8 g, u8 b, u8 a);
void GPU_SetAttributeBuffers(u8 totalAttributes, u32* baseAddress, u64 attributeFormats, u16 attributeMask, u64 attributePermutation, u8 numBuffers, u32 bufferOffsets[], u64 bufferPermutations[], u8 bufferNumAttributes[]); void GPU_SetAttributeBuffers(u8 totalAttributes, u32* baseAddress, u64 attributeFormats, u16 attributeMask, u64 attributePermutation, u8 numBuffers, u32 bufferOffsets[], u64 bufferPermutations[], u8 bufferNumAttributes[]);
void GPU_SetTextureEnable(GPU_TEXUNIT units); // GPU_TEXUNITx values can be ORed together to enable multiple texture units void GPU_SetTextureEnable(GPU_TEXUNIT units); // GPU_TEXUNITx values can be ORed together to enable multiple texture units

View File

@ -294,23 +294,25 @@ void GPU_SetAlphaTest(bool enable, GPU_TESTFUNC function, u8 ref)
GPUCMD_AddSingleParam(0x000F0104, (enable&1)|((function&7)<<4)|(ref<<8)); GPUCMD_AddSingleParam(0x000F0104, (enable&1)|((function&7)<<4)|(ref<<8));
} }
void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref) void GPU_SetStencilTest(bool enable, GPU_TESTFUNC function, u8 ref, u8 mask, u8 replace)
{ {
GPUCMD_AddSingleParam(0x000F0105, (enable&1)|((function&7)<<4)|(ref<<8)); GPUCMD_AddSingleParam(0x000F0105, (enable&1)|((function&7)<<4)|(replace<<8)|(ref<<16)|(mask<<24));
} }
void GPU_SetDepthTest(bool enable, GPU_TESTFUNC function, u8 ref) void GPU_SetStencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass)
{ {
GPUCMD_AddSingleParam(0x000F0107, (enable&1)|((function&7)<<4)|(ref<<8)); GPUCMD_AddSingleParam(0x000F0106, sfail | (dfail << 4) | (pass << 8));
}
void GPU_SetDepthTestAndWriteMask(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask)
{
GPUCMD_AddSingleParam(0x000F0107, (enable&1)|((function&7)<<4)|(writemask<<8));
} }
void GPU_SetAlphaBlending(GPU_BLENDEQUATION colorEquation, GPU_BLENDEQUATION alphaEquation, void GPU_SetAlphaBlending(GPU_BLENDEQUATION colorEquation, GPU_BLENDEQUATION alphaEquation,
GPU_BLENDFACTOR colorSrc, GPU_BLENDFACTOR colorDst, GPU_BLENDFACTOR colorSrc, GPU_BLENDFACTOR colorDst,
GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst) GPU_BLENDFACTOR alphaSrc, GPU_BLENDFACTOR alphaDst)
{ {
// TODO: fixed color
// it is controlled by command 0103 but I haven't found were to place said command without freezing the GPU
GPUCMD_AddSingleParam(0x000F0101, colorEquation | (alphaEquation<<8) | (colorSrc<<16) | (colorDst<<20) | (alphaSrc<<24) | (alphaDst<<28)); GPUCMD_AddSingleParam(0x000F0101, colorEquation | (alphaEquation<<8) | (colorSrc<<16) | (colorDst<<20) | (alphaSrc<<24) | (alphaDst<<28));
GPUCMD_AddSingleParam(0x00020100, 0x00000100); GPUCMD_AddSingleParam(0x00020100, 0x00000100);
} }
@ -321,6 +323,11 @@ void GPU_SetColorLogicOp(GPU_LOGICOP op)
GPUCMD_AddSingleParam(0x00020100, 0x00000000); GPUCMD_AddSingleParam(0x00020100, 0x00000000);
} }
void GPU_SetBlendingColor(u8 r, u8 g, u8 b, u8 a)
{
GPUCMD_AddSingleParam(0x000F0103, r | (g << 8) | (b << 16) | (a << 24));
}
void GPU_SetTextureEnable(GPU_TEXUNIT units) void GPU_SetTextureEnable(GPU_TEXUNIT units)
{ {
GPUCMD_AddSingleParam(0x0002006F, units<<8); // enables texcoord outputs GPUCMD_AddSingleParam(0x0002006F, units<<8); // enables texcoord outputs