diff options
-rwxr-xr-x | README.md | 2 | ||||
-rwxr-xr-x | src/core/file_sys/card_image.cpp | 48 | ||||
-rwxr-xr-x | src/core/file_sys/card_image.h | 1 | ||||
-rwxr-xr-x | src/video_core/renderer_vulkan/maxwell_to_vk.cpp | 2 | ||||
-rwxr-xr-x | src/video_core/vulkan_common/vulkan_device.cpp | 8 |
5 files changed, 52 insertions, 9 deletions
@@ -1,7 +1,7 @@ | |||
1 | yuzu emulator early access | 1 | yuzu emulator early access |
2 | ============= | 2 | ============= |
3 | 3 | ||
4 | This is the source code for early-access 3817. | 4 | This is the source code for early-access 3818. |
5 | 5 | ||
6 | ## Legal Notice | 6 | ## Legal Notice |
7 | 7 | ||
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index 176f10433..248002c7e 100755 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp | |||
@@ -31,13 +31,9 @@ XCI::XCI(VirtualFile file_, u64 program_id, size_t program_index) | |||
31 | : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA}, | 31 | : file(std::move(file_)), program_nca_status{Loader::ResultStatus::ErrorXCIMissingProgramNCA}, |
32 | partitions(partition_names.size()), | 32 | partitions(partition_names.size()), |
33 | partitions_raw(partition_names.size()), keys{Core::Crypto::KeyManager::Instance()} { | 33 | partitions_raw(partition_names.size()), keys{Core::Crypto::KeyManager::Instance()} { |
34 | if (file->ReadObject(&header) != sizeof(GamecardHeader)) { | 34 | const auto header_status = TryReadHeader(); |
35 | status = Loader::ResultStatus::ErrorBadXCIHeader; | 35 | if (header_status != Loader::ResultStatus::Success) { |
36 | return; | 36 | status = header_status; |
37 | } | ||
38 | |||
39 | if (header.magic != Common::MakeMagic('H', 'E', 'A', 'D')) { | ||
40 | status = Loader::ResultStatus::ErrorBadXCIHeader; | ||
41 | return; | 37 | return; |
42 | } | 38 | } |
43 | 39 | ||
@@ -316,6 +312,44 @@ Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) { | |||
316 | return Loader::ResultStatus::Success; | 312 | return Loader::ResultStatus::Success; |
317 | } | 313 | } |
318 | 314 | ||
315 | Loader::ResultStatus XCI::TryReadHeader() { | ||
316 | constexpr size_t CardInitialDataRegionSize = 0x1000; | ||
317 | |||
318 | // Define the function we'll use to determine if we read a valid header. | ||
319 | const auto ReadCardHeader = [&]() { | ||
320 | // Ensure we can read the entire header. If we can't, we can't read the card image. | ||
321 | if (file->ReadObject(&header) != sizeof(GamecardHeader)) { | ||
322 | return Loader::ResultStatus::ErrorBadXCIHeader; | ||
323 | } | ||
324 | |||
325 | // Ensure the header magic matches. If it doesn't, this isn't a card image header. | ||
326 | if (header.magic != Common::MakeMagic('H', 'E', 'A', 'D')) { | ||
327 | return Loader::ResultStatus::ErrorBadXCIHeader; | ||
328 | } | ||
329 | |||
330 | // We read a card image header. | ||
331 | return Loader::ResultStatus::Success; | ||
332 | }; | ||
333 | |||
334 | // Try to read the header directly. | ||
335 | if (ReadCardHeader() == Loader::ResultStatus::Success) { | ||
336 | return Loader::ResultStatus::Success; | ||
337 | } | ||
338 | |||
339 | // Get the size of the file. | ||
340 | const size_t card_image_size = file->GetSize(); | ||
341 | |||
342 | // If we are large enough to have a key area, offset past the key area and retry. | ||
343 | if (card_image_size >= CardInitialDataRegionSize) { | ||
344 | file = std::make_shared<OffsetVfsFile>(file, card_image_size - CardInitialDataRegionSize, | ||
345 | CardInitialDataRegionSize); | ||
346 | return ReadCardHeader(); | ||
347 | } | ||
348 | |||
349 | // We had no header and aren't large enough to have a key area, so this can't be parsed. | ||
350 | return Loader::ResultStatus::ErrorBadXCIHeader; | ||
351 | } | ||
352 | |||
319 | u8 XCI::GetFormatVersion() { | 353 | u8 XCI::GetFormatVersion() { |
320 | return GetLogoPartition() == nullptr ? 0x1 : 0x2; | 354 | return GetLogoPartition() == nullptr ? 0x1 : 0x2; |
321 | } | 355 | } |
diff --git a/src/core/file_sys/card_image.h b/src/core/file_sys/card_image.h index 4cca539e2..2bc6749f7 100755 --- a/src/core/file_sys/card_image.h +++ b/src/core/file_sys/card_image.h | |||
@@ -128,6 +128,7 @@ public: | |||
128 | 128 | ||
129 | private: | 129 | private: |
130 | Loader::ResultStatus AddNCAFromPartition(XCIPartition part); | 130 | Loader::ResultStatus AddNCAFromPartition(XCIPartition part); |
131 | Loader::ResultStatus TryReadHeader(); | ||
131 | 132 | ||
132 | VirtualFile file; | 133 | VirtualFile file; |
133 | GamecardHeader header{}; | 134 | GamecardHeader header{}; |
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index d6aca7b4f..51523499b 100755 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp | |||
@@ -126,7 +126,7 @@ struct FormatTuple { | |||
126 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM | 126 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1R5G5B5_UNORM |
127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM | 127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM |
128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT | 128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT |
129 | {VK_FORMAT_A2R10G10B10_UNORM_PACK32, Attachable | Storage}, // A2R10G10B10_UNORM | 129 | {VK_FORMAT_A2R10G10B10_UNORM_PACK32, Attachable}, // A2R10G10B10_UNORM |
130 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) | 130 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) |
131 | {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) | 131 | {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) |
132 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM | 132 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 5fefa7c4d..431605abe 100755 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
@@ -71,6 +71,11 @@ constexpr std::array R8G8B8_SSCALED{ | |||
71 | VK_FORMAT_UNDEFINED, | 71 | VK_FORMAT_UNDEFINED, |
72 | }; | 72 | }; |
73 | 73 | ||
74 | constexpr std::array VK_FORMAT_R32G32B32_SFLOAT{ | ||
75 | VK_FORMAT_R32G32B32A32_SFLOAT, | ||
76 | VK_FORMAT_UNDEFINED, | ||
77 | }; | ||
78 | |||
74 | } // namespace Alternatives | 79 | } // namespace Alternatives |
75 | 80 | ||
76 | enum class NvidiaArchitecture { | 81 | enum class NvidiaArchitecture { |
@@ -103,6 +108,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) { | |||
103 | return Alternatives::R16G16B16_SSCALED.data(); | 108 | return Alternatives::R16G16B16_SSCALED.data(); |
104 | case VK_FORMAT_R8G8B8_SSCALED: | 109 | case VK_FORMAT_R8G8B8_SSCALED: |
105 | return Alternatives::R8G8B8_SSCALED.data(); | 110 | return Alternatives::R8G8B8_SSCALED.data(); |
111 | case VK_FORMAT_R32G32B32_SFLOAT: | ||
112 | return Alternatives::VK_FORMAT_R32G32B32_SFLOAT.data(); | ||
106 | default: | 113 | default: |
107 | return nullptr; | 114 | return nullptr; |
108 | } | 115 | } |
@@ -130,6 +137,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica | |||
130 | VK_FORMAT_A2B10G10R10_UINT_PACK32, | 137 | VK_FORMAT_A2B10G10R10_UINT_PACK32, |
131 | VK_FORMAT_A2B10G10R10_UNORM_PACK32, | 138 | VK_FORMAT_A2B10G10R10_UNORM_PACK32, |
132 | VK_FORMAT_A2B10G10R10_USCALED_PACK32, | 139 | VK_FORMAT_A2B10G10R10_USCALED_PACK32, |
140 | VK_FORMAT_A2R10G10B10_UNORM_PACK32, | ||
133 | VK_FORMAT_A8B8G8R8_SINT_PACK32, | 141 | VK_FORMAT_A8B8G8R8_SINT_PACK32, |
134 | VK_FORMAT_A8B8G8R8_SNORM_PACK32, | 142 | VK_FORMAT_A8B8G8R8_SNORM_PACK32, |
135 | VK_FORMAT_A8B8G8R8_SRGB_PACK32, | 143 | VK_FORMAT_A8B8G8R8_SRGB_PACK32, |