RSX : last few cmd refactoring

This commit is contained in:
raven02 2015-01-05 03:48:31 +08:00 committed by raven02
parent 3d2aa622f1
commit 12edfeb216
5 changed files with 143 additions and 132 deletions

View file

@ -1270,7 +1270,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_TWO_SIDED_STENCIL_TEST_ENABLE:
{
m_set_two_sided_stencil_test_enable = ARGS(0) ? true : false;
const u32 value = ARGS(0);
Enable(cmd, ARGS(0));
}
break;
@ -1283,84 +1284,85 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_STENCIL_MASK:
{
const u32 value = ARGS(0);
m_set_stencil_mask = true;
m_stencil_mask = ARGS(0);
StencilMask(value);
}
break;
case NV4097_SET_STENCIL_FUNC:
{
m_set_stencil_func = true;
m_stencil_func = ARGS(0);
if (count >= 2)
if (count == 3)
{
m_set_stencil_func_ref = true;
m_set_stencil_func = true;
m_stencil_func = ARGS(0);
m_stencil_func_ref = ARGS(1);
if (count >= 3)
{
m_set_stencil_func_mask = true;
m_stencil_func_mask = ARGS(2);
}
m_stencil_func_mask = ARGS(2);
StencilFunc(m_stencil_func, m_stencil_func_ref, m_stencil_func_mask);
}
}
break;
case NV4097_SET_STENCIL_FUNC_REF:
{
m_set_stencil_func_ref = true;
m_stencil_func_ref = ARGS(0);
if (m_set_stencil_func)
{
StencilFunc(m_stencil_func, m_stencil_func_ref, m_stencil_func_mask);
}
}
break;
case NV4097_SET_STENCIL_FUNC_MASK:
{
m_set_stencil_func_mask = true;
m_stencil_func_mask = ARGS(0);
if (m_set_stencil_func)
{
StencilFunc(m_stencil_func, m_stencil_func_ref, m_stencil_func_mask);
}
}
break;
case NV4097_SET_STENCIL_OP_FAIL:
{
m_set_stencil_fail = true;
m_stencil_fail = ARGS(0);
if (count >= 2)
if (count == 3)
{
m_set_stencil_zfail = true;
m_set_stencil_op_fail = true;
m_stencil_fail = ARGS(0);
m_stencil_zfail = ARGS(1);
if (count >= 3)
{
m_set_stencil_zpass = true;
m_stencil_zpass = ARGS(2);
}
m_stencil_zpass = ARGS(2);
StencilOp(m_stencil_fail, m_stencil_zfail, m_stencil_zpass);
}
}
break;
case NV4097_SET_BACK_STENCIL_MASK:
{
m_set_back_stencil_mask = true;
m_back_stencil_mask = ARGS(0);
StencilMaskSeparate(0, m_back_stencil_mask); // GL_BACK
if (m_set_stencil_mask)
{
StencilMaskSeparate(1, m_stencil_mask); // GL_FRONT
}
}
break;
case NV4097_SET_BACK_STENCIL_FUNC:
{
m_set_back_stencil_func = true;
m_back_stencil_func = ARGS(0);
if (count >= 2)
if (count == 3)
{
m_set_back_stencil_func_ref = true;
m_set_back_stencil_func = true;
m_back_stencil_func = ARGS(0);
m_back_stencil_func_ref = ARGS(1);
if (count >= 3)
m_back_stencil_func_mask = ARGS(2);
StencilFuncSeparate(0, m_back_stencil_func, m_back_stencil_func_ref, m_back_stencil_func_mask); // GL_BACK
if (m_set_stencil_func)
{
m_set_back_stencil_func_mask = true;
m_back_stencil_func_mask = ARGS(2);
StencilFuncSeparate(1, m_stencil_func, m_stencil_func_ref, m_stencil_func_mask); // GL_FRONT
}
}
}
@ -1368,34 +1370,52 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_BACK_STENCIL_FUNC_REF:
{
m_set_back_stencil_func_ref = true;
m_back_stencil_func_ref = ARGS(0);
if (m_set_back_stencil_func)
{
StencilFuncSeparate(0, m_back_stencil_func, m_back_stencil_func_ref, m_back_stencil_func_mask); // GL_BACK
if (m_set_stencil_func)
{
StencilFuncSeparate(1, m_stencil_func, m_stencil_func_ref, m_stencil_func_mask); // GL_FRONT
}
}
}
break;
case NV4097_SET_BACK_STENCIL_FUNC_MASK:
{
m_set_back_stencil_func_mask = true;
m_back_stencil_func_mask = ARGS(0);
if (m_set_back_stencil_func)
{
StencilFuncSeparate(0, m_back_stencil_func, m_back_stencil_func_ref, m_back_stencil_func_mask); // GL_BACK
if (m_set_stencil_func)
{
StencilFuncSeparate(1, m_stencil_func, m_stencil_func_ref, m_stencil_func_mask); // GL_FRONT
}
}
}
break;
case NV4097_SET_BACK_STENCIL_OP_FAIL:
{
m_set_stencil_fail = true;
m_stencil_fail = ARGS(0);
if (count >= 2)
if (count == 3)
{
m_set_back_stencil_zfail = true;
m_back_stencil_fail = ARGS(0);
m_back_stencil_zfail = ARGS(1);
m_back_stencil_zpass = ARGS(2);
StencilOpSeparate(0, m_back_stencil_fail, m_back_stencil_zfail, m_back_stencil_zpass); // GL_BACK
if (count >= 3)
if (m_set_stencil_op_fail)
{
m_set_back_stencil_zpass = true;
m_back_stencil_zpass = ARGS(2);
StencilOpSeparate(1, m_stencil_fail, m_stencil_zfail, m_stencil_zpass); // GL_FRONT
}
}
}
break;
@ -1764,9 +1784,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_POLYGON_STIPPLE_PATTERN:
{
u32 pattern[32];
for (u32 i = 0; i < 32; i++)
{
m_polygon_stipple_pattern[i] = ARGS(i);
pattern[i] = ARGS(i);
PolygonStipple(pattern[i]);
}
}
break;