Pass references framebuffers and sizes as references to the text overlay, recreate command buffers on resize

This commit is contained in:
saschawillems 2016-05-05 13:03:56 +02:00
parent 381cd1c733
commit 77d72742ea
5 changed files with 53 additions and 28 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;