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) VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
{ {
width = 1280;
height = 720;
zoom = -2.0f; zoom = -2.0f;
title = "Vulkan Example - Compute shader particle system"; title = "Vulkan Example - Compute shader particle system";
} }
@ -264,10 +262,48 @@ public:
// Buffer size is the same for all storage buffers // Buffer size is the same for all storage buffers
uint32_t storageBufferSize = particleBuffer.size() * sizeof(Particle); uint32_t storageBufferSize = particleBuffer.size() * sizeof(Particle);
createDeviceBuffer(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, storageBufferSize, computeStorageBuffer.buffer, // Staging
computeStorageBuffer.memory, computeStorageBuffer.descriptor); // 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 // Binding description
vertices.bindingDescriptions.resize(1); vertices.bindingDescriptions.resize(1);
@ -524,13 +560,16 @@ public:
void prepareUniformBuffers() void prepareUniformBuffers()
{ {
// Compute shader uniform buffer block // Compute shader uniform buffer block
createDeviceBuffer( createBuffer(
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
sizeof(computeUbo), sizeof(computeUbo),
uniformData.computeShader.ubo.buffer, nullptr,
uniformData.computeShader.ubo.memory, &uniformData.computeShader.ubo.buffer,
uniformData.computeShader.ubo.descriptor); &uniformData.computeShader.ubo.memory,
updateDeviceBuffer(sizeof(computeUbo), uniformData.computeShader.ubo.buffer, &computeUbo); &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(); updateUniformBuffers();
} }
@ -551,7 +590,7 @@ public:
computeUbo.destY = normalizedMy; 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 // Find and create a compute capable device queue