Pass references framebuffers and sizes as references to the text overlay, recreate command buffers on resize
This commit is contained in:
parent
381cd1c733
commit
77d72742ea
5 changed files with 53 additions and 28 deletions
|
|
@ -21,6 +21,11 @@ layout (location = 2) out vec2 outUV;
|
||||||
layout (location = 3) out vec3 outViewVec;
|
layout (location = 3) out vec3 outViewVec;
|
||||||
layout (location = 4) out vec3 outLightVec;
|
layout (location = 4) out vec3 outLightVec;
|
||||||
|
|
||||||
|
out gl_PerVertex
|
||||||
|
{
|
||||||
|
vec4 gl_Position;
|
||||||
|
};
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
outNormal = inNormal;
|
outNormal = inNormal;
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -5,6 +5,11 @@ layout (location = 1) in vec2 inUV;
|
||||||
|
|
||||||
layout (location = 0) out vec2 outUV;
|
layout (location = 0) out vec2 outUV;
|
||||||
|
|
||||||
|
out gl_PerVertex
|
||||||
|
{
|
||||||
|
vec4 gl_Position;
|
||||||
|
};
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
gl_Position = vec4(inPos, 0.0, 1.0);
|
gl_Position = vec4(inPos, 0.0, 1.0);
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -58,13 +58,15 @@ private:
|
||||||
VkPhysicalDeviceMemoryProperties deviceMemoryProperties;
|
VkPhysicalDeviceMemoryProperties deviceMemoryProperties;
|
||||||
VkFormat colorFormat;
|
VkFormat colorFormat;
|
||||||
VkFormat depthFormat;
|
VkFormat depthFormat;
|
||||||
VkExtent2D windowSize;
|
|
||||||
|
uint32_t *frameBufferWidth;
|
||||||
|
uint32_t *frameBufferHeight;
|
||||||
|
|
||||||
VkSampler sampler;
|
VkSampler sampler;
|
||||||
VkImage image;
|
VkImage image;
|
||||||
VkImageView view;
|
VkImageView view;
|
||||||
VkBuffer buffer;
|
VkBuffer buffer;
|
||||||
// VkDeviceMemory memory;
|
VkDeviceMemory memory;
|
||||||
VkDeviceMemory imageMemory;
|
VkDeviceMemory imageMemory;
|
||||||
VkDescriptorPool descriptorPool;
|
VkDescriptorPool descriptorPool;
|
||||||
VkDescriptorSetLayout descriptorSetLayout;
|
VkDescriptorSetLayout descriptorSetLayout;
|
||||||
|
|
@ -74,10 +76,16 @@ private:
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
VkCommandPool commandPool;
|
VkCommandPool commandPool;
|
||||||
std::vector<VkCommandBuffer> cmdBuffers;
|
std::vector<VkCommandBuffer> cmdBuffers;
|
||||||
std::vector<VkFramebuffer> frameBuffers;
|
std::vector<VkFramebuffer*> frameBuffers;
|
||||||
|
|
||||||
VkRenderPass renderPass;
|
VkRenderPass renderPass;
|
||||||
|
|
||||||
|
// Pointer to mapped vertex buffer
|
||||||
|
glm::vec4 *mapped = nullptr;
|
||||||
|
|
||||||
|
stb_fontchar stbFontData[STB_NUM_CHARS];
|
||||||
|
uint32_t numLetters;
|
||||||
|
|
||||||
// Try to find appropriate memory type for a memory allocation
|
// Try to find appropriate memory type for a memory allocation
|
||||||
VkBool32 getMemoryType(uint32_t typeBits, VkFlags properties, uint32_t *typeIndex)
|
VkBool32 getMemoryType(uint32_t typeBits, VkFlags properties, uint32_t *typeIndex)
|
||||||
{
|
{
|
||||||
|
|
@ -112,29 +120,28 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// todo : move to private!
|
|
||||||
stb_fontchar stbFontData[STB_NUM_CHARS];
|
|
||||||
uint32_t numLetters;
|
|
||||||
VkDeviceMemory memory;
|
|
||||||
|
|
||||||
// Pointer to mapped vertex buffer
|
|
||||||
glm::vec4 *mapped = nullptr;
|
|
||||||
|
|
||||||
VulkanTextOverlay::VulkanTextOverlay(
|
VulkanTextOverlay::VulkanTextOverlay(
|
||||||
VkPhysicalDevice physicalDevice,
|
VkPhysicalDevice physicalDevice,
|
||||||
VkDevice device,
|
VkDevice device,
|
||||||
std::vector<VkFramebuffer> framebuffers,
|
std::vector<VkFramebuffer> &framebuffers,
|
||||||
VkFormat colorformat,
|
VkFormat colorformat,
|
||||||
VkFormat depthformat,
|
VkFormat depthformat,
|
||||||
VkExtent2D windowsize)
|
uint32_t *framebufferwidth,
|
||||||
|
uint32_t *framebufferheight)
|
||||||
{
|
{
|
||||||
this->physicalDevice = physicalDevice;
|
this->physicalDevice = physicalDevice;
|
||||||
this->device = device;
|
this->device = device;
|
||||||
this->colorFormat = colorformat;
|
this->colorFormat = colorformat;
|
||||||
this->depthFormat = depthformat;
|
this->depthFormat = depthformat;
|
||||||
this->windowSize = windowsize;
|
|
||||||
this->frameBuffers = framebuffers;
|
this->frameBuffers.resize(framebuffers.size());
|
||||||
|
for (uint32_t i = 0; i < framebuffers.size(); i++)
|
||||||
|
{
|
||||||
|
this->frameBuffers[i] = &framebuffers[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
this->frameBufferWidth = framebufferwidth;
|
||||||
|
this->frameBufferHeight = framebufferheight;
|
||||||
|
|
||||||
vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties);
|
vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties);
|
||||||
cmdBuffers.resize(framebuffers.size());
|
cmdBuffers.resize(framebuffers.size());
|
||||||
|
|
@ -371,8 +378,8 @@ public:
|
||||||
//shaderStages[1] = loadShader(getAssetPath() + "shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
//shaderStages[1] = loadShader(getAssetPath() + "shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
|
|
||||||
// todo : pass asset path
|
// todo : pass asset path
|
||||||
shaderStages[0] = loadShader("../data/shaders/base/font.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
shaderStages[0] = loadShader("../data/shaders/textoverlay/text.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
|
||||||
shaderStages[1] = loadShader("../data/shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_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(
|
||||||
|
|
@ -466,8 +473,8 @@ public:
|
||||||
{
|
{
|
||||||
assert(mapped != nullptr);
|
assert(mapped != nullptr);
|
||||||
|
|
||||||
#define CHAR_WIDTH 2.0f * 0.75f / (float)windowSize.width - 1.0f
|
#define CHAR_WIDTH 2.0f * 0.75f / *frameBufferWidth - 1.0f
|
||||||
#define CHAR_HEIGHT 2.0f * 0.75f / (float)windowSize.height - 1.0f
|
#define CHAR_HEIGHT 2.0f * 0.75f / *frameBufferHeight - 1.0f
|
||||||
|
|
||||||
// Generate a uv mapped quad per char in the new text
|
// Generate a uv mapped quad per char in the new text
|
||||||
for (auto letter : text)
|
for (auto letter : text)
|
||||||
|
|
@ -522,22 +529,23 @@ public:
|
||||||
|
|
||||||
VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo();
|
VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo();
|
||||||
renderPassBeginInfo.renderPass = renderPass;
|
renderPassBeginInfo.renderPass = renderPass;
|
||||||
renderPassBeginInfo.renderArea.extent = windowSize;
|
renderPassBeginInfo.renderArea.extent.width = *frameBufferWidth;
|
||||||
|
renderPassBeginInfo.renderArea.extent.height = *frameBufferHeight;
|
||||||
renderPassBeginInfo.clearValueCount = 1;
|
renderPassBeginInfo.clearValueCount = 1;
|
||||||
renderPassBeginInfo.pClearValues = clearValues;
|
renderPassBeginInfo.pClearValues = clearValues;
|
||||||
|
|
||||||
for (int32_t i = 0; i < cmdBuffers.size(); ++i)
|
for (int32_t i = 0; i < cmdBuffers.size(); ++i)
|
||||||
{
|
{
|
||||||
renderPassBeginInfo.framebuffer = frameBuffers[i];
|
renderPassBeginInfo.framebuffer = *frameBuffers[i];
|
||||||
|
|
||||||
vkTools::checkResult(vkBeginCommandBuffer(cmdBuffers[i], &cmdBufInfo));
|
vkTools::checkResult(vkBeginCommandBuffer(cmdBuffers[i], &cmdBufInfo));
|
||||||
|
|
||||||
vkCmdBeginRenderPass(cmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
vkCmdBeginRenderPass(cmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
|
||||||
VkViewport viewport = vkTools::initializers::viewport((float)windowSize.width, (float)windowSize.height, 0.0f, 1.0f);
|
VkViewport viewport = vkTools::initializers::viewport((float)*frameBufferWidth, (float)*frameBufferHeight, 0.0f, 1.0f);
|
||||||
vkCmdSetViewport(cmdBuffers[i], 0, 1, &viewport);
|
vkCmdSetViewport(cmdBuffers[i], 0, 1, &viewport);
|
||||||
|
|
||||||
VkRect2D scissor = vkTools::initializers::rect2D(windowSize.width, windowSize.height, 0, 0);
|
VkRect2D scissor = vkTools::initializers::rect2D(*frameBufferWidth, *frameBufferHeight, 0, 0);
|
||||||
vkCmdSetScissor(cmdBuffers[i], 0, 1, &scissor);
|
vkCmdSetScissor(cmdBuffers[i], 0, 1, &scissor);
|
||||||
|
|
||||||
vkCmdBindPipeline(cmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
vkCmdBindPipeline(cmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
||||||
|
|
@ -562,8 +570,7 @@ public:
|
||||||
void submit(VkQueue queue, uint32_t bufferindex)
|
void submit(VkQueue queue, uint32_t bufferindex)
|
||||||
{
|
{
|
||||||
VkSubmitInfo submitInfo = {};
|
VkSubmitInfo submitInfo = {};
|
||||||
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;submitInfo.commandBufferCount = 1;
|
||||||
submitInfo.commandBufferCount = 1;
|
|
||||||
submitInfo.pCommandBuffers = &cmdBuffers[bufferindex];
|
submitInfo.pCommandBuffers = &cmdBuffers[bufferindex];
|
||||||
|
|
||||||
vkTools::checkResult(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
|
vkTools::checkResult(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE));
|
||||||
|
|
@ -680,6 +687,8 @@ public:
|
||||||
|
|
||||||
vkTools::checkResult(vkEndCommandBuffer(drawCmdBuffers[i]));
|
vkTools::checkResult(vkEndCommandBuffer(drawCmdBuffers[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vkQueueWaitIdle(queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the text buffer displayed by the text overlay
|
// Update the text buffer displayed by the text overlay
|
||||||
|
|
@ -995,7 +1004,8 @@ public:
|
||||||
frameBuffers,
|
frameBuffers,
|
||||||
colorformat,
|
colorformat,
|
||||||
depthFormat,
|
depthFormat,
|
||||||
windowSize
|
&width,
|
||||||
|
&height
|
||||||
);
|
);
|
||||||
updateTextOverlay();
|
updateTextOverlay();
|
||||||
}
|
}
|
||||||
|
|
@ -1034,6 +1044,11 @@ public:
|
||||||
updateUniformBuffers();
|
updateUniformBuffers();
|
||||||
updateTextOverlay();
|
updateTextOverlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void windowResized()
|
||||||
|
{
|
||||||
|
updateTextOverlay();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
VulkanExample *vulkanExample;
|
VulkanExample *vulkanExample;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue