| 1285 | } |
| 1286 | |
| 1287 | bool createSharedBuffer(VulkanRenderDevice& vkDev, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) |
| 1288 | { |
| 1289 | uint32_t familyCount = static_cast<uint32_t>(vkDev.deviceQueueIndices.size()); |
| 1290 | |
| 1291 | if (familyCount < 2) |
| 1292 | return createBuffer(vkDev.device, vkDev.physicalDevice, size, usage, properties, buffer, bufferMemory); |
| 1293 | |
| 1294 | const VkBufferCreateInfo bufferInfo = { |
| 1295 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, |
| 1296 | .pNext = nullptr, |
| 1297 | .flags = 0, |
| 1298 | .size = size, |
| 1299 | .usage = usage, |
| 1300 | .sharingMode = (familyCount > 1) ? VK_SHARING_MODE_CONCURRENT : VK_SHARING_MODE_EXCLUSIVE, |
| 1301 | .queueFamilyIndexCount = static_cast<uint32_t>(vkDev.deviceQueueIndices.size()), |
| 1302 | .pQueueFamilyIndices = (familyCount > 1) ? vkDev.deviceQueueIndices.data() : nullptr |
| 1303 | }; |
| 1304 | |
| 1305 | VK_CHECK(vkCreateBuffer(vkDev.device, &bufferInfo, nullptr, &buffer)); |
| 1306 | |
| 1307 | VkMemoryRequirements memRequirements; |
| 1308 | vkGetBufferMemoryRequirements(vkDev.device, buffer, &memRequirements); |
| 1309 | |
| 1310 | const VkMemoryAllocateInfo allocInfo = { |
| 1311 | .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, |
| 1312 | .pNext = nullptr, |
| 1313 | .allocationSize = memRequirements.size, |
| 1314 | .memoryTypeIndex = findMemoryType(vkDev.physicalDevice, memRequirements.memoryTypeBits, properties) |
| 1315 | }; |
| 1316 | |
| 1317 | VK_CHECK(vkAllocateMemory(vkDev.device, &allocInfo, nullptr, &bufferMemory)); |
| 1318 | |
| 1319 | vkBindBufferMemory(vkDev.device, buffer, bufferMemory, 0); |
| 1320 | |
| 1321 | return true; |
| 1322 | } |
| 1323 | |
| 1324 | bool createUniformBuffer(VulkanRenderDevice& vkDev, VkBuffer& buffer, VkDeviceMemory& bufferMemory, VkDeviceSize bufferSize) |
| 1325 | { |
no test coverage detected