From faa59a2f78ff783fbc3472fc017dc97faa9c1008 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Mon, 23 May 2016 22:27:32 +0200 Subject: [PATCH] Use Vulkan result check macro, code cleanup, added text overlay --- bloom/bloom.cpp | 301 +++++++++++--------------- data/shaders/bloom/colorpass.frag.spv | Bin 736 -> 736 bytes data/shaders/bloom/colorpass.vert | 15 +- data/shaders/bloom/colorpass.vert.spv | Bin 1636 -> 1416 bytes data/shaders/bloom/gaussblur.frag.spv | Bin 3992 -> 4000 bytes data/shaders/bloom/gaussblur.vert | 5 + data/shaders/bloom/gaussblur.vert.spv | Bin 1524 -> 1304 bytes data/shaders/bloom/phongpass.frag.spv | Bin 2456 -> 2456 bytes data/shaders/bloom/phongpass.vert | 5 + data/shaders/bloom/phongpass.vert.spv | Bin 2692 -> 2472 bytes data/shaders/bloom/skybox.frag.spv | Bin 640 -> 640 bytes data/shaders/bloom/skybox.vert | 6 + data/shaders/bloom/skybox.vert.spv | Bin 1440 -> 1220 bytes 13 files changed, 150 insertions(+), 182 deletions(-) diff --git a/bloom/bloom.cpp b/bloom/bloom.cpp index 40f210a1..aa51cda3 100644 --- a/bloom/bloom.cpp +++ b/bloom/bloom.cpp @@ -135,6 +135,7 @@ public: zoom = -10.25f; rotation = { 7.5f, -343.0f, 0.0f }; timerSpeed *= 0.5f; + enableTextOverlay = true; title = "Vulkan Example - Bloom"; } @@ -197,12 +198,9 @@ public: // Preapre an empty texture as the blit target from // the offscreen framebuffer - void prepareTextureTarget(vkTools::VulkanTexture *tex, uint32_t width, uint32_t height, VkFormat format) + void prepareTextureTarget(vkTools::VulkanTexture *tex, uint32_t width, uint32_t height, VkFormat format, VkCommandBuffer cmdBuffer) { - createSetupCommandBuffer(); - VkFormatProperties formatProperties; - VkResult err; // Get device properites for the requested texture format vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProperties); @@ -228,19 +226,16 @@ public: VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo(); VkMemoryRequirements memReqs; - err = vkCreateImage(device, &imageCreateInfo, nullptr, &tex->image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &imageCreateInfo, nullptr, &tex->image)); vkGetImageMemoryRequirements(device, tex->image, &memReqs); memAllocInfo.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAllocInfo.memoryTypeIndex); - err = vkAllocateMemory(device, &memAllocInfo, nullptr, &(tex->deviceMemory)); - assert(!err); - err = vkBindImageMemory(device, tex->image, tex->deviceMemory, 0); - assert(!err); + memAllocInfo.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &(tex->deviceMemory))); + VK_CHECK_RESULT(vkBindImageMemory(device, tex->image, tex->deviceMemory, 0)); tex->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, tex->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, @@ -260,8 +255,7 @@ public: sampler.minLod = 0.0f; sampler.maxLod = 0.0f; sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; - err = vkCreateSampler(device, &sampler, nullptr, &tex->sampler); - assert(!err); + VK_CHECK_RESULT(vkCreateSampler(device, &sampler, nullptr, &tex->sampler)); // Create image view VkImageViewCreateInfo view = vkTools::initializers::imageViewCreateInfo(); @@ -271,19 +265,14 @@ public: view.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; view.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; view.image = tex->image; - err = vkCreateImageView(device, &view, nullptr, &tex->view); - assert(!err); - - flushSetupCommandBuffer(); + VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view)); } // Prepare a new framebuffer for offscreen rendering // The contents of this framebuffer are then // blitted to our render target - void prepareOffscreenFramebuffer(FrameBuffer *frameBuf) + void prepareOffscreenFramebuffer(FrameBuffer *frameBuf, VkCommandBuffer cmdBuffer) { - createSetupCommandBuffer(); - frameBuf->width = FB_DIM; frameBuf->height = FB_DIM; @@ -294,14 +283,13 @@ public: VkBool32 validDepthFormat = vkTools::getSupportedDepthFormat(physicalDevice, &fbDepthFormat); assert(validDepthFormat); - VkResult err; - // Color attachment VkImageCreateInfo image = vkTools::initializers::imageCreateInfo(); image.imageType = VK_IMAGE_TYPE_2D; image.format = fbColorFormat; image.extent.width = frameBuf->width; image.extent.height = frameBuf->height; + image.extent.depth = 1; image.mipLevels = 1; image.arrayLayers = 1; image.samples = VK_SAMPLE_COUNT_1_BIT; @@ -324,27 +312,22 @@ public: colorImageView.subresourceRange.baseArrayLayer = 0; colorImageView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &frameBuf->color.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &frameBuf->color.image)); vkGetImageMemoryRequirements(device, frameBuf->color.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &frameBuf->color.mem); - assert(!err); - - err = vkBindImageMemory(device, frameBuf->color.image, frameBuf->color.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &frameBuf->color.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, frameBuf->color.image, frameBuf->color.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, frameBuf->color.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); colorImageView.image = frameBuf->color.image; - err = vkCreateImageView(device, &colorImageView, nullptr, &frameBuf->color.view); - assert(!err); + VK_CHECK_RESULT(vkCreateImageView(device, &colorImageView, nullptr, &frameBuf->color.view)); // Depth stencil attachment image.format = fbDepthFormat; @@ -361,29 +344,22 @@ public: depthStencilView.subresourceRange.baseArrayLayer = 0; depthStencilView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &frameBuf->depth.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &frameBuf->depth.image)); vkGetImageMemoryRequirements(device, frameBuf->depth.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_HEAP_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &frameBuf->depth.mem); - assert(!err); - - err = vkBindImageMemory(device, frameBuf->depth.image, frameBuf->depth.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_HEAP_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &frameBuf->depth.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, frameBuf->depth.image, frameBuf->depth.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, frameBuf->depth.image, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); depthStencilView.image = frameBuf->depth.image; - err = vkCreateImageView(device, &depthStencilView, nullptr, &frameBuf->depth.view); - assert(!err); - - flushSetupCommandBuffer(); + VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &frameBuf->depth.view)); VkImageView attachments[2]; attachments[0] = frameBuf->color.view; @@ -397,8 +373,25 @@ public: fbufCreateInfo.height = frameBuf->height; fbufCreateInfo.layers = 1; - err = vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &frameBuf->frameBuffer); - assert(!err); + VK_CHECK_RESULT(vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &frameBuf->frameBuffer)); + } + + // Prepare the ping-pong texture targets for the vertical- and horizontal blur + void prepareTextureTargets() + { + VkCommandBuffer cmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); + prepareTextureTarget(&offScreenFrameBuf.textureTarget, TEX_DIM, TEX_DIM, TEX_FORMAT, cmdBuffer); + prepareTextureTarget(&offScreenFrameBufB.textureTarget, TEX_DIM, TEX_DIM, TEX_FORMAT, cmdBuffer); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); + } + + // Prepare the offscreen framebuffers used for the vertical- and horizontal blur + void prepareOffscreenFramebuffers() + { + VkCommandBuffer cmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); + prepareOffscreenFramebuffer(&offScreenFrameBuf, cmdBuffer); + prepareOffscreenFramebuffer(&offScreenFrameBufB, cmdBuffer); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); } void createOffscreenCommandBuffer() @@ -407,8 +400,7 @@ public: cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1); - VkResult vkRes = vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer)); } // Render the 3D scene into a texture target @@ -429,21 +421,12 @@ public: renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = clearValues; - VkResult err = vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo); - assert(!err); + VK_CHECK_RESULT(vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo)); - VkViewport viewport = vkTools::initializers::viewport( - (float)offScreenFrameBuf.width, - (float)offScreenFrameBuf.height, - 0.0f, - 1.0f); + VkViewport viewport = vkTools::initializers::viewport((float)offScreenFrameBuf.width, (float)offScreenFrameBuf.height, 0.0f, 1.0f); vkCmdSetViewport(offScreenCmdBuffer, 0, 1, &viewport); - VkRect2D scissor = vkTools::initializers::rect2D( - offScreenFrameBuf.width, - offScreenFrameBuf.height, - 0, - 0); + VkRect2D scissor = vkTools::initializers::rect2D(offScreenFrameBuf.width, offScreenFrameBuf.height, 0, 0); vkCmdSetScissor(offScreenCmdBuffer, 0, 1, &scissor); vkCmdBeginRenderPass(offScreenCmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); @@ -600,8 +583,7 @@ public: VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - err = vkEndCommandBuffer(offScreenCmdBuffer); - assert(!err); + VK_CHECK_RESULT(vkEndCommandBuffer(offScreenCmdBuffer)); } void loadTextures() @@ -639,30 +621,19 @@ public: renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = clearValues; - VkResult err; - for (int32_t i = 0; i < drawCmdBuffers.size(); ++i) { // Set target frame buffer renderPassBeginInfo.framebuffer = frameBuffers[i]; - err = vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo); - assert(!err); + VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo)); vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); - VkViewport viewport = vkTools::initializers::viewport( - (float)width, - (float)height, - 0.0f, - 1.0f); + VkViewport viewport = vkTools::initializers::viewport((float)width, (float)height, 0.0f, 1.0f); vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); - VkRect2D scissor = vkTools::initializers::rect2D( - width, - height, - 0, - 0); + VkRect2D scissor = vkTools::initializers::rect2D(width, height, 0, 0); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); VkDeviceSize offsets[1] = { 0 }; @@ -695,8 +666,7 @@ public: vkCmdEndRenderPass(drawCmdBuffers[i]); - err = vkEndCommandBuffer(drawCmdBuffers[i]); - assert(!err); + VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i])); } if (bloom) @@ -705,40 +675,6 @@ public: } } - void draw() - { - VkResult err; - - // Get next image in the swap chain (back/front buffer) - err = swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer); - assert(!err); - - submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); - - // Gather command buffers to be sumitted to the queue - std::vector submitCmdBuffers; - // Submit offscreen rendering command buffer - if (bloom) - { - submitCmdBuffers.push_back(offScreenCmdBuffer); - } - submitCmdBuffers.push_back(drawCmdBuffers[currentBuffer]); - submitInfo.commandBufferCount = submitCmdBuffers.size(); - submitInfo.pCommandBuffers = submitCmdBuffers.data(); - - // Submit to queue - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); - - err = swapChain.queuePresent(queue, currentBuffer, semaphores.renderComplete); - assert(!err); - - err = vkQueueWaitIdle(queue); - assert(!err); - } - void loadMeshes() { loadMesh(getAssetPath() + "models/retroufo.dae", &meshes.ufo, vertexLayout, 0.05f); @@ -848,8 +784,7 @@ public: poolSizes.data(), 5); - VkResult vkRes = vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool); - assert(!vkRes); + VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); } void setupDescriptorSetLayout() @@ -880,20 +815,17 @@ public: setLayoutBindings.data(), setLayoutBindings.size()); - VkResult err = vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout); - assert(!err); + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = vkTools::initializers::pipelineLayoutCreateInfo( &descriptorSetLayout, 1); - err = vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.radialBlur); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.radialBlur)); // Offscreen pipeline layout - err = vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.scene); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.scene)); } void setupDescriptorSet() @@ -906,8 +838,7 @@ public: // Full screen blur descriptor sets // Vertical blur - VkResult err = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.verticalBlur); - assert(!err); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.verticalBlur)); VkDescriptorImageInfo texDescriptorVert = vkTools::initializers::descriptorImageInfo( @@ -940,12 +871,11 @@ public: vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // Horizontal blur - err = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.horizontalBlur); - assert(!err); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.horizontalBlur)); VkDescriptorImageInfo texDescriptorHorz = vkTools::initializers::descriptorImageInfo( - offScreenFrameBufB.textureTarget.sampler, // todo : offScreenFrameBufB.textureTarget + offScreenFrameBufB.textureTarget.sampler, offScreenFrameBufB.textureTarget.view, VK_IMAGE_LAYOUT_GENERAL); @@ -974,8 +904,7 @@ public: vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // 3D scene - err = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene); - assert(!err); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene)); writeDescriptorSets = { @@ -990,8 +919,7 @@ public: vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // Skybox - err = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.skyBox); - assert(!err); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.skyBox)); // Image descriptor for the cube map texture VkDescriptorImageInfo cubeMapDescriptor = @@ -1102,8 +1030,7 @@ public: blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_DST_ALPHA; - VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.blurVert); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.blurVert)); // Phong pass (3D model) shaderStages[0] = loadShader(getAssetPath() + "shaders/bloom/phongpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -1113,23 +1040,19 @@ public: blendAttachmentState.blendEnable = VK_FALSE; depthStencilState.depthWriteEnable = VK_TRUE; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.phongPass); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.phongPass)); // Color only pass (offscreen blur base) shaderStages[0] = loadShader(getAssetPath() + "shaders/bloom/colorpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/bloom/colorpass.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.colorPass); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.colorPass)); // Skybox (cubemap shaderStages[0] = loadShader(getAssetPath() + "shaders/bloom/skybox.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/bloom/skybox.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); depthStencilState.depthWriteEnable = VK_FALSE; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.skyBox); - assert(!err); - + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.skyBox)); } // Prepare and initialize uniform buffer containing shader uniforms @@ -1138,6 +1061,7 @@ public: // Phong and color pass vertex shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.scene), &ubos.scene, &uniformData.vsScene.buffer, @@ -1147,6 +1071,7 @@ public: // Fullscreen quad display vertex shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.fullscreen), &ubos.fullscreen, &uniformData.vsFullScreen.buffer, @@ -1157,6 +1082,7 @@ public: // Vertical blur createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.vertBlur), &ubos.vertBlur, &uniformData.fsVertBlur.buffer, @@ -1165,6 +1091,7 @@ public: // Horizontal blur createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.horzBlur), &ubos.horzBlur, &uniformData.fsHorzBlur.buffer, @@ -1174,6 +1101,7 @@ public: // Skybox createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.skyBox), &ubos.skyBox, &uniformData.vsSkyBox.buffer, @@ -1193,7 +1121,7 @@ public: glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, -1.0f, zoom)); ubos.fullscreen.model = viewMatrix * - glm::translate(glm::mat4(), glm::vec3(sin(glm::radians(timer * 360.0f)) * 0.25f, 0.0f, cos(glm::radians(timer * 360.0f)) * 0.25f)); + glm::translate(glm::mat4(), glm::vec3(sin(glm::radians(timer * 360.0f)) * 0.25f, 0.0f, cos(glm::radians(timer * 360.0f)) * 0.25f) + cameraPos); ubos.fullscreen.model = glm::rotate(ubos.fullscreen.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); ubos.fullscreen.model = glm::rotate(ubos.fullscreen.model, -sinf(glm::radians(timer * 360.0f)) * 0.15f, glm::vec3(1.0f, 0.0f, 0.0f)); @@ -1202,8 +1130,7 @@ public: ubos.fullscreen.model = glm::rotate(ubos.fullscreen.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(ubos.fullscreen), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(ubos.fullscreen), 0, (void **)&pData)); memcpy(pData, &ubos.fullscreen, sizeof(ubos.fullscreen)); vkUnmapMemory(device, uniformData.vsFullScreen.memory); @@ -1215,8 +1142,7 @@ public: ubos.skyBox.model = glm::rotate(ubos.skyBox.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.skyBox.model = glm::rotate(ubos.skyBox.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - err = vkMapMemory(device, uniformData.vsSkyBox.memory, 0, sizeof(ubos.skyBox), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsSkyBox.memory, 0, sizeof(ubos.skyBox), 0, (void **)&pData)); memcpy(pData, &ubos.skyBox, sizeof(ubos.skyBox)); vkUnmapMemory(device, uniformData.vsSkyBox.memory); } @@ -1229,26 +1155,44 @@ public: ubos.scene.model = glm::mat4(); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(ubos.scene), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(ubos.scene), 0, (void **)&pData)); memcpy(pData, &ubos.scene, sizeof(ubos.scene)); vkUnmapMemory(device, uniformData.vsScene.memory); // Fragment shader // Vertical ubos.vertBlur.horizontal = 0; - err = vkMapMemory(device, uniformData.fsVertBlur.memory, 0, sizeof(ubos.vertBlur), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsVertBlur.memory, 0, sizeof(ubos.vertBlur), 0, (void **)&pData)); memcpy(pData, &ubos.vertBlur, sizeof(ubos.vertBlur)); vkUnmapMemory(device, uniformData.fsVertBlur.memory); // Horizontal ubos.horzBlur.horizontal = 1; - err = vkMapMemory(device, uniformData.fsHorzBlur.memory, 0, sizeof(ubos.horzBlur), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsHorzBlur.memory, 0, sizeof(ubos.horzBlur), 0, (void **)&pData)); memcpy(pData, &ubos.horzBlur, sizeof(ubos.horzBlur)); vkUnmapMemory(device, uniformData.fsHorzBlur.memory); } + void draw() + { + VulkanExampleBase::prepareFrame(); + + // Gather command buffers to be sumitted to the queue + std::vector submitCmdBuffers; + // Submit offscreen rendering command buffer + // todo : use event to ensure that offscreen result is finished bfore render command buffer is started + if (bloom) + { + submitCmdBuffers.push_back(offScreenCmdBuffer); + } + submitCmdBuffers.push_back(drawCmdBuffers[currentBuffer]); + submitInfo.commandBufferCount = submitCmdBuffers.size(); + submitInfo.pCommandBuffers = submitCmdBuffers.data(); + + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + + VulkanExampleBase::submitFrame(); + } + void prepare() { VulkanExampleBase::prepare(); @@ -1257,15 +1201,13 @@ public: loadMeshes(); setupVertexDescriptions(); prepareUniformBuffers(); - prepareTextureTarget(&offScreenFrameBuf.textureTarget, TEX_DIM, TEX_DIM, TEX_FORMAT); - prepareTextureTarget(&offScreenFrameBufB.textureTarget, TEX_DIM, TEX_DIM, TEX_FORMAT); + prepareTextureTargets(); + prepareOffscreenFramebuffers(); setupDescriptorSetLayout(); preparePipelines(); setupDescriptorPool(); setupDescriptorSet(); createOffscreenCommandBuffer(); - prepareOffscreenFramebuffer(&offScreenFrameBuf); - prepareOffscreenFramebuffer(&offScreenFrameBufB); buildCommandBuffers(); prepared = true; } @@ -1274,9 +1216,7 @@ public: { if (!prepared) return; - vkDeviceWaitIdle(device); draw(); - vkDeviceWaitIdle(device); if (!paused) { updateUniformBuffersScene(); @@ -1289,6 +1229,36 @@ public: updateUniformBuffersScreen(); } + virtual void keyPressed(uint32_t keyCode) + { + switch (keyCode) + { + case 0x6B: + case GAMEPAD_BUTTON_R1: + changeBlurScale(0.25f); + break; + case 0x6D: + case GAMEPAD_BUTTON_L1: + changeBlurScale(-0.25f); + break; + case 0x42: + case GAMEPAD_BUTTON_A: + toggleBloom(); + break; + } + } + + virtual void getOverlayText(VulkanTextOverlay *textOverlay) + { +#if defined(__ANDROID__) + textOverlay->addText("Press \"L1/R1\" to change blur scale", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"Button A\" to toggle bloom", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#else + textOverlay->addText("Press \"NUMPAD +/-\" to change blur scale", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"B\" to toggle bloom", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#endif + } + void changeBlurScale(float delta) { ubos.vertBlur.blurScale += delta; @@ -1311,21 +1281,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (vulkanExample != NULL) { vulkanExample->handleMessages(hWnd, uMsg, wParam, lParam); - if (uMsg == WM_KEYDOWN) - { - switch (wParam) - { - case 0x42: - vulkanExample->toggleBloom(); - break; - case VK_ADD: - vulkanExample->changeBlurScale(0.25f); - break; - case VK_SUBTRACT: - vulkanExample->changeBlurScale(-0.25f); - break; - } - } } return (DefWindowProc(hWnd, uMsg, wParam, lParam)); } diff --git a/data/shaders/bloom/colorpass.frag.spv b/data/shaders/bloom/colorpass.frag.spv index 99e81c311d4260a85b01ec8f544b6da7700995b8..ad10edbe3d13156a740415f90f542329262213ae 100644 GIT binary patch delta 12 TcmaFB`hayp1|$2%%yK3GARq)@ delta 12 TcmaFB`hayp1|!GD%yK3GASDD} diff --git a/data/shaders/bloom/colorpass.vert b/data/shaders/bloom/colorpass.vert index 7e91b35f..f140cf0f 100644 --- a/data/shaders/bloom/colorpass.vert +++ b/data/shaders/bloom/colorpass.vert @@ -17,17 +17,14 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec3 outColor; layout (location = 1) out vec2 outUV; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outUV = inUV; -/* - if (inColor.r >= 0.9) - { - outColor = ubo.glowColor.rgb; - } - else*/ - { - outColor = inColor; - } + outColor = inColor; gl_Position = ubo.projection * ubo.model * inPos; } diff --git a/data/shaders/bloom/colorpass.vert.spv b/data/shaders/bloom/colorpass.vert.spv index 1383eb48ac19292b5c667f61f88c38928a3a432f..1eebe8c9c27d53ff74c7fe23b59ae9aae48bf3b2 100644 GIT binary patch literal 1416 zcmY+D+iuf95QevL63VHilpZ)0r{RoLRj42&1fu04TtosDwYQerSjOObBij*N@(S=s zJQX)c{NLIu!bYQ+|DVIo%sN45c+Qvw{T9t*)0`F45jN(c={r3de;n^r^<-!7*)9=F zCUAkoEGvrBm7K*{fqh;AyDV9etV`}m0{uGDzm(Wj)My;-A09+iGL6f)PNM2lJW0yP zo_tPD>+1g)xw0aS^0-K6ahgPXPj{#B=@-*erTM$T+;3;~(Xlj`Ub4bL;hyVD{*O18{g%hZXREBvY@z(X%?OWuL;C38y^F`@OiRmD zgp2RF81{E&CrK_%ZDQF^n%l3wIqKaKH#@PePxhD|bF&blR=T3}|K$GicUgP%FU z-1ANqnUmAJA~AvE8h_XIguf>t-p@0H)S2h>A(<OHC z=D!BFCcGgXN~rau#hbD@o5I(nsnyhOb`R%y?zkz;Zg>Ok0P_ZZU$)$B z+uGbiKA1Q1{)e*Z7yom8E!3qS4*YL1d_%9qvhzz4_WfF3-UW=0{aux?JACXIysvC} zs`l1$6Dt^8JF*>txZ)My zk$5U@koZ5_o2DC0X8wO>XJ%(yuXSdPnbB{~JU8W8G&Nyk&~ByM(pOBg;Jdw}-d2_m zwsu}_i#GG7jw*Z$isCdRXMPxCUy{HsNERixB#$L^{c6&GRIH(>ZqM8OwC82P$WQ$| z@UqYTAV|IB^h?msvx_luh4Ijf{CGI_hk>{AVteHGzZyrGrfY+#pN#Y46KOELgmD3d zouV)K_me0|Iv7RH{t>)K~O)fC=o5t)F%)!s>z|=WVMrOw; zzl?K^d~j$R#~nCkU^#3!_S%()d}Z#&qJ`K6G zeYL9Z0?zW(u-_>AqXwA$*;%`l%^h2#Bb%Dse^lAj;XauCTK}eO`o;fBJ&>1vIPibP z@cq3N%f7Bk*ws6E*(n$wv%eu>?)cabcvrVw>9&Nvc|Y;=yCH$MG52K?L;p7Bfo%BS q%EO(967InhL*Gv%yy=%>z)vN_!IPUeK9jH;>eC;XxPO|&Ysr5=QFH(R diff --git a/data/shaders/bloom/gaussblur.frag.spv b/data/shaders/bloom/gaussblur.frag.spv index 20be177581c71f8fd405b3c10b45c06897f339e2..f06a382e7b1caa9899b690c0bfb9ee438aae1f91 100644 GIT binary patch delta 21 ccmbOszd(M1467gm6NAx2NpD8>jj6``05}^2!T%rrC8#7kd6AIYck z#)SXdGdrofSzYV@_d4%s)VsHgsp&Ukc1?K}Ok z#Am_Wc6L+$*HN4RVCE$EB!Q%%UtRi-0-Cz*^~0kt$6;>AQ5F?8%&($>&BFBJo4qXZ z|9x~7C&O?QCBsQHwBf<4{c&{p-L#Zxx+a*q>7+P2mj=^AoH!`lR^P@9N8zc>&TUrM zAA({_9-F%~kBc}>s9@3$>xCR7fg;5MbIw?p3_r4ICgm=f8R&T;j+F=)8$Wx9NtHd?B?-t)R>L~ z6ZcW#nO4lU*9?YKL$ahDYe0(EYiehhY#4bpa2aeoezE!vt;YH~{Lavt;zAu}z zF1#d7t}=J|4sZzhSEQMPeUTr`zWi)!m5sm8zbTt~^v>Ss-Ou{Cx`QVlIH)+{@!ggf z^Ya7spUWba9^dGdsY|aM_`hO!`$MtpZ(hRg-s_efgOB7vpX(BOXMX(Yc|!v4eICfh zhZ(%jL)q}Zm4}!|65`0{;ASi$qgteQw#tA literal 1524 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 IqHan)1F`_Mp#T5? diff --git a/data/shaders/bloom/skybox.frag.spv b/data/shaders/bloom/skybox.frag.spv index 090f708d05c90ab4d4b5e2288ea5f30379cc6999..054064b10546fbb776d0d8825bd20ea1d5d739be 100644 GIT binary patch delta 12 TcmZo*ZD5^{!pOccRhkI^7XSk~ delta 12 TcmZo*ZD5^{!pN~PRhkI^7X<@5 diff --git a/data/shaders/bloom/skybox.vert b/data/shaders/bloom/skybox.vert index df8efc0c..7f8da7a8 100644 --- a/data/shaders/bloom/skybox.vert +++ b/data/shaders/bloom/skybox.vert @@ -13,6 +13,12 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec3 outUVW; +out gl_PerVertex +{ + vec4 gl_Position; +}; + + void main() { outUVW = inPos; diff --git a/data/shaders/bloom/skybox.vert.spv b/data/shaders/bloom/skybox.vert.spv index 75ed5696c9f957eac0437420160f6a38543997a5..4061683042e27edd3b05f7ad39cf8ddfb11c8a38 100644 GIT binary patch literal 1220 zcmY+CTTc^F6ot1fEh;J?a`A>OMR_10#Go-TUf`uXG_h*H$H_n^WwgvRGt!W|j4c58fBK5IjGMLV^s+SR?o zVbovM&KbEM>Vvr-IO6NIkKXG)knjDN`-#l#$2;^-kn>nZ9=!METcz(uY5Z;d z`*p6XI2>nnZmZ@v*H9;?RPWUPK~LwOm?mvI+**j%-IlT=5F< zNIVrcNc`X0TeTaFXa0X?=VYhZ=*=5*M!&P>v8m2w(-1ZW9n`ujyf2 zhuPs*J1UFQF>=M}But`oGK(fQ+jYi*0OPNmA15-1bmHP*ujq_7KPKTLN3b!?z zF_R=5+Wf%grTs1_w&JnzWkp=ZSt@qk#j_K~$7#72|FFb)A2Z4KE{Uh_DM!NggIbl z_IOv(%*=u3c#fQKXwNYZ9KCxE8;)J~El8dYEQTOCM zF!$a{d@eYDkJ{v?HgmFrI}(n^-3n^Q4Hwtd9s1|aimbMDAX(LY@`CXP!hFHl@Goo3 z_vHQOW&3{cgZ=)}grgMd?7oc~avg+2mLkW*5Z6b!4$up93F4Ust5*0Y7!Y z)qkq0b4@sqke52(WeI0Zctx7L^wrUm9l{~xUz27(@Z<-xTR8kTYMXeU|CVfDj~S}> z@beAv4~6NMn$Puy$wO@p{9iG=_g7-s^#uugd@V2g25&2Zx;G{C!aT&&!@30C$MCHa zLr*^Dwru#{%2Ul*-GldayRxbKQ8CQWlfZF2cULwXvwH4c%`w+d6ENp}3HOP|&pv)B cFTMwoKtc>Xv!6#2-XU`_H<-A8s`NtgABjq2E&u=k