Changed staging to use common base functionality

This commit is contained in:
saschawillems 2016-04-21 21:01:18 +02:00
parent 7098fc19a4
commit 275fb5e23f

View file

@ -78,8 +78,6 @@ public:
VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
{
width = 1280;
height = 720;
zoom = -2.0f;
title = "Vulkan Example - Compute shader particle system";
}
@ -264,10 +262,48 @@ public:
// Buffer size is the same for all storage buffers
uint32_t storageBufferSize = particleBuffer.size() * sizeof(Particle);
createDeviceBuffer(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, storageBufferSize, computeStorageBuffer.buffer,
computeStorageBuffer.memory, computeStorageBuffer.descriptor);
// Staging
// SSBO is static, copy to device local memory
// This results in better performance
updateDeviceBuffer(storageBufferSize, computeStorageBuffer.buffer, particleBuffer.data());
struct {
VkDeviceMemory memory;
VkBuffer buffer;
} stagingBuffer;
VulkanExampleBase::createBuffer(
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
storageBufferSize,
particleBuffer.data(),
&stagingBuffer.buffer,
&stagingBuffer.memory);
VulkanExampleBase::createBuffer(
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
storageBufferSize,
nullptr,
&computeStorageBuffer.buffer,
&computeStorageBuffer.memory);
// Copy to staging buffer
VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
VkBufferCopy copyRegion = {};
copyRegion.size = storageBufferSize;
vkCmdCopyBuffer(
copyCmd,
stagingBuffer.buffer,
computeStorageBuffer.buffer,
1,
&copyRegion);
VulkanExampleBase::flushCommandBuffer(copyCmd, queue, true);
computeStorageBuffer.descriptor.range = storageBufferSize;
computeStorageBuffer.descriptor.buffer = computeStorageBuffer.buffer;
computeStorageBuffer.descriptor.offset = 0;
// Binding description
vertices.bindingDescriptions.resize(1);
@ -524,13 +560,16 @@ public:
void prepareUniformBuffers()
{
// Compute shader uniform buffer block
createDeviceBuffer(
createBuffer(
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
sizeof(computeUbo),
uniformData.computeShader.ubo.buffer,
uniformData.computeShader.ubo.memory,
uniformData.computeShader.ubo.descriptor);
updateDeviceBuffer(sizeof(computeUbo), uniformData.computeShader.ubo.buffer, &computeUbo);
nullptr,
&uniformData.computeShader.ubo.buffer,
&uniformData.computeShader.ubo.memory,
&uniformData.computeShader.ubo.descriptor);
// Map for host access
vkTools::checkResult(vkMapMemory(device, uniformData.computeShader.ubo.memory, 0, sizeof(computeUbo), 0, (void **)&uniformData.computeShader.ubo.mapped));
updateUniformBuffers();
}
@ -551,7 +590,7 @@ public:
computeUbo.destY = normalizedMy;
}
updateDeviceBuffer(sizeof(computeUbo), uniformData.computeShader.ubo.buffer, &computeUbo);
memcpy(uniformData.computeShader.ubo.mapped, &computeUbo, sizeof(computeUbo));
}
// Find and create a compute capable device queue