rsx: Implement crash-proofing for image_in dst/src formats

This commit is contained in:
Eladash 2021-08-13 20:12:54 +03:00 committed by kd-11
parent 83624e1f68
commit 107641626a
3 changed files with 32 additions and 4 deletions

View File

@ -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

View File

@ -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);

View File

@ -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: