aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xREADME.md2
-rwxr-xr-xsrc/core/file_sys/card_image.cpp48
-rwxr-xr-xsrc/core/file_sys/card_image.h1
-rwxr-xr-xsrc/video_core/renderer_vulkan/maxwell_to_vk.cpp2
-rwxr-xr-xsrc/video_core/vulkan_common/vulkan_device.cpp8
5 files changed, 52 insertions, 9 deletions
diff --git a/README.md b/README.md
index bf0634b0b..2b22dce41 100755
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
1yuzu emulator early access 1yuzu emulator early access
2============= 2=============
3 3
4This is the source code for early-access 3817. 4This 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
315Loader::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
319u8 XCI::GetFormatVersion() { 353u8 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
129private: 129private:
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
74constexpr 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
76enum class NvidiaArchitecture { 81enum 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,