diff --git a/data/shaders/radialblur/colorpass.frag.spv b/data/shaders/radialblur/colorpass.frag.spv index ee8e1330..7fad085d 100644 Binary files a/data/shaders/radialblur/colorpass.frag.spv and b/data/shaders/radialblur/colorpass.frag.spv differ diff --git a/data/shaders/radialblur/colorpass.vert b/data/shaders/radialblur/colorpass.vert index 18f7a156..05c9cd4e 100644 --- a/data/shaders/radialblur/colorpass.vert +++ b/data/shaders/radialblur/colorpass.vert @@ -15,14 +15,13 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec3 outColor; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { -/* - if (inColor.r >= 0.9) - { - outColor = ubo.glowColor.rgb; - } - else*/ { outColor = inColor; } diff --git a/data/shaders/radialblur/colorpass.vert.spv b/data/shaders/radialblur/colorpass.vert.spv index dc4b4d3d..3778d638 100644 Binary files a/data/shaders/radialblur/colorpass.vert.spv and b/data/shaders/radialblur/colorpass.vert.spv differ diff --git a/data/shaders/radialblur/phongpass.frag.spv b/data/shaders/radialblur/phongpass.frag.spv index 2accdf6f..f0d494cd 100644 Binary files a/data/shaders/radialblur/phongpass.frag.spv and b/data/shaders/radialblur/phongpass.frag.spv differ diff --git a/data/shaders/radialblur/phongpass.vert b/data/shaders/radialblur/phongpass.vert index 134f6da5..5f744df3 100644 --- a/data/shaders/radialblur/phongpass.vert +++ b/data/shaders/radialblur/phongpass.vert @@ -18,6 +18,11 @@ layout (location = 1) out vec3 outColor; layout (location = 2) out vec3 outEyePos; layout (location = 3) out vec3 outLightVec; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outNormal = inNormal; diff --git a/data/shaders/radialblur/phongpass.vert.spv b/data/shaders/radialblur/phongpass.vert.spv index 154a9010..fa3a8ddb 100644 Binary files a/data/shaders/radialblur/phongpass.vert.spv and b/data/shaders/radialblur/phongpass.vert.spv differ diff --git a/data/shaders/radialblur/radialblur.frag.spv b/data/shaders/radialblur/radialblur.frag.spv index 5aa970d2..27a0b95e 100644 Binary files a/data/shaders/radialblur/radialblur.frag.spv and b/data/shaders/radialblur/radialblur.frag.spv differ diff --git a/data/shaders/radialblur/radialblur.vert b/data/shaders/radialblur/radialblur.vert index fe704c9c..f6d023e8 100644 --- a/data/shaders/radialblur/radialblur.vert +++ b/data/shaders/radialblur/radialblur.vert @@ -14,6 +14,11 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outUV = inUV; diff --git a/data/shaders/radialblur/radialblur.vert.spv b/data/shaders/radialblur/radialblur.vert.spv index 023de7eb..dbaf4b66 100644 Binary files a/data/shaders/radialblur/radialblur.vert.spv and b/data/shaders/radialblur/radialblur.vert.spv differ diff --git a/radialblur/radialblur.cpp b/radialblur/radialblur.cpp index a5bff106..9111680d 100644 --- a/radialblur/radialblur.cpp +++ b/radialblur/radialblur.cpp @@ -124,6 +124,7 @@ public: zoom = -12.0f; rotation = { -16.25f, -28.75f, 0.0f }; timerSpeed *= 0.5f; + enableTextOverlay = true; title = "Vulkan Example - Radial blur"; } @@ -175,10 +176,9 @@ public: // the offscreen framebuffer void prepareTextureTarget(vkTools::VulkanTexture *tex, uint32_t width, uint32_t height, VkFormat format) { - createSetupCommandBuffer(); + VkCommandBuffer cmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); VkFormatProperties formatProperties; - VkResult err; // Get device properites for the requested texture format vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProperties); @@ -206,20 +206,17 @@ 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)); // Transform image layout to transfer destination tex->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, tex->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PREINITIALIZED, @@ -239,8 +236,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(); @@ -250,10 +246,9 @@ 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); + VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view)); - flushSetupCommandBuffer(); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); } // Prepare a new framebuffer for offscreen rendering @@ -261,7 +256,7 @@ public: // blitted to our render target void prepareOffscreenFramebuffer() { - createSetupCommandBuffer(); + VkCommandBuffer cmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); offScreenFrameBuf.width = FB_DIM; offScreenFrameBuf.height = FB_DIM; @@ -273,14 +268,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 = offScreenFrameBuf.width; image.extent.height = offScreenFrameBuf.height; + image.extent.depth = 1; image.mipLevels = 1; image.arrayLayers = 1; image.samples = VK_SAMPLE_COUNT_1_BIT; @@ -303,27 +297,22 @@ public: colorImageView.subresourceRange.baseArrayLayer = 0; colorImageView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.color.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.color.image)); vkGetImageMemoryRequirements(device, offScreenFrameBuf.color.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.color.mem); - assert(!err); - - err = vkBindImageMemory(device, offScreenFrameBuf.color.image, offScreenFrameBuf.color.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.color.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, offScreenFrameBuf.color.image, offScreenFrameBuf.color.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, offScreenFrameBuf.color.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); colorImageView.image = offScreenFrameBuf.color.image; - err = vkCreateImageView(device, &colorImageView, nullptr, &offScreenFrameBuf.color.view); - assert(!err); + VK_CHECK_RESULT(vkCreateImageView(device, &colorImageView, nullptr, &offScreenFrameBuf.color.view)); // Depth stencil attachment image.format = fbDepthFormat; @@ -340,29 +329,22 @@ public: depthStencilView.subresourceRange.baseArrayLayer = 0; depthStencilView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.depth.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.depth.image)); vkGetImageMemoryRequirements(device, offScreenFrameBuf.depth.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.depth.mem); - assert(!err); - - err = vkBindImageMemory(device, offScreenFrameBuf.depth.image, offScreenFrameBuf.depth.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.depth.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, offScreenFrameBuf.depth.image, offScreenFrameBuf.depth.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, offScreenFrameBuf.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 = offScreenFrameBuf.depth.image; - err = vkCreateImageView(device, &depthStencilView, nullptr, &offScreenFrameBuf.depth.view); - assert(!err); - - flushSetupCommandBuffer(); + VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &offScreenFrameBuf.depth.view)); VkImageView attachments[2]; attachments[0] = offScreenFrameBuf.color.view; @@ -375,9 +357,9 @@ public: fbufCreateInfo.width = offScreenFrameBuf.width; fbufCreateInfo.height = offScreenFrameBuf.height; fbufCreateInfo.layers = 1; + VK_CHECK_RESULT(vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &offScreenFrameBuf.frameBuffer)); - err = vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &offScreenFrameBuf.frameBuffer); - assert(!err); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); } void createOffscreenCommandBuffer() @@ -386,8 +368,7 @@ public: cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1); - VkResult vkRes = vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer)); } // The command buffer to copy for rendering @@ -396,8 +377,6 @@ public: // and gets resubmitted void buildOffscreenCommandBuffer() { - VkResult err; - VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); VkClearValue clearValues[2]; @@ -412,21 +391,12 @@ public: renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = clearValues; - 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); @@ -510,8 +480,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 reBuildCommandBuffers() @@ -541,30 +510,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 }; @@ -589,42 +547,10 @@ public: vkCmdEndRenderPass(drawCmdBuffers[i]); - err = vkEndCommandBuffer(drawCmdBuffers[i]); - assert(!err); + VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i])); } } - 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 = { - offScreenCmdBuffer, - 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/glowsphere.dae", &meshes.example, vertexLayout, 0.05f); @@ -732,8 +658,7 @@ public: poolSizes.data(), 2); - VkResult vkRes = vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool); - assert(!vkRes); + VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); } void setupDescriptorSetLayout() @@ -763,20 +688,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() @@ -788,8 +710,7 @@ public: &descriptorSetLayout, 1); - VkResult vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.quad); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.quad)); // Image descriptor for the color map texture VkDescriptorImageInfo texDescriptor = @@ -823,8 +744,7 @@ public: vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // Offscreen 3D scene descriptor set - vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene)); std::vector offScreenWriteDescriptorSets = { @@ -921,13 +841,11 @@ public: blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_DST_ALPHA; - VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.radialBlur); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.radialBlur)); // No blending (for debug display) blendAttachmentState.blendEnable = VK_FALSE; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.fullScreenOnly); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.fullScreenOnly)); // Phong pass shaderStages[0] = loadShader(getAssetPath() + "shaders/radialblur/phongpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -937,25 +855,22 @@ 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/radialblur/colorpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/radialblur/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)); } // Prepare and initialize uniform buffer containing shader uniforms void prepareUniformBuffers() { - VkResult err; - // 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(uboVS), &uboVS, &uniformData.vsScene.buffer, @@ -965,6 +880,7 @@ public: // Fullscreen quad vertex shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(uboVS), &uboVS, &uniformData.vsQuad.buffer, @@ -974,6 +890,7 @@ public: // Fullscreen quad fragment shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(uboQuadFS), &uboQuadFS, &uniformData.fsQuad.buffer, @@ -998,8 +915,7 @@ public: uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData)); memcpy(pData, &uboQuadVS, sizeof(uboQuadVS)); vkUnmapMemory(device, uniformData.vsQuad.memory); } @@ -1012,18 +928,37 @@ public: uboVS.model = glm::mat4(); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); memcpy(pData, &uboVS, sizeof(uboVS)); vkUnmapMemory(device, uniformData.vsScene.memory); // Fragment shader - err = vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData)); memcpy(pData, &uboQuadFS, sizeof(uboQuadFS)); vkUnmapMemory(device, uniformData.fsQuad.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 (blur) + { + 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(); @@ -1047,9 +982,7 @@ public: { if (!prepared) return; - vkDeviceWaitIdle(device); draw(); - vkDeviceWaitIdle(device); if (!paused) { updateUniformBuffersScene(); @@ -1062,6 +995,32 @@ public: updateUniformBuffersScreen(); } + virtual void keyPressed(uint32_t keyCode) + { + switch (keyCode) + { + case 0x42: + case GAMEPAD_BUTTON_A: + toggleBlur(); + break; + case 0x54: + case GAMEPAD_BUTTON_X: + toggleTextureDisplay(); + break; + } + } + + virtual void getOverlayText(VulkanTextOverlay *textOverlay) + { +#if defined(__ANDROID__) + textOverlay->addText("Press \"Button A\" to toggle blur", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"Button X\" to display offscreen texture", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#else + textOverlay->addText("Press \"B\" to toggle blur", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"T\" to display offscreen texture", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#endif + } + void toggleBlur() { blur = !blur; @@ -1085,18 +1044,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->toggleBlur(); - break; - case 0x54: - vulkanExample->toggleTextureDisplay(); - break; - } - } } return (DefWindowProc(hWnd, uMsg, wParam, lParam)); }