Use VulkanDevice
This commit is contained in:
parent
053d6423fa
commit
ffaea5a430
3 changed files with 52 additions and 82 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
©Region);
|
©Region);
|
||||||
|
|
||||||
|
|
@ -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,
|
||||||
©Region);
|
©Region);
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue