10#include <vulkan/vulkan_core.h>
12namespace EngineCore::ComputeDebug
27 std::vector<T> readbackBuffer(
29 VkPhysicalDevice physicalDevice,
30 const VulkanBuffer & buffer,
42 void logObjectCullingResults( uint32_t objectCount, uint32_t survivingCount );
52 void logMeshletCullingResults( uint32_t meshletCount, uint32_t visibleCount );
62 void logCounter(
const char * name, uint32_t value );
74 uint32_t readbackCounter(
76 VkPhysicalDevice physicalDevice,
77 const VulkanBuffer & buffer
83namespace EngineCore::ComputeDebug
86 std::vector<T> readbackBuffer(
88 VkPhysicalDevice physicalDevice,
89 const VulkanBuffer & buffer,
93 std::vector<T> result( count );
95 const VkDeviceSize bufferSize = count *
sizeof( T );
98 VkBufferCreateInfo stagingBufferInfo{ VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
99 stagingBufferInfo.size = bufferSize;
100 stagingBufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
101 stagingBufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
103 VkBuffer stagingBuffer;
104 if ( vkCreateBuffer( device, &stagingBufferInfo,
nullptr, &stagingBuffer ) != VK_SUCCESS )
106 PLOGE <<
"Failed to create staging buffer for readback";
110 VkMemoryRequirements memRequirements;
111 vkGetBufferMemoryRequirements( device, stagingBuffer, &memRequirements );
113 VkPhysicalDeviceMemoryProperties memProperties;
114 vkGetPhysicalDeviceMemoryProperties( physicalDevice, &memProperties );
116 uint32_t memoryTypeIndex = UINT32_MAX;
117 for ( uint32_t i = 0; i < memProperties.memoryTypeCount; i++ )
119 if ( ( memRequirements.memoryTypeBits & ( 1 << i ) ) &&
120 ( memProperties.memoryTypes[i].propertyFlags &
121 ( VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT ) ) ==
122 ( VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT ) )
129 if ( memoryTypeIndex == UINT32_MAX )
131 PLOGE <<
"Failed to find suitable memory type for readback buffer";
132 vkDestroyBuffer( device, stagingBuffer,
nullptr );
136 VkMemoryAllocateInfo allocInfo{ VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };
137 allocInfo.allocationSize = memRequirements.size;
138 allocInfo.memoryTypeIndex = memoryTypeIndex;
140 VkDeviceMemory stagingMemory;
141 if ( vkAllocateMemory( device, &allocInfo,
nullptr, &stagingMemory ) != VK_SUCCESS )
143 PLOGE <<
"Failed to allocate staging memory for readback";
144 vkDestroyBuffer( device, stagingBuffer,
nullptr );
148 vkBindBufferMemory( device, stagingBuffer, stagingMemory, 0 );
152 vkMapMemory( device, stagingMemory, 0, bufferSize, 0, &mappedData );
161 memcpy( result.data(), mappedData, bufferSize );
163 vkUnmapMemory( device, stagingMemory );
166 vkDestroyBuffer( device, stagingBuffer,
nullptr );
167 vkFreeMemory( device, stagingMemory,
nullptr );