Use staging buffer and move ssbo to device local memory
This commit is contained in:
parent
fcdc8f8973
commit
51e840416d
1 changed files with 41 additions and 13 deletions
|
|
@ -46,8 +46,6 @@ public:
|
|||
VkPipeline compute;
|
||||
} pipelines;
|
||||
|
||||
int vertexBufferSize;
|
||||
|
||||
VkQueue computeQueue;
|
||||
VkCommandBuffer computeCmdBuffer;
|
||||
VkPipelineLayout computePipelineLayout;
|
||||
|
|
@ -299,24 +297,54 @@ public:
|
|||
VkResult err;
|
||||
void *data;
|
||||
|
||||
struct StagingBuffer {
|
||||
VkDeviceMemory memory;
|
||||
VkBuffer buffer;
|
||||
} stagingBuffer;
|
||||
|
||||
// Allocate and fill host-visible staging storage buffer object
|
||||
|
||||
// Allocate and fill storage buffer object
|
||||
VkBufferCreateInfo vBufferInfo =
|
||||
vkTools::initializers::bufferCreateInfo(
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
|
||||
storageBufferSize);
|
||||
err = vkCreateBuffer(device, &vBufferInfo, nullptr, &computeStorageBuffer.buffer);
|
||||
assert(!err);
|
||||
vkGetBufferMemoryRequirements(device, computeStorageBuffer.buffer, &memReqs);
|
||||
vkTools::checkResult(vkCreateBuffer(device, &vBufferInfo, nullptr, &stagingBuffer.buffer));
|
||||
vkGetBufferMemoryRequirements(device, stagingBuffer.buffer, &memReqs);
|
||||
memAlloc.allocationSize = memReqs.size;
|
||||
getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
|
||||
err = vkAllocateMemory(device, &memAlloc, nullptr, &computeStorageBuffer.memory);
|
||||
assert(!err);
|
||||
err = vkMapMemory(device, computeStorageBuffer.memory, 0, storageBufferSize, 0, &data);
|
||||
assert(!err);
|
||||
vkTools::checkResult(vkAllocateMemory(device, &memAlloc, nullptr, &stagingBuffer.memory));
|
||||
vkTools::checkResult(vkMapMemory(device, stagingBuffer.memory, 0, storageBufferSize, 0, &data));
|
||||
memcpy(data, particleBuffer.data(), storageBufferSize);
|
||||
vkUnmapMemory(device, computeStorageBuffer.memory);
|
||||
err = vkBindBufferMemory(device, computeStorageBuffer.buffer, computeStorageBuffer.memory, 0);
|
||||
assert(!err);
|
||||
vkUnmapMemory(device, stagingBuffer.memory);
|
||||
vkTools::checkResult(vkBindBufferMemory(device, stagingBuffer.buffer, stagingBuffer.memory, 0));
|
||||
|
||||
// Allocate device local storage buffer ojbect
|
||||
vBufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
||||
vkTools::checkResult(vkCreateBuffer(device, &vBufferInfo, nullptr, &computeStorageBuffer.buffer));
|
||||
vkGetBufferMemoryRequirements(device, computeStorageBuffer.buffer, &memReqs);
|
||||
memAlloc.allocationSize = memReqs.size;
|
||||
getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex);
|
||||
vkTools::checkResult(vkAllocateMemory(device, &memAlloc, nullptr, &computeStorageBuffer.memory));
|
||||
vkTools::checkResult(vkBindBufferMemory(device, computeStorageBuffer.buffer, computeStorageBuffer.memory, 0));
|
||||
|
||||
// Copy from host to device
|
||||
createSetupCommandBuffer();
|
||||
|
||||
VkBufferCopy copyRegion = {};
|
||||
copyRegion.size = storageBufferSize;
|
||||
vkCmdCopyBuffer(
|
||||
setupCmdBuffer,
|
||||
stagingBuffer.buffer,
|
||||
computeStorageBuffer.buffer,
|
||||
1,
|
||||
©Region);
|
||||
|
||||
flushSetupCommandBuffer();
|
||||
|
||||
// Destroy staging buffer
|
||||
vkDestroyBuffer(device, stagingBuffer.buffer, nullptr);
|
||||
vkFreeMemory(device, stagingBuffer.memory, nullptr);
|
||||
|
||||
computeStorageBuffer.descriptor.buffer = computeStorageBuffer.buffer;
|
||||
computeStorageBuffer.descriptor.offset = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue