mirror of https://github.com/RPCS3/rpcs3.git
rsx: Implement crash-proofing for image_in dst/src formats
This commit is contained in:
parent
83624e1f68
commit
107641626a
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<u8>(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:
|
||||
|
|
Loading…
Reference in New Issue