Use application wide submit info and semaphores (Fixes #66, Fixes #65, Fixes#60), removed no longer functional code loading GLSL (Fixes #62)

This commit is contained in:
saschawillems 2016-03-06 20:15:05 +01:00
parent 0240cde57a
commit 8cd5041111
26 changed files with 226 additions and 961 deletions

View file

@ -20,7 +20,6 @@
#include "vulkanexamplebase.h"
#define VERTEX_BUFFER_BIND_ID 0
//#define USE_GLSL
#define ENABLE_VALIDATION false
// Texture properties
@ -692,16 +691,6 @@ public:
vkCmdEndRenderPass(drawCmdBuffers[i]);
VkImageMemoryBarrier prePresentBarrier = vkTools::prePresentBarrier(swapChain.buffers[i].image);
vkCmdPipelineBarrier(
drawCmdBuffers[i],
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_FLAGS_NONE,
0, nullptr,
0, nullptr,
1, &prePresentBarrier);
err = vkEndCommandBuffer(drawCmdBuffers[i]);
assert(!err);
}
@ -715,46 +704,35 @@ public:
void draw()
{
VkResult err;
VkSemaphore presentCompleteSemaphore;
VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo();
err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore);
assert(!err);
// Get next image in the swap chain (back/front buffer)
err = swapChain.acquireNextImage(presentCompleteSemaphore, &currentBuffer);
err = swapChain.acquireNextImage(semaphores.presentComplete, &currentBuffer);
assert(!err);
submitPostPresentBarrier(swapChain.buffers[currentBuffer].image);
// Gather command buffers to be sumitted to the queue
std::vector<VkCommandBuffer> submitCmdBuffers;
// Submit offscreen rendering command buffer
if (bloom)
{
submitCmdBuffers.push_back(offScreenCmdBuffer);
}
submitCmdBuffers.push_back(drawCmdBuffers[currentBuffer]);
VkSubmitInfo submitInfo = vkTools::initializers::submitInfo();
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = &presentCompleteSemaphore;
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
// Submit draw command buffer
// Submit to queue
err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
assert(!err);
err = swapChain.queuePresent(queue, currentBuffer);
submitPrePresentBarrier(swapChain.buffers[currentBuffer].image);
err = swapChain.queuePresent(queue, currentBuffer, semaphores.renderComplete);
assert(!err);
vkDestroySemaphore(device, presentCompleteSemaphore, nullptr);
submitPostPresentBarrier(swapChain.buffers[currentBuffer].image);
err = vkQueueWaitIdle(queue);
assert(err == VK_SUCCESS);
assert(!err);
}
void loadMeshes()
@ -1090,13 +1068,8 @@ public:
// Vertical gauss blur
// Load shaders
#ifdef USE_GLSL
shaderStages[0] = loadShaderGLSL("./../data/shaders/bloom/gaussblur.vert", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShaderGLSL("./../data/shaders/bloom/gaussblur.frag", VK_SHADER_STAGE_FRAGMENT_BIT);
#else
shaderStages[0] = loadShader("./../data/shaders/bloom/gaussblur.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader("./../data/shaders/bloom/gaussblur.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
#endif
VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo(
@ -1129,13 +1102,8 @@ public:
assert(!err);
// Phong pass (3D model)
#ifdef USE_GLSL
shaderStages[0] = loadShaderGLSL("./../data/shaders/bloom/phongpass.vert", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShaderGLSL("./../data/shaders/bloom/phongpass.frag", VK_SHADER_STAGE_FRAGMENT_BIT);
#else
shaderStages[0] = loadShader("./../data/shaders/bloom/phongpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader("./../data/shaders/bloom/phongpass.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
#endif
pipelineCreateInfo.layout = pipelineLayouts.scene;
blendAttachmentState.blendEnable = VK_FALSE;
@ -1145,25 +1113,15 @@ public:
assert(!err);
// Color only pass (offscreen blur base)
#ifdef USE_GLSL
shaderStages[0] = loadShaderGLSL("./../data/shaders/bloom/colorpass.vert", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShaderGLSL("./../data/shaders/bloom/colorpass.frag", VK_SHADER_STAGE_FRAGMENT_BIT);
#else
shaderStages[0] = loadShader("./../data/shaders/bloom/colorpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader("./../data/shaders/bloom/colorpass.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
#endif
err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.colorPass);
assert(!err);
// Skybox (cubemap
#ifdef USE_GLSL
shaderStages[0] = loadShaderGLSL("./../data/shaders/bloom/skybox.vert", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShaderGLSL("./../data/shaders/bloom/skybox.frag", VK_SHADER_STAGE_FRAGMENT_BIT);
#else
shaderStages[0] = loadShader("./../data/shaders/bloom/skybox.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader("./../data/shaders/bloom/skybox.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
#endif
depthStencilState.depthWriteEnable = VK_FALSE;
err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.skyBox);
assert(!err);