Use VulkanDevice

This commit is contained in:
saschawillems 2016-07-23 23:24:59 +02:00
parent 053d6423fa
commit ffaea5a430
3 changed files with 52 additions and 82 deletions

View file

@ -145,7 +145,7 @@ public:
gearInfo.rotSpeed = rotationSpeeds[i]; gearInfo.rotSpeed = rotationSpeeds[i];
gearInfo.rotOffset = rotationOffsets[i]; gearInfo.rotOffset = rotationOffsets[i];
gears[i] = new VulkanGear(device, this); gears[i] = new VulkanGear(vulkanDevice);
gears[i]->generate(&gearInfo, queue); gears[i]->generate(&gearInfo, queue);
} }

View file

@ -24,23 +24,14 @@ void VulkanGear::newFace(std::vector<uint32_t> *iBuffer, int a, int b, int c)
iBuffer->push_back(c); iBuffer->push_back(c);
} }
VulkanGear::VulkanGear(VkDevice device, VulkanExampleBase *example)
{
this->device = device;
this->exampleBase = example;
}
VulkanGear::~VulkanGear() VulkanGear::~VulkanGear()
{ {
// Clean up vulkan resources // Clean up vulkan resources
vkDestroyBuffer(device, uniformData.buffer, nullptr); vkDestroyBuffer(vulkanDevice->logicalDevice, uniformData.buffer, nullptr);
vkFreeMemory(device, uniformData.memory, nullptr); vkFreeMemory(vulkanDevice->logicalDevice, uniformData.memory, nullptr);
vkDestroyBuffer(device, vertexBuffer.buf, nullptr); vertexBuffer.destroy();
vkFreeMemory(device, vertexBuffer.mem, nullptr); indexBuffer.destroy();
vkDestroyBuffer(device, indexBuffer.buf, nullptr);
vkFreeMemory(device, indexBuffer.mem, nullptr);
} }
void VulkanGear::generate(GearInfo *gearinfo, VkQueue queue) void VulkanGear::generate(GearInfo *gearinfo, VkQueue queue)
@ -184,49 +175,40 @@ void VulkanGear::generate(GearInfo *gearinfo, VkQueue queue)
if (useStaging) if (useStaging)
{ {
struct { vk::Buffer vertexStaging, indexStaging;
VkBuffer buffer;
VkDeviceMemory memory;
} vertexStaging, indexStaging;
// Create staging buffers // Create staging buffers
// Vertex data // Vertex data
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
&vertexStaging,
vertexBufferSize, vertexBufferSize,
vBuffer.data(), vBuffer.data());
&vertexStaging.buffer,
&vertexStaging.memory);
// Index data // Index data
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
&indexStaging,
indexBufferSize, indexBufferSize,
iBuffer.data(), iBuffer.data());
&indexStaging.buffer,
&indexStaging.memory);
// Create device local buffers // Create device local buffers
// Vertex buffer // Vertex buffer
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
vertexBufferSize, &vertexBuffer,
nullptr, vertexBufferSize);
&vertexBuffer.buf,
&vertexBuffer.mem);
// Index buffer // Index buffer
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
indexBufferSize, &indexBuffer,
nullptr, indexBufferSize);
&indexBuffer.buf,
&indexBuffer.mem);
// Copy from staging buffers // Copy from staging buffers
VkCommandBuffer copyCmd = exampleBase->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
VkBufferCopy copyRegion = {}; VkBufferCopy copyRegion = {};
@ -234,7 +216,7 @@ void VulkanGear::generate(GearInfo *gearinfo, VkQueue queue)
vkCmdCopyBuffer( vkCmdCopyBuffer(
copyCmd, copyCmd,
vertexStaging.buffer, vertexStaging.buffer,
vertexBuffer.buf, vertexBuffer.buffer,
1, 1,
&copyRegion); &copyRegion);
@ -242,38 +224,36 @@ void VulkanGear::generate(GearInfo *gearinfo, VkQueue queue)
vkCmdCopyBuffer( vkCmdCopyBuffer(
copyCmd, copyCmd,
indexStaging.buffer, indexStaging.buffer,
indexBuffer.buf, indexBuffer.buffer,
1, 1,
&copyRegion); &copyRegion);
exampleBase->flushCommandBuffer(copyCmd, queue, true); vulkanDevice->flushCommandBuffer(copyCmd, queue, true);
vkDestroyBuffer(device, vertexStaging.buffer, nullptr); vkDestroyBuffer(vulkanDevice->logicalDevice, vertexStaging.buffer, nullptr);
vkFreeMemory(device, vertexStaging.memory, nullptr); vkFreeMemory(vulkanDevice->logicalDevice, vertexStaging.memory, nullptr);
vkDestroyBuffer(device, indexStaging.buffer, nullptr); vkDestroyBuffer(vulkanDevice->logicalDevice, indexStaging.buffer, nullptr);
vkFreeMemory(device, indexStaging.memory, nullptr); vkFreeMemory(vulkanDevice->logicalDevice, indexStaging.memory, nullptr);
} }
else else
{ {
// Vertex buffer // Vertex buffer
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
&vertexBuffer,
vertexBufferSize, vertexBufferSize,
vBuffer.data(), vBuffer.data());
&vertexBuffer.buf,
&vertexBuffer.mem);
// Index buffer // Index buffer
exampleBase->createBuffer( vulkanDevice->createBuffer(
VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
&indexBuffer,
indexBufferSize, indexBufferSize,
iBuffer.data(), iBuffer.data());
&indexBuffer.buf,
&indexBuffer.mem);
} }
indexBuffer.count = iBuffer.size(); indexCount = iBuffer.size();
prepareUniformBuffer(); prepareUniformBuffer();
} }
@ -282,9 +262,9 @@ void VulkanGear::draw(VkCommandBuffer cmdbuffer, VkPipelineLayout pipelineLayout
{ {
VkDeviceSize offsets[1] = { 0 }; VkDeviceSize offsets[1] = { 0 };
vkCmdBindDescriptorSets(cmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); vkCmdBindDescriptorSets(cmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL);
vkCmdBindVertexBuffers(cmdbuffer, 0, 1, &vertexBuffer.buf, offsets); vkCmdBindVertexBuffers(cmdbuffer, 0, 1, &vertexBuffer.buffer, offsets);
vkCmdBindIndexBuffer(cmdbuffer, indexBuffer.buf, 0, VK_INDEX_TYPE_UINT32); vkCmdBindIndexBuffer(cmdbuffer, indexBuffer.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(cmdbuffer, indexBuffer.count, 1, 0, 0, 1); vkCmdDrawIndexed(cmdbuffer, indexCount, 1, 0, 0, 1);
} }
void VulkanGear::updateUniformBuffer(glm::mat4 perspective, glm::vec3 rotation, float zoom, float timer) void VulkanGear::updateUniformBuffer(glm::mat4 perspective, glm::vec3 rotation, float zoom, float timer)
@ -311,9 +291,9 @@ void VulkanGear::updateUniformBuffer(glm::mat4 perspective, glm::vec3 rotation,
ubo.lightPos.z = cos(glm::radians(timer)) * 8.0f; ubo.lightPos.z = cos(glm::radians(timer)) * 8.0f;
uint8_t *pData; uint8_t *pData;
VK_CHECK_RESULT(vkMapMemory(device, uniformData.memory, 0, sizeof(ubo), 0, (void **)&pData)); VK_CHECK_RESULT(vkMapMemory(vulkanDevice->logicalDevice, uniformData.memory, 0, sizeof(ubo), 0, (void **)&pData));
memcpy(pData, &ubo, sizeof(ubo)); memcpy(pData, &ubo, sizeof(ubo));
vkUnmapMemory(device, uniformData.memory); vkUnmapMemory(vulkanDevice->logicalDevice, uniformData.memory);
} }
void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSetLayout) void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSetLayout)
@ -324,7 +304,7 @@ void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout
&descriptorSetLayout, &descriptorSetLayout,
1); 1);
VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); VK_CHECK_RESULT(vkAllocateDescriptorSets(vulkanDevice->logicalDevice, &allocInfo, &descriptorSet));
// Binding 0 : Vertex shader uniform buffer // Binding 0 : Vertex shader uniform buffer
VkWriteDescriptorSet writeDescriptorSet = VkWriteDescriptorSet writeDescriptorSet =
@ -334,7 +314,7 @@ void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout
0, 0,
&uniformData.descriptor); &uniformData.descriptor);
vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, NULL); vkUpdateDescriptorSets(vulkanDevice->logicalDevice, 1, &writeDescriptorSet, 0, NULL);
} }
void VulkanGear::prepareUniformBuffer() void VulkanGear::prepareUniformBuffer()
@ -347,12 +327,12 @@ void VulkanGear::prepareUniformBuffer()
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
sizeof(ubo)); sizeof(ubo));
VK_CHECK_RESULT(vkCreateBuffer(device, &bufferInfo, nullptr, &uniformData.buffer)); VK_CHECK_RESULT(vkCreateBuffer(vulkanDevice->logicalDevice, &bufferInfo, nullptr, &uniformData.buffer));
vkGetBufferMemoryRequirements(device, uniformData.buffer, &memReqs); vkGetBufferMemoryRequirements(vulkanDevice->logicalDevice, uniformData.buffer, &memReqs);
allocInfo.allocationSize = memReqs.size; allocInfo.allocationSize = memReqs.size;
allocInfo.memoryTypeIndex = exampleBase->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); allocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
VK_CHECK_RESULT(vkAllocateMemory(device, &allocInfo, nullptr, &uniformData.memory)); VK_CHECK_RESULT(vkAllocateMemory(vulkanDevice->logicalDevice, &allocInfo, nullptr, &uniformData.memory));
VK_CHECK_RESULT(vkBindBufferMemory(device, uniformData.buffer, uniformData.memory, 0)); VK_CHECK_RESULT(vkBindBufferMemory(vulkanDevice->logicalDevice, uniformData.buffer, uniformData.memory, 0));
uniformData.descriptor.buffer = uniformData.buffer; uniformData.descriptor.buffer = uniformData.buffer;
uniformData.descriptor.offset = 0; uniformData.descriptor.offset = 0;

