diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 3a94706acc..dbc576eb78 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -451,18 +451,21 @@ void GLFragmentDecompilerThread::Task() 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_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_FLR: SetDst("floor($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_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_MAD: SetDst("($0 * $1 + $2)"); 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_MOV: SetDst("$0"); 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_PK4: LOG_ERROR(RSX, "Unimplemented SCB instruction: PK4"); 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: 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_PKB: LOG_ERROR(RSX, "Unimplemented SCB instruction: PKB"); 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_DDY: SetDst("dFdy($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_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_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_UP2: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP2"); break; - case RSX_FP_OPCODE_UP4: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UP4"); 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: 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_UPB: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPB"); break; case RSX_FP_OPCODE_UPG: LOG_ERROR(RSX, "Unimplemented TEX_SRB instruction: UPG"); break; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index e8f67da265..0a453f66a5 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -11,6 +11,7 @@ #include "Emu/SysCalls/lv2/sys_time.h" #define ARGS(x) (x >= count ? OutOfArgsCount(x, cmd, count, args.addr()) : args[x].ToLE()) +#define CMD_DEBUG 0 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) { auto args = vm::ptr::make(args_addr); @@ -181,77 +174,43 @@ u32 RSXThread::OutOfArgsCount(const uint x, const u32 cmd, const u32 count, cons return 0; } -#define case_4(a, m) \ - case a + m: \ - case a + m * 2: \ - case a + m * 3: \ - index = (cmd - a) / m; \ - case a \ - -#define case_16(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: \ - 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 \ +#define case_2(offset, step) \ + case offset: \ + case offset + step: +#define case_4(offset, step) \ + case_2(offset, step) \ + case_2(offset + 2*step, step) +#define case_8(offset, step) \ + case_4(offset, step) \ + case_4(offset + 4*step, step) +#define case_16(offset, step) \ + case_8(offset, step) \ + case_8(offset + 8*step, step) +#define case_32(offset, step) \ + case_16(offset, step) \ + case_16(offset + 16*step, step) +#define case_range(n, offset, step) \ + case_##n(offset, step) \ + index = (cmd - offset) / step; void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const u32 count) { auto args = vm::ptr::make(args_addr); #if CMD_DEBUG +<<<<<<< HEAD std::string debug = GetMethodName(cmd); debug += "("; for(u32 i=0; i>>>>>> 4b8d61736460fe75f264c7180bd7d9d898b540f5 #endif 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: { 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; @@ -285,7 +246,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV406E_SEMAPHORE_ACQUIRE: { 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; @@ -315,100 +278,112 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // NV4097 case 0x0003fead: - //if(cmd == 0xfeadffff) + { + Flip(); + + m_last_flip_time = get_system_time(); + m_gcm_current_buffer = ARGS(0); + m_read_buffer = true; + m_flip_status = 0; + + if (m_flip_handler) { - //LOG_WARNING(RSX, "Flip()"); - Flip(); - - m_last_flip_time = get_system_time(); - - m_gcm_current_buffer = ARGS(0); - m_read_buffer = true; - m_flip_status = 0; - - if(m_flip_handler) + auto cb = m_flip_handler; + Emu.GetCallbackManager().Async([cb]() { - auto cb = m_flip_handler; - Emu.GetCallbackManager().Async([cb]() - { - cb(1); - }); + cb(1); + }); + } + + auto sync = [&]() + { + double limit; + switch (Ini.GSFrameLimit.GetValue()) + { + case 1: limit = 50.; break; + case 2: limit = 59.94; break; + case 3: limit = 30.; break; + case 4: limit = 60.; break; + case 5: limit = m_fps_limit; break; //TODO + + case 0: + default: + return; } - auto sync = [&]() - { - double limit; - switch (Ini.GSFrameLimit.GetValue()) - { - case 1: limit = 50.; break; - case 2: limit = 59.94; break; - case 3: limit = 30.; break; - case 4: limit = 60.; break; - case 5: limit = m_fps_limit; break; //TODO + std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - m_timer_sync.GetElapsedTimeInMilliSec()))); + m_timer_sync.Start(); + }; - case 0: - default: - return; - } + sync(); - std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - m_timer_sync.GetElapsedTimeInMilliSec()))); - m_timer_sync.Start(); - }; - - sync(); - - //Emu.Pause(); - } + //Emu.Pause(); + } break; case NV4097_NO_OPERATION: { // Nothing to do here } + 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: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_NOTIFY: 0x%x", ARGS(0)); + { + LOG_WARNING(RSX, "TODO: NV4097_NOTIFY: 0x%x", ARGS(0)); + } } break; case NV4097_WAIT_FOR_IDLE: { 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; case NV4097_PM_TRIGGER: { 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; // Texture - case_16(NV4097_SET_TEXTURE_FORMAT, 0x20): - case_16(NV4097_SET_TEXTURE_OFFSET, 0x20): - case_16(NV4097_SET_TEXTURE_FILTER, 0x20): - case_16(NV4097_SET_TEXTURE_ADDRESS, 0x20): - case_16(NV4097_SET_TEXTURE_IMAGE_RECT, 32): - case_16(NV4097_SET_TEXTURE_BORDER_COLOR, 0x20): - case_16(NV4097_SET_TEXTURE_CONTROL0, 0x20): - case_16(NV4097_SET_TEXTURE_CONTROL1, 0x20): + case_range(16, NV4097_SET_TEXTURE_FORMAT, 0x20) + case_range(16, NV4097_SET_TEXTURE_OFFSET, 0x20) + case_range(16, NV4097_SET_TEXTURE_FILTER, 0x20) + case_range(16, NV4097_SET_TEXTURE_ADDRESS, 0x20) + case_range(16, NV4097_SET_TEXTURE_IMAGE_RECT, 32) + case_range(16, NV4097_SET_TEXTURE_BORDER_COLOR, 0x20) + case_range(16, NV4097_SET_TEXTURE_CONTROL0, 0x20) + case_range(16, NV4097_SET_TEXTURE_CONTROL1, 0x20) { // Done using methodRegisters in RSXTexture.cpp } 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; - case_16(NV4097_SET_TEXTURE_CONTROL3, 4): + case_range(16, NV4097_SET_TEXTURE_CONTROL3, 4) { RSXTexture& tex = m_textures[index]; const u32 a0 = ARGS(0); @@ -419,19 +394,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const break; // Vertex Texture - case_4(NV4097_SET_VERTEX_TEXTURE_FORMAT, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_OFFSET, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_FILTER, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_ADDRESS, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_IMAGE_RECT, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_BORDER_COLOR, 0x20): - case_4(NV4097_SET_VERTEX_TEXTURE_CONTROL0, 0x20): + case_range(4, NV4097_SET_VERTEX_TEXTURE_FORMAT, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_OFFSET, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_FILTER, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_ADDRESS, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_IMAGE_RECT, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_BORDER_COLOR, 0x20) + case_range(4, NV4097_SET_VERTEX_TEXTURE_CONTROL0, 0x20) { // Done using methodRegisters in RSXTexture.cpp } break; - case_4(NV4097_SET_VERTEX_TEXTURE_CONTROL3, 0x20) : + case_range(4, NV4097_SET_VERTEX_TEXTURE_CONTROL3, 0x20) { RSXVertexTexture& tex = m_vertex_textures[index]; const u32 a0 = ARGS(0); @@ -442,7 +417,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const break; // Vertex data - case_16(NV4097_SET_VERTEX_DATA4UB_M, 4): + case_range(16, NV4097_SET_VERTEX_DATA4UB_M, 4) { const u32 a0 = ARGS(0); 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(v2); 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); } 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 a1 = ARGS(1); @@ -481,7 +457,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } 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 a1 = ARGS(1); @@ -507,10 +483,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } 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); - CMD_LOG("num=%d, addr=0x%x", index, addr); + m_vertex_data[index].addr = addr; 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; - case_16(NV4097_SET_VERTEX_DATA_ARRAY_FORMAT, 4): + case_range(16, NV4097_SET_VERTEX_DATA_ARRAY_FORMAT, 4) { const u32 a0 = ARGS(0); 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 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]; cv.frequency = frequency; cv.stride = stride; @@ -535,14 +509,17 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const 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); + } break; // Vertex Attribute case NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: 0x%x", ARGS(0)); + if (u32 mask = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: 0x%x", mask); + } //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: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: 0x%x", ARGS(0)); + if (u32 mask = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: 0x%x", mask); + } //VertexData[0].prog.attributeOutputMask = ARGS(0); //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: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_COLOR_MASK_MRT: 0x%x", ARGS(0)); + if (u32 mask = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_COLOR_MASK_MRT: 0x%x", mask); + } } break; @@ -677,8 +658,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_BLEND_COLOR2: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_BLEND_COLOR2: 0x % x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO : NV4097_SET_BLEND_COLOR2: 0x%x", value); + } } 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: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_REDUCE_DST_COLOR: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_REDUCE_DST_COLOR: 0x%x", value); + } } 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; } - 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; @@ -749,6 +734,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const m_set_viewport_vertical = true; m_viewport_y = ARGS(0) & 0xffff; m_viewport_h = ARGS(0) >> 16; + + //LOG_NOTICE(RSX, "NV4097_SET_VIEWPORT_VERTICAL: y=%d, h=%d", m_viewport_y, m_viewport_h); } 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_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; @@ -780,7 +767,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const m_set_clip = true; 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; @@ -864,6 +851,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } break; + case NV4097_SET_CYLINDRICAL_WRAP: + { + if (ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_CYLINDRICAL_WRAP: 0x%x", ARGS(0)); + } + } + break; + // Clearing 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: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_HORIZONTAL: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_CLEAR_RECT_HORIZONTAL: 0x%x", value); + } } break; case NV4097_SET_CLEAR_RECT_VERTICAL: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_VERTICAL: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_CLEAR_RECT_VERTICAL: 0x%x", value); + } } break; // 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: { for(u32 c=0; c= 2) { + + if (count >= 2) + { 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; @@ -1020,6 +1031,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const const u32 a0 = ARGS(0); //LOG_WARNING(RSX, "NV4097_SET_BEGIN_END: 0x%x", a0); + if (!m_indexed_array.m_count && !m_draw_array_count) { 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: { 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); m_cur_shader_prog->offset = a0 & ~0x3; 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; + 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: { const u32 a0 = ARGS(0); @@ -1114,17 +1134,20 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } 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); 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; } - for(u32 i=0; idata.push_back(ARGS(i)); + for (u32 i = 0; i < count; ++i) + { + m_cur_vertex_prog->data.push_back(ARGS(i)); + } } break; @@ -1135,18 +1158,27 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const 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; } //m_cur_vertex_prog->Decompile(); 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: { 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; } @@ -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); - 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); + + //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; @@ -1168,8 +1201,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Invalidation case NV4097_INVALIDATE_L2: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_L2: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_INVALIDATE_L2: 0x%x", value); + } } break; @@ -1187,8 +1222,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_INVALIDATE_ZCULL: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_ZCULL: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_INVALIDATE_ZCULL: 0x%x", value); + } } break; @@ -1351,16 +1388,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_SCULL_CONTROL: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_SCULL_CONTROL: 0x%x", ARGS(0)); - - //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; + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_SCULL_CONTROL: 0x%x", value); + } } break; @@ -1389,8 +1420,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // Point sprite case NV4097_SET_POINT_PARAMS_ENABLE: { - if (ARGS(0)) - LOG_ERROR(RSX, "NV4097_SET_POINT_PARAMS_ENABLE: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_POINT_PARAMS_ENABLE: 0x%x", value); + } } 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_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); } break; @@ -1516,7 +1548,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const { 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; } @@ -1533,7 +1565,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const 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; } } @@ -1542,9 +1574,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_SURFACE_PITCH_Z: { m_surface_pitch_z = ARGS(0); + 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; } } @@ -1557,7 +1590,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const 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; } } @@ -1587,7 +1620,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const { 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; @@ -1601,15 +1634,19 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_CONTEXT_DMA_SEMAPHORE: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", value); + } } break; case NV4097_SET_CONTEXT_DMA_NOTIFIES: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_CONTEXT_DMA_NOTIFIES: 0x%x", value); + } } break; @@ -1650,7 +1687,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const const u8 alphaToOne = (a0 >> 8) & 0xf; const u16 sampleMask = a0 >> 16; - LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: 0x%x", a0); + if (a0) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: 0x%x", a0); + } } break; @@ -1719,35 +1759,37 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_ZCULL_CONTROL0: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL0: 0x%x", ARGS(0)); - - //m_set_depth_func = true; - //m_depth_func = ARGS(0) >> 4; + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_CONTROL0: 0x%x", value); + } } break; case NV4097_SET_ZCULL_CONTROL1: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL1: 0x%x", ARGS(0)); - - //m_set_depth_func = true; - //m_depth_func = ARGS(0) >> 4; + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_CONTROL1: 0x%x", value); + } } break; case NV4097_SET_ZCULL_STATS_ENABLE: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_STATS_ENABLE: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_SET_ZCULL_STATS_ENABLE: 0x%x", value); + } } break; case NV4097_ZCULL_SYNC: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_ZCULL_SYNC: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV4097_ZCULL_SYNC: 0x%x", value); + } } 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_STATS3: value = 0; - LOG_WARNING(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type); + LOG_ERROR(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type); break; default: value = 0; - LOG_WARNING(RSX, "NV4097_GET_REPORT: Bad type %d", type); + LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type); break; } @@ -1800,6 +1842,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const break; default: LOG_ERROR(RSX, "NV4097_CLEAR_REPORT_VALUE: Bad type: %d", type); + 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 zclampEnable = (ARGS(0) >> 4) & 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; - // Windows Clipping (Doesn't seem to be relevant?) case NV4097_SET_WINDOW_OFFSET: { const u16 x = ARGS(0); 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; case NV4097_SET_FREQUENCY_DIVIDER_OPERATION: { m_set_frequency_divider_operation = ARGS(0); + + LOG_WARNING(RSX, "TODO: NV4097_SET_FREQUENCY_DIVIDER_OPERATION: %d", m_set_frequency_divider_operation); } 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 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; 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); } break; @@ -1900,7 +1947,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const const u32 notify = ARGS(7); // 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); } @@ -1910,7 +1958,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } 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); } } @@ -1925,22 +1973,26 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const } else { - LOG_ERROR(RSX, "NV0039_OFFSET_OUT: TODO: offset=0x%x", offset); + LOG_ERROR(RSX, "TODO: NV0039_OFFSET_OUT: offset=0x%x", offset); } } break; case NV0039_PITCH_IN: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV0039_PITCH_IN: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV0039_PITCH_IN: 0x%x", value); + } } break; case NV0039_BUFFER_NOTIFY: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV0039_BUFFER_NOTIFY: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV0039_BUFFER_NOTIFY: 0x%x", value); + } } break; @@ -1968,8 +2020,10 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // NV309E case NV309E_SET_CONTEXT_DMA_IMAGE: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_IMAGE: 0x%x", ARGS(0)); + if (u32 value = ARGS(0)) + { + LOG_WARNING(RSX, "TODO: NV309E_SET_CONTEXT_DMA_IMAGE: 0x%x", value); + } } 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 format = ARGS(0); 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; @@ -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: [%d]: %f, %f, %f, %f", c.id, c.x, c.y, c.z, c.w); 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; @@ -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) { - 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; @@ -2069,7 +2125,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const u8* pixels_dst = vm::get_ptr(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, "*** 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); for(u16 y=0; y> 16; m_color_conv_dsdx = ARGS(7); m_color_conv_dtdy = ARGS(8); + + LOG_WARNING(RSX, "TODO: NV3089_SET_COLOR_CONVERSION"); } 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: { - LOG_WARNING(RSX, "Unused NV3089 method 0x%x detected!", cmd); + LOG_WARNING(RSX, "Unused NV3089 methods 0x%x detected!", cmd); } break;