diff --git a/rpcs3/Emu/RSX/gcm_enums.cpp b/rpcs3/Emu/RSX/gcm_enums.cpp index 0527fa6dde..81b6369bbd 100644 --- a/rpcs3/Emu/RSX/gcm_enums.cpp +++ b/rpcs3/Emu/RSX/gcm_enums.cpp @@ -1088,8 +1088,8 @@ blit_engine::transfer_operation blit_engine::to_transfer_operation(u8 in) case CELL_GCM_TRANSFER_OPERATION_SRCCOPY: return blit_engine::transfer_operation::srccopy; case CELL_GCM_TRANSFER_OPERATION_SRCCOPY_PREMULT: return blit_engine::transfer_operation::srccopy_premult; case CELL_GCM_TRANSFER_OPERATION_BLEND_PREMULT: return blit_engine::transfer_operation::blend_premult; + default: return blit_engine::transfer_operation::invalid; } - fmt::throw_exception("Unknown transfer operation 0x%x", in); } enum @@ -1126,8 +1126,8 @@ blit_engine::transfer_source_format blit_engine::to_transfer_source_format(u8 in case CELL_GCM_TRANSFER_SCALE_FORMAT_ECR8EYB8ECB8EYA8: return blit_engine::transfer_source_format::ecr8eyb8ecb8eya8; case CELL_GCM_TRANSFER_SCALE_FORMAT_A8B8G8R8: return blit_engine::transfer_source_format::a8b8g8r8; case CELL_GCM_TRANSFER_SCALE_FORMAT_X8B8G8R8: return blit_engine::transfer_source_format::x8b8g8r8; + default: return blit_engine::transfer_source_format::invalid; } - fmt::throw_exception("Unknown transfer source format 0x%x", in); } enum @@ -1145,8 +1145,8 @@ blit_engine::transfer_destination_format blit_engine::to_transfer_destination_fo case CELL_GCM_TRANSFER_SURFACE_FORMAT_R5G6B5: return blit_engine::transfer_destination_format::r5g6b5; case CELL_GCM_TRANSFER_SURFACE_FORMAT_A8R8G8B8: return blit_engine::transfer_destination_format::a8r8g8b8; case CELL_GCM_TRANSFER_SURFACE_FORMAT_Y32: return blit_engine::transfer_destination_format::y32; + default: return blit_engine::transfer_destination_format::invalid; } - fmt::throw_exception("Unknown transfer destination format 0x%x", in); } enum diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 264b84db73..24b0536e43 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -368,6 +368,7 @@ namespace rsx srccopy, srccopy_premult, blend_premult, + invalid, }; transfer_operation to_transfer_operation(u8 in); @@ -387,6 +388,7 @@ namespace rsx ecr8eyb8ecb8eya8, a8b8g8r8, x8b8g8r8, + invalid, }; transfer_source_format to_transfer_source_format(u8 in); @@ -396,6 +398,7 @@ namespace rsx r5g6b5, a8r8g8b8, y32, + invalid }; transfer_destination_format to_transfer_destination_format(u8 in); diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index f5da78be78..c986628a1e 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1090,7 +1090,16 @@ namespace rsx if (operation != rsx::blit_engine::transfer_operation::srccopy) { - fmt::throw_exception("NV3089_IMAGE_IN_SIZE: unknown operation (%d)", static_cast(operation)); + rsx_log.error("NV3089_IMAGE_IN_SIZE: unknown operation (0x%x)", method_registers.registers[NV3089_SET_OPERATION]); + rsx->recover_fifo(); + return; + } + + if (src_color_format == rsx::blit_engine::transfer_source_format::invalid) + { + rsx_log.error("NV3089_IMAGE_IN_SIZE: unknown src color format (0x%x)", method_registers.registers[NV3089_SET_COLOR_FORMAT]); + rsx->recover_fifo(); + return; } const u32 src_offset = method_registers.blit_engine_input_offset(); @@ -1113,6 +1122,14 @@ namespace rsx out_pitch = method_registers.blit_engine_output_pitch_nv3062(); out_alignment = method_registers.blit_engine_output_alignment_nv3062(); is_block_transfer = fcmp(scale_x, 1.f) && fcmp(scale_y, 1.f); + + if (dst_color_format == rsx::blit_engine::transfer_destination_format::invalid) + { + rsx_log.error("NV3089_IMAGE_IN_SIZE: unknown NV3062 dst color format (0x%x)", method_registers.registers[NV3062_SET_COLOR_FORMAT]); + rsx->recover_fifo(); + return; + } + break; } case blit_engine::context_surface::swizzle2d: @@ -1120,6 +1137,14 @@ namespace rsx dst_dma = method_registers.blit_engine_nv309E_location(); dst_offset = method_registers.blit_engine_nv309E_offset(); dst_color_format = method_registers.blit_engine_output_format_nv309E(); + + if (dst_color_format == rsx::blit_engine::transfer_destination_format::invalid) + { + rsx_log.error("NV3089_IMAGE_IN_SIZE: unknown NV309E dst color format (0x%x)", method_registers.registers[NV309E_SET_FORMAT]); + rsx->recover_fifo(); + return; + } + break; } default: