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: 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_SRCCOPY_PREMULT: return blit_engine::transfer_operation::srccopy_premult;
|
||||||
case CELL_GCM_TRANSFER_OPERATION_BLEND_PREMULT: return blit_engine::transfer_operation::blend_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
|
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_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_A8B8G8R8: return blit_engine::transfer_source_format::a8b8g8r8;
|
||||||
case CELL_GCM_TRANSFER_SCALE_FORMAT_X8B8G8R8: return blit_engine::transfer_source_format::x8b8g8r8;
|
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
|
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_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_A8R8G8B8: return blit_engine::transfer_destination_format::a8r8g8b8;
|
||||||
case CELL_GCM_TRANSFER_SURFACE_FORMAT_Y32: return blit_engine::transfer_destination_format::y32;
|
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
|
enum
|
||||||
|
|
|
@ -368,6 +368,7 @@ namespace rsx
|
||||||
srccopy,
|
srccopy,
|
||||||
srccopy_premult,
|
srccopy_premult,
|
||||||
blend_premult,
|
blend_premult,
|
||||||
|
invalid,
|
||||||
};
|
};
|
||||||
|
|
||||||
transfer_operation to_transfer_operation(u8 in);
|
transfer_operation to_transfer_operation(u8 in);
|
||||||
|
@ -387,6 +388,7 @@ namespace rsx
|
||||||
ecr8eyb8ecb8eya8,
|
ecr8eyb8ecb8eya8,
|
||||||
a8b8g8r8,
|
a8b8g8r8,
|
||||||
x8b8g8r8,
|
x8b8g8r8,
|
||||||
|
invalid,
|
||||||
};
|
};
|
||||||
|
|
||||||
transfer_source_format to_transfer_source_format(u8 in);
|
transfer_source_format to_transfer_source_format(u8 in);
|
||||||
|
@ -396,6 +398,7 @@ namespace rsx
|
||||||
r5g6b5,
|
r5g6b5,
|
||||||
a8r8g8b8,
|
a8r8g8b8,
|
||||||
y32,
|
y32,
|
||||||
|
invalid
|
||||||
};
|
};
|
||||||
|
|
||||||
transfer_destination_format to_transfer_destination_format(u8 in);
|
transfer_destination_format to_transfer_destination_format(u8 in);
|
||||||
|
|
|
@ -1090,7 +1090,16 @@ namespace rsx
|
||||||
|
|
||||||
if (operation != rsx::blit_engine::transfer_operation::srccopy)
|
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();
|
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_pitch = method_registers.blit_engine_output_pitch_nv3062();
|
||||||
out_alignment = method_registers.blit_engine_output_alignment_nv3062();
|
out_alignment = method_registers.blit_engine_output_alignment_nv3062();
|
||||||
is_block_transfer = fcmp(scale_x, 1.f) && fcmp(scale_y, 1.f);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case blit_engine::context_surface::swizzle2d:
|
case blit_engine::context_surface::swizzle2d:
|
||||||
|
@ -1120,6 +1137,14 @@ namespace rsx
|
||||||
dst_dma = method_registers.blit_engine_nv309E_location();
|
dst_dma = method_registers.blit_engine_nv309E_location();
|
||||||
dst_offset = method_registers.blit_engine_nv309E_offset();
|
dst_offset = method_registers.blit_engine_nv309E_offset();
|
||||||
dst_color_format = method_registers.blit_engine_output_format_nv309E();
|
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;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue