mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +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