Clean up Vulkan resources used by text overlay
This commit is contained in:
parent
b501b915ac
commit
1d87aac565
1 changed files with 40 additions and 47 deletions
|
|
@ -75,11 +75,11 @@ private:
|
||||||
VkPipelineLayout pipelineLayout;
|
VkPipelineLayout pipelineLayout;
|
||||||
VkPipelineCache pipelineCache;
|
VkPipelineCache pipelineCache;
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
|
VkRenderPass renderPass;
|
||||||
VkCommandPool commandPool;
|
VkCommandPool commandPool;
|
||||||
std::vector<VkCommandBuffer> cmdBuffers;
|
std::vector<VkCommandBuffer> cmdBuffers;
|
||||||
std::vector<VkFramebuffer*> frameBuffers;
|
std::vector<VkFramebuffer*> frameBuffers;
|
||||||
|
std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
||||||
VkRenderPass renderPass;
|
|
||||||
|
|
||||||
// Pointer to mapped vertex buffer
|
// Pointer to mapped vertex buffer
|
||||||
glm::vec4 *mapped = nullptr;
|
glm::vec4 *mapped = nullptr;
|
||||||
|
|
@ -102,26 +102,8 @@ private:
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo : duplicate code, android
|
|
||||||
VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage)
|
|
||||||
{
|
|
||||||
VkPipelineShaderStageCreateInfo shaderStage = {};
|
|
||||||
shaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
|
||||||
shaderStage.stage = stage;
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
shaderStage.module = vkTools::loadShader(androidApp->activity->assetManager, fileName.c_str(), device, stage);
|
|
||||||
#else
|
|
||||||
shaderStage.module = vkTools::loadShader(fileName.c_str(), device, stage);
|
|
||||||
#endif
|
|
||||||
shaderStage.pName = "main";
|
|
||||||
assert(shaderStage.module != NULL);
|
|
||||||
//shaderModules.push_back(shaderStage.module);
|
|
||||||
return shaderStage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VulkanTextOverlay::VulkanTextOverlay(
|
VulkanTextOverlay(
|
||||||
VkPhysicalDevice physicalDevice,
|
VkPhysicalDevice physicalDevice,
|
||||||
VkDevice device,
|
VkDevice device,
|
||||||
VkQueue queue,
|
VkQueue queue,
|
||||||
|
|
@ -129,7 +111,8 @@ public:
|
||||||
VkFormat colorformat,
|
VkFormat colorformat,
|
||||||
VkFormat depthformat,
|
VkFormat depthformat,
|
||||||
uint32_t *framebufferwidth,
|
uint32_t *framebufferwidth,
|
||||||
uint32_t *framebufferheight)
|
uint32_t *framebufferheight,
|
||||||
|
std::vector<VkPipelineShaderStageCreateInfo> shaderstages)
|
||||||
{
|
{
|
||||||
this->physicalDevice = physicalDevice;
|
this->physicalDevice = physicalDevice;
|
||||||
this->device = device;
|
this->device = device;
|
||||||
|
|
@ -143,6 +126,8 @@ public:
|
||||||
this->frameBuffers[i] = &framebuffers[i];
|
this->frameBuffers[i] = &framebuffers[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->shaderStages = shaderstages;
|
||||||
|
|
||||||
this->frameBufferWidth = framebufferwidth;
|
this->frameBufferWidth = framebufferwidth;
|
||||||
this->frameBufferHeight = framebufferheight;
|
this->frameBufferHeight = framebufferheight;
|
||||||
|
|
||||||
|
|
@ -153,6 +138,25 @@ public:
|
||||||
preparePipeline();
|
preparePipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~VulkanTextOverlay()
|
||||||
|
{
|
||||||
|
// Free up all Vulkan resources requested by the text overlay
|
||||||
|
vkDestroySampler(device, sampler, nullptr);
|
||||||
|
vkDestroyImage(device, image, nullptr);
|
||||||
|
vkDestroyImageView(device, view, nullptr);
|
||||||
|
vkDestroyBuffer(device, buffer, nullptr);
|
||||||
|
vkFreeMemory(device, memory, nullptr);
|
||||||
|
vkFreeMemory(device, imageMemory, nullptr);
|
||||||
|
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
|
||||||
|
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
|
||||||
|
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
||||||
|
vkDestroyPipelineCache(device, pipelineCache, nullptr);
|
||||||
|
vkDestroyPipeline(device, pipeline, nullptr);
|
||||||
|
vkDestroyRenderPass(device, renderPass, nullptr);
|
||||||
|
vkFreeCommandBuffers(device, commandPool, cmdBuffers.size(), cmdBuffers.data());
|
||||||
|
vkDestroyCommandPool(device, commandPool, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare all vulkan resources required to render the font
|
// Prepare all vulkan resources required to render the font
|
||||||
// The text overlay uses separate resources for descriptors (pool, sets, layouts), pipelines and command buffers
|
// The text overlay uses separate resources for descriptors (pool, sets, layouts), pipelines and command buffers
|
||||||
void prepareResources()
|
void prepareResources()
|
||||||
|
|
@ -394,7 +398,7 @@ public:
|
||||||
VkPipelineRasterizationStateCreateInfo rasterizationState =
|
VkPipelineRasterizationStateCreateInfo rasterizationState =
|
||||||
vkTools::initializers::pipelineRasterizationStateCreateInfo(
|
vkTools::initializers::pipelineRasterizationStateCreateInfo(
|
||||||
VK_POLYGON_MODE_FILL,
|
VK_POLYGON_MODE_FILL,
|
||||||
VK_CULL_MODE_NONE,
|
VK_CULL_MODE_BACK_BIT,
|
||||||
VK_FRONT_FACE_CLOCKWISE,
|
VK_FRONT_FACE_CLOCKWISE,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
|
@ -445,7 +449,9 @@ public:
|
||||||
vertexBindings[1] = vkTools::initializers::vertexInputBindingDescription(1, sizeof(glm::vec4), VK_VERTEX_INPUT_RATE_VERTEX);
|
vertexBindings[1] = vkTools::initializers::vertexInputBindingDescription(1, sizeof(glm::vec4), VK_VERTEX_INPUT_RATE_VERTEX);
|
||||||
|
|
||||||
std::array<VkVertexInputAttributeDescription, 2> vertexAttribs = {};
|
std::array<VkVertexInputAttributeDescription, 2> vertexAttribs = {};
|
||||||
|
// Position
|
||||||
vertexAttribs[0] = vkTools::initializers::vertexInputAttributeDescription(0, 0, VK_FORMAT_R32G32_SFLOAT, 0);
|
vertexAttribs[0] = vkTools::initializers::vertexInputAttributeDescription(0, 0, VK_FORMAT_R32G32_SFLOAT, 0);
|
||||||
|
// UV
|
||||||
vertexAttribs[1] = vkTools::initializers::vertexInputAttributeDescription(1, 1, VK_FORMAT_R32G32_SFLOAT, sizeof(glm::vec2));
|
vertexAttribs[1] = vkTools::initializers::vertexInputAttributeDescription(1, 1, VK_FORMAT_R32G32_SFLOAT, sizeof(glm::vec2));
|
||||||
|
|
||||||
VkPipelineVertexInputStateCreateInfo inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo();
|
VkPipelineVertexInputStateCreateInfo inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo();
|
||||||
|
|
@ -454,15 +460,6 @@ public:
|
||||||
inputState.vertexAttributeDescriptionCount = vertexAttribs.size();
|
inputState.vertexAttributeDescriptionCount = vertexAttribs.size();
|
||||||
inputState.pVertexAttributeDescriptions = vertexAttribs.data();
|
inputState.pVertexAttributeDescriptions = vertexAttribs.data();
|
||||||
|
|
||||||
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
|
|
||||||
|
|
||||||
//shaderStages[0] = loadShader(getAssetPath() + "shaders/base/font.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
|
||||||
//shaderStages[1] = loadShader(getAssetPath() + "shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
|
|
||||||
// todo : pass asset path
|
|
||||||
shaderStages[0] = loadShader("../data/shaders/textoverlay/text.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
|
||||||
shaderStages[1] = loadShader("../data/shaders/textoverlay/text.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
|
||||||
|
|
||||||
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
|
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
|
||||||
vkTools::initializers::pipelineCreateInfo(
|
vkTools::initializers::pipelineCreateInfo(
|
||||||
pipelineLayout,
|
pipelineLayout,
|
||||||
|
|
@ -641,6 +638,7 @@ public:
|
||||||
vkCmdDraw(cmdBuffers[i], 4, 1, j * 4, 0);
|
vkCmdDraw(cmdBuffers[i], 4, 1, j * 4, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
vkCmdEndRenderPass(cmdBuffers[i]);
|
vkCmdEndRenderPass(cmdBuffers[i]);
|
||||||
|
|
||||||
vkTools::checkResult(vkEndCommandBuffer(cmdBuffers[i]));
|
vkTools::checkResult(vkEndCommandBuffer(cmdBuffers[i]));
|
||||||
|
|
@ -703,25 +701,17 @@ public:
|
||||||
zoom = -7.5f;
|
zoom = -7.5f;
|
||||||
zoomSpeed = 2.5f;
|
zoomSpeed = 2.5f;
|
||||||
rotation = { -5.0f, -35.0f, 0.0f };
|
rotation = { -5.0f, -35.0f, 0.0f };
|
||||||
//cameraPos = glm::vec3(4.5f, 0.33f, 0.0f);
|
|
||||||
title = "Vulkan Example - Text overlay";
|
title = "Vulkan Example - Text overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
~VulkanExample()
|
~VulkanExample()
|
||||||
{
|
{
|
||||||
// Clean up used Vulkan resources
|
|
||||||
// Note : Inherited destructor cleans up resources stored in base class
|
|
||||||
vkDestroyPipeline(device, pipelines.solid, nullptr);
|
vkDestroyPipeline(device, pipelines.solid, nullptr);
|
||||||
|
|
||||||
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
||||||
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
|
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
|
||||||
|
|
||||||
vkMeshLoader::freeMeshBufferResources(device, &meshes.example);
|
vkMeshLoader::freeMeshBufferResources(device, &meshes.example);
|
||||||
|
|
||||||
textureLoader->destroyTexture(textures.colorMap);
|
textureLoader->destroyTexture(textures.colorMap);
|
||||||
|
|
||||||
vkTools::destroyUniformData(device, &uniformData.vsScene);
|
vkTools::destroyUniformData(device, &uniformData.vsScene);
|
||||||
|
|
||||||
delete(textOverlay);
|
delete(textOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -731,8 +721,7 @@ public:
|
||||||
|
|
||||||
VkClearValue clearValues[3];
|
VkClearValue clearValues[3];
|
||||||
|
|
||||||
// Clear to a white background for higher contrast
|
clearValues[0].color = { { 0.0f, 0.0f, 0.0f, 1.0f } };
|
||||||
clearValues[0].color = { { 0.0f, 0.0f, 0.2f, 1.0f } };
|
|
||||||
clearValues[1].depthStencil = { 1.0f, 0 };
|
clearValues[1].depthStencil = { 1.0f, 0 };
|
||||||
|
|
||||||
VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo();
|
VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo();
|
||||||
|
|
@ -826,15 +815,14 @@ public:
|
||||||
void loadTextures()
|
void loadTextures()
|
||||||
{
|
{
|
||||||
textureLoader->loadTexture(
|
textureLoader->loadTexture(
|
||||||
getAssetPath() + "models/voyager/voyager.ktx",
|
getAssetPath() + "textures/crate_bc3.ktx",
|
||||||
VK_FORMAT_BC3_UNORM_BLOCK,
|
VK_FORMAT_BC3_UNORM_BLOCK,
|
||||||
&textures.colorMap);
|
&textures.colorMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadMeshes()
|
void loadMeshes()
|
||||||
{
|
{
|
||||||
//loadMesh(getAssetPath() + "models/lunarlander/lunarlander.dae", &meshes.example, vertexLayout, 5.0f);
|
loadMesh(getAssetPath() + "models/sphere.3ds", &meshes.example, vertexLayout, 0.15f);
|
||||||
loadMesh(getAssetPath() + "models/teapot.3ds", &meshes.example, vertexLayout, 0.15f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupVertexDescriptions()
|
void setupVertexDescriptions()
|
||||||
|
|
@ -1080,7 +1068,11 @@ public:
|
||||||
|
|
||||||
void prepareTextOverlay()
|
void prepareTextOverlay()
|
||||||
{
|
{
|
||||||
VkExtent2D windowSize = { width, height };
|
// Load the text rendering shaders
|
||||||
|
std::vector<VkPipelineShaderStageCreateInfo> shaderStages;
|
||||||
|
shaderStages.push_back(loadShader(getAssetPath() + "shaders/textoverlay/text.vert.spv", VK_SHADER_STAGE_VERTEX_BIT));
|
||||||
|
shaderStages.push_back(loadShader(getAssetPath() + "shaders/textoverlay/text.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT));
|
||||||
|
|
||||||
textOverlay = new VulkanTextOverlay(
|
textOverlay = new VulkanTextOverlay(
|
||||||
physicalDevice,
|
physicalDevice,
|
||||||
device,
|
device,
|
||||||
|
|
@ -1089,7 +1081,8 @@ public:
|
||||||
colorformat,
|
colorformat,
|
||||||
depthFormat,
|
depthFormat,
|
||||||
&width,
|
&width,
|
||||||
&height
|
&height,
|
||||||
|
shaderStages
|
||||||
);
|
);
|
||||||
updateTextOverlay();
|
updateTextOverlay();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue