Conflicts fixed

This commit is contained in:
Nekotekina 2014-12-28 16:52:04 +03:00
commit 1636531d4a
2 changed files with 296 additions and 232 deletions

View file

@ -451,18 +451,21 @@ void GLFragmentDecompilerThread::Task()
case RSX_FP_OPCODE_DP4: SetDst("vec4(dot($0, $1))"); break; case RSX_FP_OPCODE_DP4: SetDst("vec4(dot($0, $1))"); break;
case RSX_FP_OPCODE_DP2A: SetDst("vec4($0.x * $1.x + $0.y * $1.y + $2.x)"); break; case RSX_FP_OPCODE_DP2A: SetDst("vec4($0.x * $1.x + $0.y * $1.y + $2.x)"); break;
case RSX_FP_OPCODE_DST: SetDst("vec4(distance($0, $1))"); break; case RSX_FP_OPCODE_DST: SetDst("vec4(distance($0, $1))"); break;
case RSX_FP_OPCODE_REFL: LOG_ERROR(RSX, "Unimplemented SCB instruction: REFL"); break; // TODO: Is this in the right category?
case RSX_FP_OPCODE_EX2: SetDst("exp2($0)"); break; case RSX_FP_OPCODE_EX2: SetDst("exp2($0)"); break;
case RSX_FP_OPCODE_FLR: SetDst("floor($0)"); break; case RSX_FP_OPCODE_FLR: SetDst("floor($0)"); break;
case RSX_FP_OPCODE_FRC: SetDst("fract($0)"); break; case RSX_FP_OPCODE_FRC: SetDst("fract($0)"); break;
case RSX_FP_OPCODE_LIT: LOG_ERROR(RSX, "Unimplemented SCB instruction: LIT"); break;
case RSX_FP_OPCODE_LIF: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; case RSX_FP_OPCODE_LIF: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break;
case RSX_FP_OPCODE_LRP: LOG_ERROR(RSX, "Unimplemented SCB instruction: LRP"); break; // TODO: Is this in the right category?
case RSX_FP_OPCODE_LG2: SetDst("log2($0)"); break; case RSX_FP_OPCODE_LG2: SetDst("log2($0)"); break;
case RSX_FP_OPCODE_MAD: SetDst("($0 * $1 + $2)"); break; case RSX_FP_OPCODE_MAD: SetDst("($0 * $1 + $2)"); break;
case RSX_FP_OPCODE_MAX: SetDst("max($0, $1)"); break; case RSX_FP_OPCODE_MAX: SetDst("max($0, $1)"); break;
case RSX_FP_OPCODE_MIN: SetDst("min($0, $1)"); break; case RSX_FP_OPCODE_MIN: SetDst("min($0, $1)"); break;
case RSX_FP_OPCODE_MOV: SetDst("$0"); break; case RSX_FP_OPCODE_MOV: SetDst("$0"); break;
case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); break; case RSX_FP_OPCODE_MUL: SetDst("($0 * $1)"); break;
case RSX_FP_OPCODE_PK2: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK2"); break; case RSX_FP_OPCODE_PK2: SetDst("packSnorm2x16($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478))
case RSX_FP_OPCODE_PK4: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK4"); break; case RSX_FP_OPCODE_PK4: SetDst("packSnorm4x8($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478))
case RSX_FP_OPCODE_PK16: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK16"); break; case RSX_FP_OPCODE_PK16: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK16"); break;
case RSX_FP_OPCODE_PKB: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKB"); break; case RSX_FP_OPCODE_PKB: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKB"); break;
case RSX_FP_OPCODE_PKG: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKG"); break; case RSX_FP_OPCODE_PKG: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKG"); break;
@ -490,13 +493,16 @@ void GLFragmentDecompilerThread::Task()
case RSX_FP_OPCODE_DDX: SetDst("dFdx($0)"); break; case RSX_FP_OPCODE_DDX: SetDst("dFdx($0)"); break;
case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break; case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break;
case RSX_FP_OPCODE_NRM: SetDst("normalize($0)"); break; case RSX_FP_OPCODE_NRM: SetDst("normalize($0)"); break;
case RSX_FP_OPCODE_BEM: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: BEM"); break;
case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break; case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break;
case RSX_FP_OPCODE_TXP: LOG_ERROR(RSX, "TEX_SRB texture projection used. Please report this to a RPCS3 developer!"); SetDst("textureProj($t, $0.xy, $1)"); break; //TODO: Test this case RSX_FP_OPCODE_TEXBEM: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TEXBEM"); break;
case RSX_FP_OPCODE_TXP: SetDst("textureProj($t, $0.xy, $1)"); break; //TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478) and The Simpsons Arcade Game (NPUB30563))
case RSX_FP_OPCODE_TXPBEM: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXPBEM"); break;
case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); break; case RSX_FP_OPCODE_TXD: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: TXD"); break;
case RSX_FP_OPCODE_TXB: SetDst("texture($t, $0.xy, $1.x)"); break; case RSX_FP_OPCODE_TXB: SetDst("texture($t, $0.xy, $1.x)"); break;
case RSX_FP_OPCODE_TXL: SetDst("textureLod($t, $0.xy, $1.x)"); break; case RSX_FP_OPCODE_TXL: SetDst("textureLod($t, $0.xy, $1.x)"); break;
case RSX_FP_OPCODE_UP2: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP2"); break; case RSX_FP_OPCODE_UP2: SetDst("unpackSnorm2x16($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478))
case RSX_FP_OPCODE_UP4: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP4"); break; case RSX_FP_OPCODE_UP4: SetDst("unpackSnorm4x8($0)"); break; // TODO: More testing (Sonic The Hedgehog (NPUB-30442/NPEB-00478))
case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); break; case RSX_FP_OPCODE_UP16: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP16"); break;
case RSX_FP_OPCODE_UPB: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPB"); break; case RSX_FP_OPCODE_UPB: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPB"); break;
case RSX_FP_OPCODE_UPG: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPG"); break; case RSX_FP_OPCODE_UPG: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPG"); break;

View file

@ -11,6 +11,7 @@
#include "Emu/SysCalls/lv2/sys_time.h" #include "Emu/SysCalls/lv2/sys_time.h"
#define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].ToLE()) #define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].ToLE())
#define CMD_DEBUG 0
u32 methodRegisters[0xffff]; u32 methodRegisters[0xffff];
@ -161,14 +162,6 @@ u32 RSXVertexData::GetTypeSize()
} }
} }
#define CMD_DEBUG 0
#if CMD_DEBUG
#define CMD_LOG(...) LOG_NOTICE(RSX, __VA_ARGS__)
#else
#define CMD_LOG(...)
#endif
u32 RSXThread::OutOfArgsCount(const uint x, const u32 cmd, const u32 count, const u32 args_addr) u32 RSXThread::OutOfArgsCount(const uint x, const u32 cmd, const u32 count, const u32 args_addr)
{ {
auto args = vm::ptr<u32>::make(args_addr); auto args = vm::ptr<u32>::make(args_addr);
@ -181,77 +174,43 @@ u32 RSXThread::OutOfArgsCount(const uint x, const u32 cmd, const u32 count, cons
return 0; return 0;
} }
#define case_4(a, m) \ #define case_2(offset, step) \
case a + m: \ case offset: \
case a + m * 2: \ case offset + step:
case a + m * 3: \ #define case_4(offset, step) \
index = (cmd - a) / m; \ case_2(offset, step) \
case a \ case_2(offset + 2*step, step)
#define case_8(offset, step) \
#define case_16(a, m) \ case_4(offset, step) \
case a + m: \ case_4(offset + 4*step, step)
case a + m * 2: \ #define case_16(offset, step) \
case a + m * 3: \ case_8(offset, step) \
case a + m * 4: \ case_8(offset + 8*step, step)
case a + m * 5: \ #define case_32(offset, step) \
case a + m * 6: \ case_16(offset, step) \
case a + m * 7: \ case_16(offset + 16*step, step)
case a + m * 8: \ #define case_range(n, offset, step) \
case a + m * 9: \ case_##n(offset, step) \
case a + m * 10: \ index = (cmd - offset) / step;
case a + m * 11: \
case a + m * 12: \
case a + m * 13: \
case a + m * 14: \
case a + m * 15: \
index = (cmd - a) / m; \
case a \
#define case_32(a, m) \
case a + m: \
case a + m * 2: \
case a + m * 3: \
case a + m * 4: \
case a + m * 5: \
case a + m * 6: \
case a + m * 7: \
case a + m * 8: \
case a + m * 9: \
case a + m * 10: \
case a + m * 11: \
case a + m * 12: \
case a + m * 13: \
case a + m * 14: \
case a + m * 15: \
case a + m * 16: \
case a + m * 17: \
case a + m * 18: \
case a + m * 19: \
case a + m * 20: \
case a + m * 21: \
case a + m * 22: \
case a + m * 23: \
case a + m * 24: \
case a + m * 25: \
case a + m * 26: \
case a + m * 27: \
case a + m * 28: \
case a + m * 29: \
case a + m * 30: \
case a + m * 31: \
index = (cmd - a) / m; \
case a \
void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const u32 count) void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const u32 count)
{ {
auto args = vm::ptr<u32>::make(args_addr); auto args = vm::ptr<u32>::make(args_addr);
#if CMD_DEBUG #if CMD_DEBUG
<<<<<<< HEAD
std::string debug = GetMethodName(cmd); std::string debug = GetMethodName(cmd);
debug += "("; debug += "(";
for(u32 i=0; i<count; ++i) debug += (i ? ", " : "") + fmt::Format("0x%x", ARGS(i)); for(u32 i=0; i<count; ++i) debug += (i ? ", " : "") + fmt::Format("0x%x", ARGS(i));
debug += ")"; debug += ")";
LOG_NOTICE(RSX, debug); LOG_NOTICE(RSX, debug);
=======
std::string debug = GetMethodName(cmd);
debug += "(";
for (u32 i = 0; i < count; ++i) debug += (i ? ", " : "") + fmt::Format("0x%x", ARGS(i));
debug += ")";
LOG_NOTICE(RSX, debug);
>>>>>>> 4b8d61736460fe75f264c7180bd7d9d898b540f5
#endif #endif
u32 index = 0; u32 index = 0;
@ -270,7 +229,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV406E_SET_CONTEXT_DMA_SEMAPHORE: case NV406E_SET_CONTEXT_DMA_SEMAPHORE:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV406E_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV406E_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0));
}
} }
break; break;
@ -285,7 +246,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV406E_SEMAPHORE_ACQUIRE: case NV406E_SEMAPHORE_ACQUIRE:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV406E_SEMAPHORE_ACQUIRE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV406E_SEMAPHORE_ACQUIRE: 0x%x", ARGS(0));
}
} }
break; break;
@ -315,18 +278,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// NV4097 // NV4097
case 0x0003fead: case 0x0003fead:
//if(cmd == 0xfeadffff)
{ {
//LOG_WARNING(RSX, "Flip()");
Flip(); Flip();
m_last_flip_time = get_system_time(); m_last_flip_time = get_system_time();
m_gcm_current_buffer = ARGS(0); m_gcm_current_buffer = ARGS(0);
m_read_buffer = true; m_read_buffer = true;
m_flip_status = 0; m_flip_status = 0;
if(m_flip_handler) if (m_flip_handler)
{ {
auto cb = m_flip_handler; auto cb = m_flip_handler;
Emu.GetCallbackManager().Async([cb]() Emu.GetCallbackManager().Async([cb]()
@ -367,48 +327,63 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case NV4097_SET_CONTEXT_DMA_REPORT:
{
if (ARGS(0))
{
LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_REPORT: 0x%x", ARGS(0));
}
}
break;
case NV4097_NOTIFY: case NV4097_NOTIFY:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_NOTIFY: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_NOTIFY: 0x%x", ARGS(0));
}
} }
break; break;
case NV4097_WAIT_FOR_IDLE: case NV4097_WAIT_FOR_IDLE:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_WAIT_FOR_IDLE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_WAIT_FOR_IDLE: 0x%x", ARGS(0));
}
} }
break; break;
case NV4097_PM_TRIGGER: case NV4097_PM_TRIGGER:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_PM_TRIGGER: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_PM_TRIGGER: 0x%x", ARGS(0));
}
} }
break; break;
// Texture // Texture
case_16(NV4097_SET_TEXTURE_FORMAT, 0x20): case_range(16, NV4097_SET_TEXTURE_FORMAT, 0x20)
case_16(NV4097_SET_TEXTURE_OFFSET, 0x20): case_range(16, NV4097_SET_TEXTURE_OFFSET, 0x20)
case_16(NV4097_SET_TEXTURE_FILTER, 0x20): case_range(16, NV4097_SET_TEXTURE_FILTER, 0x20)
case_16(NV4097_SET_TEXTURE_ADDRESS, 0x20): case_range(16, NV4097_SET_TEXTURE_ADDRESS, 0x20)
case_16(NV4097_SET_TEXTURE_IMAGE_RECT, 32): case_range(16, NV4097_SET_TEXTURE_IMAGE_RECT, 32)
case_16(NV4097_SET_TEXTURE_BORDER_COLOR, 0x20): case_range(16, NV4097_SET_TEXTURE_BORDER_COLOR, 0x20)
case_16(NV4097_SET_TEXTURE_CONTROL0, 0x20): case_range(16, NV4097_SET_TEXTURE_CONTROL0, 0x20)
case_16(NV4097_SET_TEXTURE_CONTROL1, 0x20): case_range(16, NV4097_SET_TEXTURE_CONTROL1, 0x20)
{ {
// Done using methodRegisters in RSXTexture.cpp // Done using methodRegisters in RSXTexture.cpp
} }
break; break;
case_16(NV4097_SET_TEX_COORD_CONTROL, 4): case_range(16, NV4097_SET_TEX_COORD_CONTROL, 4)
{ {
LOG_WARNING(RSX, "NV4097_SET_TEX_COORD_CONTROL"); LOG_WARNING(RSX, "TODO: NV4097_SET_TEX_COORD_CONTROL");
} }
break; break;
case_16(NV4097_SET_TEXTURE_CONTROL3, 4): case_range(16, NV4097_SET_TEXTURE_CONTROL3, 4)
{ {
RSXTexture& tex = m_textures[index]; RSXTexture& tex = m_textures[index];
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
@ -419,19 +394,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
break; break;
// Vertex Texture // Vertex Texture
case_4(NV4097_SET_VERTEX_TEXTURE_FORMAT, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_FORMAT, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_OFFSET, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_OFFSET, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_FILTER, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_FILTER, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_ADDRESS, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_ADDRESS, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_IMAGE_RECT, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_IMAGE_RECT, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_BORDER_COLOR, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_BORDER_COLOR, 0x20)
case_4(NV4097_SET_VERTEX_TEXTURE_CONTROL0, 0x20): case_range(4, NV4097_SET_VERTEX_TEXTURE_CONTROL0, 0x20)
{ {
// Done using methodRegisters in RSXTexture.cpp // Done using methodRegisters in RSXTexture.cpp
} }
break; break;
case_4(NV4097_SET_VERTEX_TEXTURE_CONTROL3, 0x20) : case_range(4, NV4097_SET_VERTEX_TEXTURE_CONTROL3, 0x20)
{ {
RSXVertexTexture& tex = m_vertex_textures[index]; RSXVertexTexture& tex = m_vertex_textures[index];
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
@ -442,7 +417,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
break; break;
// Vertex data // Vertex data
case_16(NV4097_SET_VERTEX_DATA4UB_M, 4): case_range(16, NV4097_SET_VERTEX_DATA4UB_M, 4)
{ {
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
u8 v0 = a0; u8 v0 = a0;
@ -457,11 +432,12 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_vertex_data[index].data.push_back(v1); m_vertex_data[index].data.push_back(v1);
m_vertex_data[index].data.push_back(v2); m_vertex_data[index].data.push_back(v2);
m_vertex_data[index].data.push_back(v3); m_vertex_data[index].data.push_back(v3);
//LOG_WARNING(RSX, "NV4097_SET_VERTEX_DATA4UB_M: index = %d, v0 = 0x%x, v1 = 0x%x, v2 = 0x%x, v3 = 0x%x", index, v0, v1, v2, v3); //LOG_WARNING(RSX, "NV4097_SET_VERTEX_DATA4UB_M: index = %d, v0 = 0x%x, v1 = 0x%x, v2 = 0x%x, v3 = 0x%x", index, v0, v1, v2, v3);
} }
break; break;
case_16(NV4097_SET_VERTEX_DATA2F_M, 8): case_range(16, NV4097_SET_VERTEX_DATA2F_M, 8)
{ {
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
const u32 a1 = ARGS(1); const u32 a1 = ARGS(1);
@ -481,7 +457,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case_16(NV4097_SET_VERTEX_DATA4F_M, 16): case_range(16, NV4097_SET_VERTEX_DATA4F_M, 16)
{ {
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
const u32 a1 = ARGS(1); const u32 a1 = ARGS(1);
@ -507,10 +483,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case_16(NV4097_SET_VERTEX_DATA_ARRAY_OFFSET, 4): case_range(16, NV4097_SET_VERTEX_DATA_ARRAY_OFFSET, 4)
{ {
const u32 addr = GetAddress(ARGS(0) & 0x7fffffff, ARGS(0) >> 31); const u32 addr = GetAddress(ARGS(0) & 0x7fffffff, ARGS(0) >> 31);
CMD_LOG("num=%d, addr=0x%x", index, addr);
m_vertex_data[index].addr = addr; m_vertex_data[index].addr = addr;
m_vertex_data[index].data.clear(); m_vertex_data[index].data.clear();
@ -518,7 +494,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case_16(NV4097_SET_VERTEX_DATA_ARRAY_FORMAT, 4): case_range(16, NV4097_SET_VERTEX_DATA_ARRAY_FORMAT, 4)
{ {
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
u16 frequency = a0 >> 16; u16 frequency = a0 >> 16;
@ -526,8 +502,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
u8 size = (a0 >> 4) & 0xf; u8 size = (a0 >> 4) & 0xf;
u8 type = a0 & 0xf; u8 type = a0 & 0xf;
CMD_LOG("index=%d, frequency=%d, stride=%d, size=%d, type=%d", index, frequency, stride, size, type);
RSXVertexData& cv = m_vertex_data[index]; RSXVertexData& cv = m_vertex_data[index];
cv.frequency = frequency; cv.frequency = frequency;
cv.stride = stride; cv.stride = stride;
@ -535,14 +509,17 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
cv.type = type; cv.type = type;
//LOG_WARNING(RSX, "NV4097_SET_VERTEX_DATA_ARRAY_FORMAT: index=%d, frequency=%d, stride=%d, size=%d, type=%d", index, frequency, stride, size, type); //LOG_WARNING(RSX, "NV4097_SET_VERTEX_DATA_ARRAY_FORMAT: index=%d, frequency=%d, stride=%d, size=%d, type=%d", index, frequency, stride, size, type);
} }
break; break;
// Vertex Attribute // Vertex Attribute
case NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: case NV4097_SET_VERTEX_ATTRIB_INPUT_MASK:
{ {
if (ARGS(0)) if (u32 mask = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: 0x%x", mask);
}
//VertexData[0].prog.attributeInputMask = ARGS(0); //VertexData[0].prog.attributeInputMask = ARGS(0);
} }
@ -550,8 +527,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: case NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK:
{ {
if (ARGS(0)) if (u32 mask = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: 0x%x", mask);
}
//VertexData[0].prog.attributeOutputMask = ARGS(0); //VertexData[0].prog.attributeOutputMask = ARGS(0);
//FragmentData.prog.attributeInputMask = ARGS(0)/* & ~0x20*/; //FragmentData.prog.attributeInputMask = ARGS(0)/* & ~0x20*/;
@ -573,8 +552,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_COLOR_MASK_MRT: case NV4097_SET_COLOR_MASK_MRT:
{ {
if (ARGS(0)) if (u32 mask = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_COLOR_MASK_MRT: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_COLOR_MASK_MRT: 0x%x", mask);
}
} }
break; break;
@ -677,8 +658,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_BLEND_COLOR2: case NV4097_SET_BLEND_COLOR2:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_BLEND_COLOR2: 0x % x", ARGS(0)); {
LOG_WARNING(RSX, "TODO : NV4097_SET_BLEND_COLOR2: 0x%x", value);
}
} }
break; break;
@ -692,8 +675,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_REDUCE_DST_COLOR: case NV4097_SET_REDUCE_DST_COLOR:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_REDUCE_DST_COLOR: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_REDUCE_DST_COLOR: 0x%x", value);
}
} }
break; break;
@ -740,7 +725,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_viewport_h = ARGS(1) >> 16; m_viewport_h = ARGS(1) >> 16;
} }
CMD_LOG("x=%d, y=%d, w=%d, h=%d", m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h); //LOG_NOTICE(RSX, "NV4097_SET_VIEWPORT_HORIZONTAL: x=%d, y=%d, w=%d, h=%d", m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h);
} }
break; break;
@ -749,6 +734,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_set_viewport_vertical = true; m_set_viewport_vertical = true;
m_viewport_y = ARGS(0) & 0xffff; m_viewport_y = ARGS(0) & 0xffff;
m_viewport_h = ARGS(0) >> 16; m_viewport_h = ARGS(0) >> 16;
//LOG_NOTICE(RSX, "NV4097_SET_VIEWPORT_VERTICAL: y=%d, h=%d", m_viewport_y, m_viewport_h);
} }
break; break;
@ -769,7 +756,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_clip_min = (float&)a0; m_clip_min = (float&)a0;
m_clip_max = (float&)a1; m_clip_max = (float&)a1;
CMD_LOG("clip_min=%.01f, clip_max=%.01f", m_clip_min, m_clip_max); //LOG_NOTICE(RSX, "NV4097_SET_CLIP_MIN: clip_min=%.01f, clip_max=%.01f", m_clip_min, m_clip_max);
} }
break; break;
@ -780,7 +767,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_set_clip = true; m_set_clip = true;
m_clip_max = (float&)a0; m_clip_max = (float&)a0;
CMD_LOG("clip_max=%.01f", m_clip_max); //LOG_NOTICE(RSX, "NV4097_SET_CLIP_MAX: clip_max=%.01f", m_clip_max);
} }
break; break;
@ -864,6 +851,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case NV4097_SET_CYLINDRICAL_WRAP:
{
if (ARGS(0))
{
LOG_WARNING(RSX, "TODO: NV4097_SET_CYLINDRICAL_WRAP: 0x%x", ARGS(0));
}
}
break;
// Clearing // Clearing
case NV4097_CLEAR_ZCULL_SURFACE: case NV4097_CLEAR_ZCULL_SURFACE:
{ {
@ -912,19 +908,32 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_CLEAR_RECT_HORIZONTAL: case NV4097_SET_CLEAR_RECT_HORIZONTAL:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_HORIZONTAL: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_CLEAR_RECT_HORIZONTAL: 0x%x", value);
}
} }
break; break;
case NV4097_SET_CLEAR_RECT_VERTICAL: case NV4097_SET_CLEAR_RECT_VERTICAL:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_VERTICAL: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_CLEAR_RECT_VERTICAL: 0x%x", value);
}
} }
break; break;
// Arrays // Arrays
case NV4097_INLINE_ARRAY:
{
if (u32 value = ARGS(0))
{
LOG_WARNING(RSX, "TODO: NNV4097_INLINE_ARRAY: 0x%x", value);
}
}
break;
case NV4097_DRAW_ARRAYS: case NV4097_DRAW_ARRAYS:
{ {
for(u32 c=0; c<count; ++c) for(u32 c=0; c<count; ++c)
@ -1001,11 +1010,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_VERTEX_DATA_BASE_OFFSET: case NV4097_SET_VERTEX_DATA_BASE_OFFSET:
{ {
m_vertex_data_base_offset = ARGS(0); m_vertex_data_base_offset = ARGS(0);
if (count >= 2) {
if (count >= 2)
{
m_vertex_data_base_index = ARGS(1); m_vertex_data_base_index = ARGS(1);
} }
//LOG_ERROR(RSX, "NV4097_SET_VERTEX_DATA_BASE_OFFSET: 0x%x", m_vertex_data_base_offset); //LOG_WARNING(RSX, "NV4097_SET_VERTEX_DATA_BASE_OFFSET: 0x%x", m_vertex_data_base_offset);
} }
break; break;
@ -1020,6 +1031,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
//LOG_WARNING(RSX, "NV4097_SET_BEGIN_END: 0x%x", a0); //LOG_WARNING(RSX, "NV4097_SET_BEGIN_END: 0x%x", a0);
if (!m_indexed_array.m_count && !m_draw_array_count) if (!m_indexed_array.m_count && !m_draw_array_count)
{ {
u32 min_vertex_size = ~0; u32 min_vertex_size = ~0;
@ -1055,7 +1067,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_SHADER_PROGRAM: case NV4097_SET_SHADER_PROGRAM:
{ {
m_cur_shader_prog = &m_shader_progs[m_cur_shader_prog_num]; m_cur_shader_prog = &m_shader_progs[m_cur_shader_prog_num];
//m_cur_shader_prog_num = (m_cur_shader_prog_num + 1) % 16;
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
m_cur_shader_prog->offset = a0 & ~0x3; m_cur_shader_prog->offset = a0 & ~0x3;
m_cur_shader_prog->addr = GetAddress(m_cur_shader_prog->offset, (a0 & 0x3) - 1); m_cur_shader_prog->addr = GetAddress(m_cur_shader_prog->offset, (a0 & 0x3) - 1);
@ -1076,6 +1088,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case NV4097_SET_SHADER_PACKER:
{
if (ARGS(0))
{
LOG_WARNING(RSX, "TODO: NV4097_SET_SHADER_PACKER: 0x%x", ARGS(0));
}
}
case NV4097_SET_SHADER_WINDOW: case NV4097_SET_SHADER_WINDOW:
{ {
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
@ -1114,17 +1134,20 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
break; break;
case_32(NV4097_SET_TRANSFORM_PROGRAM, 4): case_range(32, NV4097_SET_TRANSFORM_PROGRAM, 4)
{ {
//LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM[%d](%d)", index, count); //LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM[%d](%d)", index, count);
if(!m_cur_vertex_prog) if(!m_cur_vertex_prog)
{ {
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM: m_cur_vertex_prog == NULL"); LOG_ERROR(RSX, "NV4097_SET_TRANSFORM_PROGRAM: m_cur_vertex_prog is null");
break; break;
} }
for(u32 i=0; i<count; ++i) m_cur_vertex_prog->data.push_back(ARGS(i)); for (u32 i = 0; i < count; ++i)
{
m_cur_vertex_prog->data.push_back(ARGS(i));
}
} }
break; break;
@ -1135,18 +1158,27 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
if(!m_cur_vertex_prog) if(!m_cur_vertex_prog)
{ {
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_TIMEOUT: m_cur_vertex_prog == NULL"); LOG_ERROR(RSX, "NV4097_SET_TRANSFORM_TIMEOUT: m_cur_vertex_prog is null");
break; break;
} }
//m_cur_vertex_prog->Decompile(); //m_cur_vertex_prog->Decompile();
break; break;
case NV4097_SET_TRANSFORM_BRANCH_BITS:
{
if (u32 value = ARGS(0))
{
LOG_WARNING(RSX, "TODO: NV4097_SET_TRANSFORM_BRANCH_BITS: 0x%x", value);
}
}
break;
case NV4097_SET_TRANSFORM_CONSTANT_LOAD: case NV4097_SET_TRANSFORM_CONSTANT_LOAD:
{ {
if((count - 1) % 4) if((count - 1) % 4)
{ {
CMD_LOG("NV4097_SET_TRANSFORM_CONSTANT_LOAD [%d]", count); LOG_ERROR(RSX, "NV4097_SET_TRANSFORM_CONSTANT_LOAD: bad count %d", count);
break; break;
} }
@ -1159,8 +1191,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
RSXTransformConstant c(id, (float&)x, (float&)y, (float&)z, (float&)w); RSXTransformConstant c(id, (float&)x, (float&)y, (float&)z, (float&)w);
CMD_LOG("SET_TRANSFORM_CONSTANT_LOAD[%d : %d] = (%f, %f, %f, %f)", i, id, c.x, c.y, c.z, c.w);
m_transform_constants.push_back(c); m_transform_constants.push_back(c);
//LOG_NOTICE(RSX, "NV4097_SET_TRANSFORM_CONSTANT_LOAD: [%d : %d] = (%f, %f, %f, %f)", i, id, c.x, c.y, c.z, c.w);
} }
} }
break; break;
@ -1168,8 +1201,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Invalidation // Invalidation
case NV4097_INVALIDATE_L2: case NV4097_INVALIDATE_L2:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_INVALIDATE_L2: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_INVALIDATE_L2: 0x%x", value);
}
} }
break; break;
@ -1187,8 +1222,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_INVALIDATE_ZCULL: case NV4097_INVALIDATE_ZCULL:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_INVALIDATE_ZCULL: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_INVALIDATE_ZCULL: 0x%x", value);
}
} }
break; break;
@ -1351,16 +1388,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_SCULL_CONTROL: case NV4097_SET_SCULL_CONTROL:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_SCULL_CONTROL: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_SCULL_CONTROL: 0x%x", value);
//This is stencil culling , nothing to do with stencil masking on regular color or depth buffer }
//const u32 a0 = ARGS(0);
//m_set_stencil_func = m_set_stencil_func_ref = m_set_stencil_func_mask = true;
//m_stencil_func = a0 & 0xffff;
//m_stencil_func_ref = (a0 >> 16) & 0xff;
//m_stencil_func_mask = (a0 >> 24) & 0xff;
} }
break; break;
@ -1389,8 +1420,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Point sprite // Point sprite
case NV4097_SET_POINT_PARAMS_ENABLE: case NV4097_SET_POINT_PARAMS_ENABLE:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_ERROR(RSX, "NV4097_SET_POINT_PARAMS_ENABLE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_POINT_PARAMS_ENABLE: 0x%x", value);
}
} }
break; break;
@ -1459,7 +1492,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_width = buffers[m_gcm_current_buffer].width; m_width = buffers[m_gcm_current_buffer].width;
m_height = buffers[m_gcm_current_buffer].height; m_height = buffers[m_gcm_current_buffer].height;
// Rescale native resolution to fit 1080p/720p/480p/576p window size
nativeRescale((float)m_width, (float)m_height); nativeRescale((float)m_width, (float)m_height);
} }
break; break;
@ -1516,7 +1548,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
{ {
if (count != 4) if (count != 4)
{ {
LOG_WARNING(RSX, "NV4097_SET_SURFACE_PITCH_C: Bad count (%d)", count); LOG_ERROR(RSX, "NV4097_SET_SURFACE_PITCH_C: Bad count (%d)", count);
break; break;
} }
@ -1533,7 +1565,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
if (count != 1) if (count != 1)
{ {
LOG_WARNING(RSX, "NV4097_SET_SURFACE_PITCH_D: Bad count (%d)", count); LOG_ERROR(RSX, "NV4097_SET_SURFACE_PITCH_D: Bad count (%d)", count);
break; break;
} }
} }
@ -1542,9 +1574,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_SURFACE_PITCH_Z: case NV4097_SET_SURFACE_PITCH_Z:
{ {
m_surface_pitch_z = ARGS(0); m_surface_pitch_z = ARGS(0);
if (count != 1) if (count != 1)
{ {
LOG_WARNING(RSX, "NV4097_SET_SURFACE_PITCH_Z: Bad count (%d)", count); LOG_ERROR(RSX, "NV4097_SET_SURFACE_PITCH_Z: Bad count (%d)", count);
break; break;
} }
} }
@ -1557,7 +1590,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
if (count != 1) if (count != 1)
{ {
LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_COLOR_A: Bad count (%d)", count); LOG_ERROR(RSX, "NV4097_SET_CONTEXT_DMA_COLOR_A: Bad count (%d)", count);
break; break;
} }
} }
@ -1587,7 +1620,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
{ {
if (ARGS(0)) if (ARGS(0))
{ {
LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_COLOR_D: 0x%x", ARGS(0)); LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_COLOR_D: 0x%x", ARGS(0));
} }
} }
break; break;
@ -1601,15 +1634,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_CONTEXT_DMA_SEMAPHORE: case NV4097_SET_CONTEXT_DMA_SEMAPHORE:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", value);
}
} }
break; break;
case NV4097_SET_CONTEXT_DMA_NOTIFIES: case NV4097_SET_CONTEXT_DMA_NOTIFIES:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_NOTIFIES: 0x%x", value);
}
} }
break; break;
@ -1650,8 +1687,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
const u8 alphaToOne = (a0 >> 8) & 0xf; const u8 alphaToOne = (a0 >> 8) & 0xf;
const u16 sampleMask = a0 >> 16; const u16 sampleMask = a0 >> 16;
if (a0)
{
LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: 0x%x", a0); LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: 0x%x", a0);
} }
}
break; break;
// Line/Polygon smoothing // Line/Polygon smoothing
@ -1719,35 +1759,37 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_ZCULL_CONTROL0: case NV4097_SET_ZCULL_CONTROL0:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL0: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_CONTROL0: 0x%x", value);
//m_set_depth_func = true; }
//m_depth_func = ARGS(0) >> 4;
} }
break; break;
case NV4097_SET_ZCULL_CONTROL1: case NV4097_SET_ZCULL_CONTROL1:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL1: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_CONTROL1: 0x%x", value);
//m_set_depth_func = true; }
//m_depth_func = ARGS(0) >> 4;
} }
break; break;
case NV4097_SET_ZCULL_STATS_ENABLE: case NV4097_SET_ZCULL_STATS_ENABLE:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_ZCULL_STATS_ENABLE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_STATS_ENABLE: 0x%x", value);
}
} }
break; break;
case NV4097_ZCULL_SYNC: case NV4097_ZCULL_SYNC:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV4097_ZCULL_SYNC: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV4097_ZCULL_SYNC: 0x%x", value);
}
} }
break; break;
@ -1767,12 +1809,12 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case CELL_GCM_ZCULL_STATS2: case CELL_GCM_ZCULL_STATS2:
case CELL_GCM_ZCULL_STATS3: case CELL_GCM_ZCULL_STATS3:
value = 0; value = 0;
LOG_WARNING(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type); LOG_ERROR(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type);
break; break;
default: default:
value = 0; value = 0;
LOG_WARNING(RSX, "NV4097_GET_REPORT: Bad type %d", type); LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type);
break; break;
} }
@ -1800,6 +1842,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
break; break;
default: default:
LOG_ERROR(RSX, "NV4097_CLEAR_REPORT_VALUE: Bad type: %d", type); LOG_ERROR(RSX, "NV4097_CLEAR_REPORT_VALUE: Bad type: %d", type);
break;
} }
} }
break; break;
@ -1842,23 +1885,25 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
const u8 cullNearFarEnable = ARGS(0) & 0xf; const u8 cullNearFarEnable = ARGS(0) & 0xf;
const u8 zclampEnable = (ARGS(0) >> 4) & 0xf; const u8 zclampEnable = (ARGS(0) >> 4) & 0xf;
const u8 cullIgnoreW = (ARGS(0) >> 8) & 0xf; const u8 cullIgnoreW = (ARGS(0) >> 8) & 0xf;
LOG_WARNING(RSX, "TODO: NV4097_SET_ZMIN_MAX_CONTROL: cullNearFarEnable=%d, zclampEnable=%d, cullIgnoreW=%d",
cullNearFarEnable, zclampEnable, cullIgnoreW); LOG_WARNING(RSX, "TODO: NV4097_SET_ZMIN_MAX_CONTROL: cullNearFarEnable=%d, zclampEnable=%d, cullIgnoreW=%d", cullNearFarEnable, zclampEnable, cullIgnoreW);
} }
break; break;
// Windows Clipping (Doesn't seem to be relevant?)
case NV4097_SET_WINDOW_OFFSET: case NV4097_SET_WINDOW_OFFSET:
{ {
const u16 x = ARGS(0); const u16 x = ARGS(0);
const u16 y = ARGS(0) >> 16; const u16 y = ARGS(0) >> 16;
//LOG_WARNING(RSX, "TODO: NV4097_SET_WINDOW_OFFSET: x=%d, y=%d", x, y);
LOG_WARNING(RSX, "TODO: NV4097_SET_WINDOW_OFFSET: x=%d, y=%d", x, y);
} }
break; break;
case NV4097_SET_FREQUENCY_DIVIDER_OPERATION: case NV4097_SET_FREQUENCY_DIVIDER_OPERATION:
{ {
m_set_frequency_divider_operation = ARGS(0); m_set_frequency_divider_operation = ARGS(0);
LOG_WARNING(RSX, "TODO: NV4097_SET_FREQUENCY_DIVIDER_OPERATION: %d", m_set_frequency_divider_operation);
} }
break; break;
@ -1866,13 +1911,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
{ {
const u32 offset = ARGS(0) & 0xffffff; const u32 offset = ARGS(0) & 0xffffff;
const u8 mode = ARGS(0) >> 24; const u8 mode = ARGS(0) >> 24;
LOG_WARNING(RSX, "NV4097_SET_RENDER_ENABLE: Offset=0x%06x, Mode=0x%x", offset, mode);
LOG_WARNING(RSX, "TODO: NV4097_SET_RENDER_ENABLE: Offset=0x%06x, Mode=0x%x", offset, mode);
} }
break; break;
case NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE: case NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE:
{ {
const u32 enable = ARGS(0); const u32 enable = ARGS(0);
LOG_WARNING(RSX, "TODO: NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE: %d", enable); LOG_WARNING(RSX, "TODO: NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE: %d", enable);
} }
break; break;
@ -1900,7 +1947,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
const u32 notify = ARGS(7); const u32 notify = ARGS(7);
// The existing GCM commands use only the value 0x1 for inFormat and outFormat // The existing GCM commands use only the value 0x1 for inFormat and outFormat
if (inFormat != 0x01 || outFormat != 0x01) { if (inFormat != 0x01 || outFormat != 0x01)
{
LOG_ERROR(RSX, "NV0039_OFFSET_IN: Unsupported format: inFormat=%d, outFormat=%d", inFormat, outFormat); LOG_ERROR(RSX, "NV0039_OFFSET_IN: Unsupported format: inFormat=%d, outFormat=%d", inFormat, outFormat);
} }
@ -1910,7 +1958,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
else else
{ {
LOG_ERROR(RSX, "NV0039_OFFSET_IN: TODO: offset(in=0x%x, out=0x%x), pitch(in=0x%x, out=0x%x), line(len=0x%x, cnt=0x%x), fmt(in=0x%x, out=0x%x), notify=0x%x", LOG_ERROR(RSX, "NV0039_OFFSET_IN: bad offset(in=0x%x, out=0x%x), pitch(in=0x%x, out=0x%x), line(len=0x%x, cnt=0x%x), fmt(in=0x%x, out=0x%x), notify=0x%x",
inOffset, outOffset, inPitch, outPitch, lineLength, lineCount, inFormat, outFormat, notify); inOffset, outOffset, inPitch, outPitch, lineLength, lineCount, inFormat, outFormat, notify);
} }
} }
@ -1925,22 +1973,26 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
} }
else else
{ {
LOG_ERROR(RSX, "NV0039_OFFSET_OUT: TODO: offset=0x%x", offset); LOG_ERROR(RSX, "TODO: NV0039_OFFSET_OUT: offset=0x%x", offset);
} }
} }
break; break;
case NV0039_PITCH_IN: case NV0039_PITCH_IN:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV0039_PITCH_IN: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV0039_PITCH_IN: 0x%x", value);
}
} }
break; break;
case NV0039_BUFFER_NOTIFY: case NV0039_BUFFER_NOTIFY:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV0039_BUFFER_NOTIFY: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV0039_BUFFER_NOTIFY: 0x%x", value);
}
} }
break; break;
@ -1968,8 +2020,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// NV309E // NV309E
case NV309E_SET_CONTEXT_DMA_IMAGE: case NV309E_SET_CONTEXT_DMA_IMAGE:
{ {
if (ARGS(0)) if (u32 value = ARGS(0))
LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_IMAGE: 0x%x", ARGS(0)); {
LOG_WARNING(RSX, "TODO: NV309E_SET_CONTEXT_DMA_IMAGE: 0x%x", value);
}
} }
break; break;
@ -1979,7 +2033,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
const u8 width = ARGS(0) >> 16; const u8 width = ARGS(0) >> 16;
const u8 format = ARGS(0); const u8 format = ARGS(0);
const u32 offset = ARGS(1); const u32 offset = ARGS(1);
LOG_WARNING(RSX, "NV309E_SET_FORMAT: Format:0x%x, Width:%d, Height:%d, Offset:0x%x", format, width, height, offset);
LOG_WARNING(RSX, "TODO: NV309E_SET_FORMAT: Format:0x%x, Width:%d, Height:%d, Offset:0x%x", format, width, height, offset);
} }
break; break;
@ -2030,8 +2085,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
LOG_WARNING(RSX, "NV308A_COLOR: count = %d", count); LOG_WARNING(RSX, "NV308A_COLOR: count = %d", count);
} }
//LOG_WARNING(RSX, "NV308A_COLOR: [%d]: %f, %f, %f, %f", c.id, c.x, c.y, c.z, c.w);
m_fragment_constants.push_back(c); m_fragment_constants.push_back(c);
//LOG_WARNING(RSX, "NV308A_COLOR: [%d]: %f, %f, %f, %f", c.id, c.x, c.y, c.z, c.w);
} }
break; break;
@ -2046,7 +2102,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
{ {
if (ARGS(0) != CELL_GCM_CONTEXT_SURFACE2D) if (ARGS(0) != CELL_GCM_CONTEXT_SURFACE2D)
{ {
LOG_WARNING(RSX, "NV3089_SET_CONTEXT_SURFACE: Unsupported surface (0x%x)", ARGS(0)); LOG_ERROR(RSX, "NV3089_SET_CONTEXT_SURFACE: Unsupported surface (0x%x)", ARGS(0));
} }
} }
break; break;
@ -2069,7 +2125,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
u8* pixels_dst = vm::get_ptr<u8>(GetAddress(m_dst_offset, m_context_dma_img_dst - 0xfeed0000)); u8* pixels_dst = vm::get_ptr<u8>(GetAddress(m_dst_offset, m_context_dma_img_dst - 0xfeed0000));
LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: width=%d, height=%d, pitch=%d, origin=%d, inter=%d, offset=0x%x, u=%d, v=%d", width, height, pitch, origin, inter, offset, u, v); LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: width=%d, height=%d, pitch=%d, origin=%d, inter=%d, offset=0x%x, u=%d, v=%d", width, height, pitch, origin, inter, offset, u, v);
LOG_WARNING(RSX, "*** m_dst_offset=0x%x, m_color: conv_in_h=0x%x, format_src_pitch=0x%x, conv_in_x=0x%x, conv_in_y=0x%x, conv_out_x=0x%x, conv_out_y=0x%x", LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: m_dst_offset=0x%x, m_color: conv_in_h=0x%x, format_src_pitch=0x%x, conv_in_x=0x%x, conv_in_y=0x%x, conv_out_x=0x%x, conv_out_y=0x%x",
m_dst_offset, m_color_conv_in_h, m_color_format_src_pitch, m_color_conv_in_x, m_color_conv_in_y, m_color_conv_out_x, m_color_conv_out_y); m_dst_offset, m_color_conv_in_h, m_color_format_src_pitch, m_color_conv_in_x, m_color_conv_in_y, m_color_conv_out_x, m_color_conv_out_y);
for(u16 y=0; y<m_color_conv_in_h; ++y) for(u16 y=0; y<m_color_conv_in_h; ++y)
@ -2099,6 +2155,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
m_color_conv_out_h = ARGS(6) >> 16; m_color_conv_out_h = ARGS(6) >> 16;
m_color_conv_dsdx = ARGS(7); m_color_conv_dsdx = ARGS(7);
m_color_conv_dtdy = ARGS(8); m_color_conv_dtdy = ARGS(8);
LOG_WARNING(RSX, "TODO: NV3089_SET_COLOR_CONVERSION");
} }
break; break;
@ -2199,7 +2257,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV3089_IMAGE_IN_OFFSET: case NV3089_IMAGE_IN_OFFSET:
case NV3089_IMAGE_IN: case NV3089_IMAGE_IN:
{ {
LOG_WARNING(RSX, "Unused NV3089 method 0x%x detected!", cmd); LOG_WARNING(RSX, "Unused NV3089 methods 0x%x detected!", cmd);
} }
break; break;