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;
|
VkPipeline compute;
|
||||||
} pipelines;
|
} pipelines;
|
||||||
|
|
||||||
int vertexBufferSize;
|
|
||||||
|
|
||||||
VkQueue computeQueue;
|
VkQueue computeQueue;
|
||||||
VkCommandBuffer computeCmdBuffer;
|
VkCommandBuffer computeCmdBuffer;
|
||||||
VkPipelineLayout computePipelineLayout;
|
VkPipelineLayout computePipelineLayout;
|
||||||
|
|
@ -299,24 +297,54 @@ public:
|
||||||
VkResult err;
|
VkResult err;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
|
struct StagingBuffer {
|
||||||
|
VkDeviceMemory memory;
|
||||||
|
VkBuffer buffer;
|
||||||
|
} stagingBuffer;
|
||||||
|
|
||||||
|
// Allocate and fill host-visible staging storage buffer object
|
||||||
|
|
||||||
// Allocate and fill storage buffer object
|
// Allocate and fill storage buffer object
|
||||||
VkBufferCreateInfo vBufferInfo =
|
VkBufferCreateInfo vBufferInfo =
|
||||||
vkTools::initializers::bufferCreateInfo(
|
vkTools::initializers::bufferCreateInfo(
|
||||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
|
||||||
storageBufferSize);
|
storageBufferSize);
|
||||||
err = vkCreateBuffer(device, &vBufferInfo, nullptr, &computeStorageBuffer.buffer);
|
vkTools::checkResult(vkCreateBuffer(device, &vBufferInfo, nullptr, &stagingBuffer.buffer));
|
||||||
assert(!err);
|
vkGetBufferMemoryRequirements(device, stagingBuffer.buffer, &memReqs);
|
||||||
vkGetBufferMemoryRequirements(device, computeStorageBuffer.buffer, &memReqs);
|
|
||||||
memAlloc.allocationSize = memReqs.size;
|
memAlloc.allocationSize = memReqs.size;
|
||||||
getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
|
getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
|
||||||
err = vkAllocateMemory(device, &memAlloc, nullptr, &computeStorageBuffer.memory);
|
vkTools::checkResult(vkAllocateMemory(device, &memAlloc, nullptr, &stagingBuffer.memory));
|
||||||
assert(!err);
|
vkTools::checkResult(vkMapMemory(device, stagingBuffer.memory, 0, storageBufferSize, 0, &data));
|
||||||
err = vkMapMemory(device, computeStorageBuffer.memory, 0, storageBufferSize, 0, &data);
|
|
||||||
assert(!err);
|
|
||||||
memcpy(data, particleBuffer.data(), storageBufferSize);
|
memcpy(data, particleBuffer.data(), storageBufferSize);
|
||||||
vkUnmapMemory(device, computeStorageBuffer.memory);
|
vkUnmapMemory(device, stagingBuffer.memory);
|
||||||
err = vkBindBufferMemory(device, computeStorageBuffer.buffer, computeStorageBuffer.memory, 0);
|
vkTools::checkResult(vkBindBufferMemory(device, stagingBuffer.buffer, stagingBuffer.memory, 0));
|
||||||
assert(!err);
|
|
||||||
|
// 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.buffer = computeStorageBuffer.buffer;
|
||||||
computeStorageBuffer.descriptor.offset = 0;
|
computeStorageBuffer.descriptor.offset = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue