mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2026-01-05 19:19:43 -06:00
GPU Upload Heap & UMA. (#1421)
* Initial work for GPU upload heap & UMA. * Finish D3D12 Support. * Rework the logic for the GPU Upload Heap fallback. * Only enable UMA on Vulkan on integrated GPUs. * Fix D3D12 fallback condition. --------- Co-authored-by: Dario <dariosamo@gmail.com>
This commit is contained in:
@@ -808,6 +808,12 @@ namespace plume {
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
createInfo.flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT;
|
||||
break;
|
||||
case RenderHeapType::GPU_UPLOAD:
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
||||
bufferInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
createInfo.flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;
|
||||
createInfo.requiredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||
break;
|
||||
default:
|
||||
assert(false && "Unknown heap type.");
|
||||
break;
|
||||
@@ -833,7 +839,7 @@ namespace plume {
|
||||
}
|
||||
|
||||
if (res != VK_SUCCESS) {
|
||||
fprintf(stderr, "vkCreateBuffer failed with error code 0x%X.\n", res);
|
||||
fprintf(stderr, "vmaCreateBuffer failed with error code 0x%X.\n", res);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -3887,6 +3893,15 @@ namespace plume {
|
||||
VkDeviceSize memoryHeapSize = 0;
|
||||
const VkPhysicalDeviceMemoryProperties *memoryProps = nullptr;
|
||||
vmaGetMemoryProperties(allocator, &memoryProps);
|
||||
|
||||
constexpr VkMemoryPropertyFlags uploadHeapPropertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
||||
bool hasHostVisibleDeviceLocalMemory = false;
|
||||
for (uint32_t i = 0; i < memoryProps->memoryTypeCount; i++) {
|
||||
if ((memoryProps->memoryTypes[i].propertyFlags & uploadHeapPropertyFlags) == uploadHeapPropertyFlags) {
|
||||
hasHostVisibleDeviceLocalMemory = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < memoryProps->memoryHeapCount; i++) {
|
||||
if (memoryProps->memoryHeaps[i].flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) {
|
||||
memoryHeapSize = std::max(memoryProps->memoryHeaps[i].size, memoryHeapSize);
|
||||
@@ -3907,6 +3922,8 @@ namespace plume {
|
||||
capabilities.preferHDR = memoryHeapSize > (512 * 1024 * 1024);
|
||||
capabilities.triangleFan = true;
|
||||
capabilities.dynamicDepthBias = true;
|
||||
capabilities.uma = (description.type == RenderDeviceType::INTEGRATED) && hasHostVisibleDeviceLocalMemory;
|
||||
capabilities.gpuUploadHeap = capabilities.uma;
|
||||
|
||||
// Fill Vulkan-only capabilities.
|
||||
loadStoreOpNoneSupported = supportedOptionalExtensions.find(VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME) != supportedOptionalExtensions.end();
|
||||
|
||||
Reference in New Issue
Block a user