View file

@ -22,7 +22,8 @@
#include "vulkan/vulkan.h" #include "vulkan/vulkan.h"
#include "vulkantools.h" #include "vulkantools.h"
#include "vulkanexamplebase.h" #include "vulkandevice.hpp"
#include "vulkanbuffer.hpp"
struct Vertex struct Vertex
{ {
@ -69,27 +70,16 @@ private:
glm::vec3 lightPos; glm::vec3 lightPos;
}; };
VkDevice device; vk::VulkanDevice *vulkanDevice;
// Reference to example for getting memory types
VulkanExampleBase *exampleBase;
glm::vec3 color; glm::vec3 color;
glm::vec3 pos; glm::vec3 pos;
float rotSpeed; float rotSpeed;
float rotOffset; float rotOffset;
struct vk::Buffer vertexBuffer;
{ vk::Buffer indexBuffer;
VkBuffer buf; uint32_t indexCount;
VkDeviceMemory mem;
} vertexBuffer;
struct {
VkBuffer buf;
VkDeviceMemory mem;
uint32_t count;
} indexBuffer;
UBO ubo; UBO ubo;
vkTools::UniformData uniformData; vkTools::UniformData uniformData;
@ -106,7 +96,7 @@ public:
void setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSetLayout); void setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSetLayout);
VulkanGear(VkDevice device, VulkanExampleBase *example); VulkanGear(vk::VulkanDevice *vulkanDevice) : vulkanDevice(vulkanDevice) {};
~VulkanGear(); ~VulkanGear();
void generate(GearInfo *gearinfo, VkQueue queue); void generate(GearInfo *gearinfo, VkQueue queue);