mirror of
https://github.com/PabloMK7/citra.git
synced 2025-09-08 03:40:05 +00:00
Refactor Vulkan stream buffer memory type selection
This is a fix for GPUs with Vulkan V1.1 and V1.2
This commit is contained in:
parent
5115f640c2
commit
ca1e01ad05
1 changed files with 30 additions and 9 deletions
|
@ -33,11 +33,9 @@ vk::MemoryPropertyFlags MakePropertyFlags(BufferType type) {
|
|||
case BufferType::Upload:
|
||||
return vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
|
||||
case BufferType::Download:
|
||||
return vk::MemoryPropertyFlagBits::eHostVisible |
|
||||
vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostCached;
|
||||
return vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostCached;
|
||||
case BufferType::Stream:
|
||||
return vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible |
|
||||
vk::MemoryPropertyFlagBits::eHostCoherent;
|
||||
return vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
|
||||
default:
|
||||
UNREACHABLE_MSG("Unknown buffer type {}", type);
|
||||
return vk::MemoryPropertyFlagBits::eHostVisible;
|
||||
|
@ -47,19 +45,42 @@ vk::MemoryPropertyFlags MakePropertyFlags(BufferType type) {
|
|||
/// Get the preferred host visible memory type.
|
||||
u32 GetMemoryType(const vk::PhysicalDeviceMemoryProperties& properties, BufferType type) {
|
||||
vk::MemoryPropertyFlags flags = MakePropertyFlags(type);
|
||||
std::optional preferred_type = FindMemoryType(properties, flags);
|
||||
std::optional<u32> preferred_type;
|
||||
|
||||
// Try to find a memory type with all the requested flags
|
||||
preferred_type = FindMemoryType(properties, flags);
|
||||
if (preferred_type) {
|
||||
return *preferred_type;
|
||||
}
|
||||
|
||||
// If not found, try removing flags one by one
|
||||
constexpr std::array remove_flags = {
|
||||
vk::MemoryPropertyFlagBits::eDeviceLocal,
|
||||
vk::MemoryPropertyFlagBits::eHostCached,
|
||||
vk::MemoryPropertyFlagBits::eHostCoherent,
|
||||
};
|
||||
|
||||
for (u32 i = 0; i < remove_flags.size() && !preferred_type; i++) {
|
||||
flags &= ~remove_flags[i];
|
||||
for (auto remove_flag : remove_flags) {
|
||||
if ((flags & remove_flag) == vk::MemoryPropertyFlags{}) {
|
||||
continue;
|
||||
}
|
||||
flags &= ~remove_flag;
|
||||
preferred_type = FindMemoryType(properties, flags);
|
||||
if (preferred_type) {
|
||||
return *preferred_type;
|
||||
}
|
||||
}
|
||||
ASSERT_MSG(preferred_type, "No suitable memory type found");
|
||||
return preferred_type.value();
|
||||
|
||||
// If still not found, try with only eHostVisible flag
|
||||
preferred_type = FindMemoryType(properties, vk::MemoryPropertyFlagBits::eHostVisible);
|
||||
if (preferred_type) {
|
||||
return *preferred_type;
|
||||
}
|
||||
|
||||
// If we reach here, we couldn't find any suitable memory type
|
||||
LOG_CRITICAL(Render_Vulkan, "Failed to find a suitable memory type for buffer type {}",
|
||||
BufferTypeName(type));
|
||||
return 0; // Return 0 as a fallback, though this will likely cause issues
|
||||
}
|
||||
|
||||
constexpr u64 WATCHES_INITIAL_RESERVE = 0x4000;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue