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:
parent
51850d5e6a
commit
cb6b23b884
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user