From 77d72742ea51e93b411370420a05af5c23ce1e3a Mon Sep 17 00:00:00 2001 From: saschawillems Date: Thu, 5 May 2016 13:03:56 +0200 Subject: [PATCH] Pass references framebuffers and sizes as references to the text overlay, recreate command buffers on resize --- data/shaders/textoverlay/mesh.vert | 5 ++ data/shaders/textoverlay/mesh.vert.spv | Bin 2552 -> 2332 bytes data/shaders/textoverlay/text.vert | 5 ++ data/shaders/textoverlay/text.vert.spv | Bin 984 -> 764 bytes textoverlay/textoverlay.cpp | 71 +++++++++++++++---------- 5 files changed, 53 insertions(+), 28 deletions(-) diff --git a/data/shaders/textoverlay/mesh.vert b/data/shaders/textoverlay/mesh.vert index df49c062..ab841aa9 100644 --- a/data/shaders/textoverlay/mesh.vert +++ b/data/shaders/textoverlay/mesh.vert @@ -21,6 +21,11 @@ layout (location = 2) out vec2 outUV; layout (location = 3) out vec3 outViewVec; layout (location = 4) out vec3 outLightVec; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outNormal = inNormal; diff --git a/data/shaders/textoverlay/mesh.vert.spv b/data/shaders/textoverlay/mesh.vert.spv index 54e8d7b11f11b0a06121ef92d15173d3dd879a0f..c993b8bc09bf00906e1c60457bd395daf256237a 100644 GIT binary patch literal 2332 zcmZ9M+foxj5QayRAc`kM4xTU&6%|E9KomJf4QfhIi`=Fb*b1v5n@U3IomBY*`ba*N zH&*$7yW6ljsm}EOcTaau_avFF!b#^&=+ooME?#}EOW3(y*B$Mp^2hRIyR$nvGdqRH zIhTnX@j0&#D=XRef(H62Nw4Ir9xF$Uv2MsyMC)0Zh!K3I_-abWC|L!YTawp4!oLQotd6$dOM$8PLa~J0>>p z?R6AgY83B=_Ji$EdN%5N(1?xXnwG68S8R*Y>qqBu(R_5rGT|!zj(l>_yu?)k{|l5W z=^T9>k+8t@6ij_!`kBVO1u(A%JG}%`JD6S?URO?f$s#VRq?2&?ugl+hl#6iO8>z0q zmliS1M~~cHh`9J1HKxyjIkzIQb8yG!;#lOy?@&TL)_dxw-(wP%;n5gIn77aUSlEl& z!Ms;6zX@RYg7n~J}9kQdtNdme`*6`&kOe?I{ZR{nUUE~OSd~=2h&?P^JixG zo1K|qCm;PIAGMILPdmQw_=B0L(Hr zdXc=FH3=NTqE>1n7jF!^<$4k6$FW`tQ;)@ZB^?f7S*-7>hg>BIG4LZkzXv$0?X~oD cyf?yd2+QJqOWyojarh96-xBzbyyhi;0ra1ihyVZp literal 2552 zcmZ9NYjYG;5Qc|jH=rnp$VJ7tN$`rshyhUqazQqdm7o;)y0s)z%jjk%wYw=Tzett8 zK!1|I$}d*=JTuel!bx?y-?#g8_c^C0nVnfWo+QWkIg#un)jE^RfRjYss`Uc;WHMLs z?argl@@Txjyn1Z~Iysfhs!HGK zp#P?LgI(=Tcm2nW?kGL%4SVCXJ9^sNPlw&&$xrFtc=UV>t}O3&2fe(1)a$3+)vGIq zy}h54CYh#tX~Nh~aWsBV3=et(Y&rYO@(ERP_DkGmF(`(ZaE-G6EUzfBXCdbCZteG6 zSzbco=aRR;{XzF(I^0c%xE9l>L?(7e4O?-{v4Y zyqk^2y?ig7_g0>QCom*mb^V26#J?76S3AF zWc{aOI>s#XEuxQ}6xfaOEwj9GTI(9VLqhefVGkzzn&q2wZynR^rhCLR%Nc;%&C*|_ zk~aH%t9isF_MOD`C-#k|vGXPNF7*38VtW_+K7qHW>HE0M>k7{Na_ZpBA!qL3wB?+! zHXidCw*}KeyPAmcEdgt(QqOUGgvo12?6dClKC%1OkjN$X|Gp}}wT*j**iQ>B=h+w0 ziYxF!1xxI==-s&V`(28wvo*^15qsvdWHs*sNUVJxYYyE)F0jkq#QIy{6SXaWv&Oz} z_+Q38hJ;@nZxHdmxA9{AzPEd<=lxmFUaWTpZLGZUV&@_1oyB%<_{Gjg3aSm}N^f^1?bt*5RFC&YHZ)3c7`5q!4F&|(Xf`?uZNu6`&~iYZ@hlr@lW#V z`y8>pG4|}cet|fTp38HKjf*o~$A0llU&6^p|2MFw`~M0o=Zapx#+IAz|7Oii_x}x? z`;FH>-Ty7HwT-b?=Rhv{xQ#vi?qbief!;(shjVGX_i-1I-(e!1n{R7Q-es@$X00`} z{;1W)mWy0l*!B~-zQdMNT#@S!`mxr1#2m(%-|s;#@^!GM^L-DNQ(Ten_j=|Zz!_t% MZM67bqHZAn0Z}=ussI20 diff --git a/data/shaders/textoverlay/text.vert b/data/shaders/textoverlay/text.vert index 3143256f..548bfdb2 100644 --- a/data/shaders/textoverlay/text.vert +++ b/data/shaders/textoverlay/text.vert @@ -5,6 +5,11 @@ layout (location = 1) in vec2 inUV; layout (location = 0) out vec2 outUV; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main(void) { gl_Position = vec4(inPos, 0.0, 1.0); diff --git a/data/shaders/textoverlay/text.vert.spv b/data/shaders/textoverlay/text.vert.spv index e086b48d97eed46aac126342e8e83812cd11b2f1..fd292c04e550b61b6e0bc16c6e03d5f8db0fae9a 100644 GIT binary patch literal 764 zcmYk2PfNo<5XHwPsnu$0t!@2BsdyBM2Ngk7JjFu~6|q+l3=+^3+6W%~Y z_LOFTRYg;=qu5mh`YPJLR1jIH?=Lq}kDBny>*F|?O_Eujdib@TNnb*VK1)rg!OY+v8FX%zViy^_d6yXPPZOcqfaTZ!wYfOR;Ed zDDZP9mfmg8X7$mI_Ic)pPaetQaL#$2w{6-<8Fb5CbHa))>Dj~t&X FegS8PCPx4O literal 984 zcmYk4-7iBy5XDzNC`DDZ^-B;oBk$YtWi##gZtu3&8D&qM{ewNxX3^wv zE>|(LE-vWz<-w+a1=+H!CEJwcwR7@c8d5X`?Z4WhW|W1Wll$v<*pG)<{4OYV%oCFv zjBI8Hsn{7;k6y>yG`qDQF?AuwEaff|`+8|d*+cpmPjV@jx=$DBo1H}1 cmdBuffers; - std::vector frameBuffers; + std::vector frameBuffers; 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 VkBool32 getMemoryType(uint32_t typeBits, VkFlags properties, uint32_t *typeIndex) { @@ -112,29 +120,28 @@ private: } 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( VkPhysicalDevice physicalDevice, VkDevice device, - std::vector framebuffers, + std::vector &framebuffers, VkFormat colorformat, VkFormat depthformat, - VkExtent2D windowsize) + uint32_t *framebufferwidth, + uint32_t *framebufferheight) { this->physicalDevice = physicalDevice; this->device = device; this->colorFormat = colorformat; 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); cmdBuffers.resize(framebuffers.size()); @@ -371,8 +378,8 @@ public: //shaderStages[1] = loadShader(getAssetPath() + "shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // todo : pass asset path - shaderStages[0] = loadShader("../data/shaders/base/font.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); - shaderStages[1] = loadShader("../data/shaders/base/font.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); + 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 = vkTools::initializers::pipelineCreateInfo( @@ -452,7 +459,7 @@ public: vkTools::checkResult(vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass)); } - + // Map buffer void beginTextUpdate() { @@ -466,8 +473,8 @@ public: { assert(mapped != nullptr); -#define CHAR_WIDTH 2.0f * 0.75f / (float)windowSize.width - 1.0f -#define CHAR_HEIGHT 2.0f * 0.75f / (float)windowSize.height - 1.0f +#define CHAR_WIDTH 2.0f * 0.75f / *frameBufferWidth - 1.0f +#define CHAR_HEIGHT 2.0f * 0.75f / *frameBufferHeight - 1.0f // Generate a uv mapped quad per char in the new text for (auto letter : text) @@ -522,22 +529,23 @@ public: VkRenderPassBeginInfo renderPassBeginInfo = vkTools::initializers::renderPassBeginInfo(); renderPassBeginInfo.renderPass = renderPass; - renderPassBeginInfo.renderArea.extent = windowSize; + renderPassBeginInfo.renderArea.extent.width = *frameBufferWidth; + renderPassBeginInfo.renderArea.extent.height = *frameBufferHeight; renderPassBeginInfo.clearValueCount = 1; renderPassBeginInfo.pClearValues = clearValues; for (int32_t i = 0; i < cmdBuffers.size(); ++i) { - renderPassBeginInfo.framebuffer = frameBuffers[i]; + renderPassBeginInfo.framebuffer = *frameBuffers[i]; vkTools::checkResult(vkBeginCommandBuffer(cmdBuffers[i], &cmdBufInfo)); 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); - 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); vkCmdBindPipeline(cmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); @@ -562,8 +570,7 @@ public: void submit(VkQueue queue, uint32_t bufferindex) { VkSubmitInfo submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &cmdBuffers[bufferindex]; vkTools::checkResult(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); @@ -680,6 +687,8 @@ public: vkTools::checkResult(vkEndCommandBuffer(drawCmdBuffers[i])); } + + vkQueueWaitIdle(queue); } // Update the text buffer displayed by the text overlay @@ -995,7 +1004,8 @@ public: frameBuffers, colorformat, depthFormat, - windowSize + &width, + &height ); updateTextOverlay(); } @@ -1034,6 +1044,11 @@ public: updateUniformBuffers(); updateTextOverlay(); } + + virtual void windowResized() + { + updateTextOverlay(); + } }; VulkanExample *vulkanExample;