Additional buffer and command buffer functions in base class
This commit is contained in:
parent
267b78f9fc
commit
2e72dce7af
2 changed files with 75 additions and 18 deletions
|
|
@ -190,6 +190,51 @@ void VulkanExampleBase::flushSetupCommandBuffer()
|
||||||
setupCmdBuffer = VK_NULL_HANDLE;
|
setupCmdBuffer = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkCommandBuffer VulkanExampleBase::createCommandBuffer(VkCommandBufferLevel level, bool begin)
|
||||||
|
{
|
||||||
|
VkCommandBuffer cmdBuffer;
|
||||||
|
|
||||||
|
VkCommandBufferAllocateInfo cmdBufAllocateInfo =
|
||||||
|
vkTools::initializers::commandBufferAllocateInfo(
|
||||||
|
cmdPool,
|
||||||
|
level,
|
||||||
|
1);
|
||||||
|
|
||||||
|
vkTools::checkResult(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &cmdBuffer));
|
||||||
|
|
||||||
|
// If requested, also start the new command buffer
|
||||||
|
if (begin)
|
||||||
|
{
|
||||||
|
VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo();
|
||||||
|
vkTools::checkResult(vkBeginCommandBuffer(cmdBuffer, &cmdBufInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmdBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanExampleBase::flushCommandBuffer(VkCommandBuffer commandBuffer, VkQueue queue, bool free)
|
||||||
|
{
|
||||||
|
if (commandBuffer == VK_NULL_HANDLE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vkTools::checkResult(vkEndCommandBuffer(commandBuffer));
|
||||||
|
|
||||||
|
VkSubmitInfo submitInfo = {};
|
||||||
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
submitInfo.commandBufferCount = 1;
|
||||||
|
submitInfo.pCommandBuffers = &commandBuffer;
|
||||||
|
|
||||||
|
vkTools::checkResult(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
|
||||||
|
vkTools::checkResult(vkQueueWaitIdle(queue));
|
||||||
|
|
||||||
|
if (free)
|
||||||
|
{
|
||||||
|
vkFreeCommandBuffers(device, cmdPool, 1, &commandBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanExampleBase::createPipelineCache()
|
void VulkanExampleBase::createPipelineCache()
|
||||||
{
|
{
|
||||||
VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {};
|
VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {};
|
||||||
|
|
@ -238,37 +283,35 @@ VkPipelineShaderStageCreateInfo VulkanExampleBase::loadShader(std::string fileNa
|
||||||
return shaderStage;
|
return shaderStage;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkBool32 VulkanExampleBase::createBuffer(
|
VkBool32 VulkanExampleBase::createBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, void * data, VkBuffer * buffer, VkDeviceMemory * memory)
|
||||||
VkBufferUsageFlags usage,
|
|
||||||
VkDeviceSize size,
|
|
||||||
void * data,
|
|
||||||
VkBuffer *buffer,
|
|
||||||
VkDeviceMemory *memory)
|
|
||||||
{
|
{
|
||||||
VkMemoryRequirements memReqs;
|
VkMemoryRequirements memReqs;
|
||||||
VkMemoryAllocateInfo memAlloc = vkTools::initializers::memoryAllocateInfo();
|
VkMemoryAllocateInfo memAlloc = vkTools::initializers::memoryAllocateInfo();
|
||||||
VkBufferCreateInfo bufferCreateInfo = vkTools::initializers::bufferCreateInfo(usage, size);
|
VkBufferCreateInfo bufferCreateInfo = vkTools::initializers::bufferCreateInfo(usageFlags, size);
|
||||||
|
|
||||||
|
vkTools::checkResult(vkCreateBuffer(device, &bufferCreateInfo, nullptr, buffer));
|
||||||
|
|
||||||
VkResult err = vkCreateBuffer(device, &bufferCreateInfo, nullptr, buffer);
|
|
||||||
assert(!err);
|
|
||||||
vkGetBufferMemoryRequirements(device, *buffer, &memReqs);
|
vkGetBufferMemoryRequirements(device, *buffer, &memReqs);
|
||||||
memAlloc.allocationSize = memReqs.size;
|
memAlloc.allocationSize = memReqs.size;
|
||||||
getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAlloc.memoryTypeIndex);
|
getMemoryType(memReqs.memoryTypeBits, memoryPropertyFlags, &memAlloc.memoryTypeIndex);
|
||||||
err = vkAllocateMemory(device, &memAlloc, nullptr, memory);
|
vkTools::checkResult(vkAllocateMemory(device, &memAlloc, nullptr, memory));
|
||||||
assert(!err);
|
|
||||||
if (data != nullptr)
|
if (data != nullptr)
|
||||||
{
|
{
|
||||||
void *mapped;
|
void *mapped;
|
||||||
err = vkMapMemory(device, *memory, 0, size, 0, &mapped);
|
vkTools::checkResult(vkMapMemory(device, *memory, 0, size, 0, &mapped));
|
||||||
assert(!err);
|
|
||||||
memcpy(mapped, data, size);
|
memcpy(mapped, data, size);
|
||||||
vkUnmapMemory(device, *memory);
|
vkUnmapMemory(device, *memory);
|
||||||
}
|
}
|
||||||
err = vkBindBufferMemory(device, *buffer, *memory, 0);
|
vkTools::checkResult(vkBindBufferMemory(device, *buffer, *memory, 0));
|
||||||
assert(!err);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkBool32 VulkanExampleBase::createBuffer(VkBufferUsageFlags usage, VkDeviceSize size, void * data, VkBuffer *buffer, VkDeviceMemory *memory)
|
||||||
|
{
|
||||||
|
return createBuffer(usage, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, size, data, buffer, memory);
|
||||||
|
}
|
||||||
|
|
||||||
VkBool32 VulkanExampleBase::createBuffer(VkBufferUsageFlags usage, VkDeviceSize size, void * data, VkBuffer * buffer, VkDeviceMemory * memory, VkDescriptorBufferInfo * descriptor)
|
VkBool32 VulkanExampleBase::createBuffer(VkBufferUsageFlags usage, VkDeviceSize size, void * data, VkBuffer * buffer, VkDeviceMemory * memory, VkDescriptorBufferInfo * descriptor)
|
||||||
{
|
{
|
||||||
VkBool32 res = createBuffer(usage, size, data, buffer, memory);
|
VkBool32 res = createBuffer(usage, size, data, buffer, memory);
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,13 @@ public:
|
||||||
// Finalize setup command bufferm submit it to the queue and remove it
|
// Finalize setup command bufferm submit it to the queue and remove it
|
||||||
void flushSetupCommandBuffer();
|
void flushSetupCommandBuffer();
|
||||||
|
|
||||||
|
// Command buffer creation
|
||||||
|
// Creates and returns a new command buffer
|
||||||
|
VkCommandBuffer createCommandBuffer(VkCommandBufferLevel level, bool begin);
|
||||||
|
// End the command buffer, submit it to the queue and free (if requested)
|
||||||
|
// Note : Waits for the queue to become idle
|
||||||
|
void flushCommandBuffer(VkCommandBuffer commandBuffer, VkQueue queue, bool free);
|
||||||
|
|
||||||
// Create a cache pool for rendering pipelines
|
// Create a cache pool for rendering pipelines
|
||||||
void createPipelineCache();
|
void createPipelineCache();
|
||||||
|
|
||||||
|
|
@ -264,8 +271,15 @@ public:
|
||||||
// Load a SPIR-V shader
|
// Load a SPIR-V shader
|
||||||
VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage);
|
VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage);
|
||||||
|
|
||||||
// Create a buffer, fill it with data and bind buffer memory
|
// Create a buffer, fill it with data (if != NULL) and bind buffer memory
|
||||||
// Can be used for e.g. vertex or index buffer based on mesh data
|
VkBool32 createBuffer(
|
||||||
|
VkBufferUsageFlags usageFlags,
|
||||||
|
VkMemoryPropertyFlags memoryPropertyFlags,
|
||||||
|
VkDeviceSize size,
|
||||||
|
void *data,
|
||||||
|
VkBuffer *buffer,
|
||||||
|
VkDeviceMemory *memory);
|
||||||
|
// This version always uses HOST_VISIBLE memory
|
||||||
VkBool32 createBuffer(
|
VkBool32 createBuffer(
|
||||||
VkBufferUsageFlags usage,
|
VkBufferUsageFlags usage,
|
||||||
VkDeviceSize size,
|
VkDeviceSize size,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue