Code cleanup
This commit is contained in:
parent
8f1a5e38f2
commit
d8a3379e0b
5 changed files with 308 additions and 487 deletions
|
|
@ -16,36 +16,35 @@ class VulkanExample : public VulkanExampleBase
|
|||
public:
|
||||
struct MultiviewPass {
|
||||
struct FrameBufferAttachment {
|
||||
VkImage image;
|
||||
VkDeviceMemory memory;
|
||||
VkImageView view;
|
||||
VkImage image{ VK_NULL_HANDLE };
|
||||
VkDeviceMemory memory{ VK_NULL_HANDLE };
|
||||
VkImageView view{ VK_NULL_HANDLE };
|
||||
} color, depth;
|
||||
VkFramebuffer frameBuffer;
|
||||
VkRenderPass renderPass;
|
||||
VkDescriptorImageInfo descriptor;
|
||||
VkSampler sampler;
|
||||
VkSemaphore semaphore;
|
||||
std::vector<VkCommandBuffer> commandBuffers;
|
||||
std::vector<VkFence> waitFences;
|
||||
VkFramebuffer frameBuffer{ VK_NULL_HANDLE };
|
||||
VkRenderPass renderPass{ VK_NULL_HANDLE };
|
||||
VkDescriptorImageInfo descriptor{ VK_NULL_HANDLE };
|
||||
VkSampler sampler{ VK_NULL_HANDLE };
|
||||
VkSemaphore semaphore{ VK_NULL_HANDLE };
|
||||
std::vector<VkCommandBuffer> commandBuffers{};
|
||||
std::vector<VkFence> waitFences{};
|
||||
} multiviewPass;
|
||||
|
||||
vkglTF::Model scene;
|
||||
|
||||
struct UBO {
|
||||
struct UniformData {
|
||||
glm::mat4 projection[2];
|
||||
glm::mat4 modelview[2];
|
||||
glm::vec4 lightPos = glm::vec4(-2.5f, -3.5f, 0.0f, 1.0f);
|
||||
float distortionAlpha = 0.2f;
|
||||
} ubo;
|
||||
|
||||
} uniformData;
|
||||
vks::Buffer uniformBuffer;
|
||||
|
||||
VkPipeline pipeline;
|
||||
VkPipelineLayout pipelineLayout;
|
||||
VkDescriptorSet descriptorSet;
|
||||
VkDescriptorSetLayout descriptorSetLayout;
|
||||
VkPipeline pipeline{ VK_NULL_HANDLE };
|
||||
VkPipelineLayout pipelineLayout{ VK_NULL_HANDLE };
|
||||
VkDescriptorSet descriptorSet{ VK_NULL_HANDLE };
|
||||
VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE };
|
||||
|
||||
VkPipeline viewDisplayPipelines[2];
|
||||
VkPipeline viewDisplayPipelines[2]{};
|
||||
|
||||
VkPhysicalDeviceMultiviewFeaturesKHR physicalDeviceMultiviewFeatures{};
|
||||
|
||||
|
|
@ -78,35 +77,29 @@ public:
|
|||
|
||||
~VulkanExample()
|
||||
{
|
||||
vkDestroyPipeline(device, pipeline, nullptr);
|
||||
|
||||
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
||||
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
|
||||
|
||||
// Multiview pass
|
||||
|
||||
vkDestroyImageView(device, multiviewPass.color.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.color.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.color.memory, nullptr);
|
||||
vkDestroyImageView(device, multiviewPass.depth.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.depth.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.depth.memory, nullptr);
|
||||
|
||||
vkDestroyRenderPass(device, multiviewPass.renderPass, nullptr);
|
||||
vkDestroySampler(device, multiviewPass.sampler, nullptr);
|
||||
vkDestroyFramebuffer(device, multiviewPass.frameBuffer, nullptr);
|
||||
|
||||
vkFreeCommandBuffers(device, cmdPool, static_cast<uint32_t>(multiviewPass.commandBuffers.size()), multiviewPass.commandBuffers.data());
|
||||
vkDestroySemaphore(device, multiviewPass.semaphore, nullptr);
|
||||
for (auto& fence : multiviewPass.waitFences) {
|
||||
vkDestroyFence(device, fence, nullptr);
|
||||
}
|
||||
|
||||
for (auto& pipeline : viewDisplayPipelines) {
|
||||
if (device) {
|
||||
vkDestroyPipeline(device, pipeline, nullptr);
|
||||
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
|
||||
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
|
||||
vkDestroyImageView(device, multiviewPass.color.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.color.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.color.memory, nullptr);
|
||||
vkDestroyImageView(device, multiviewPass.depth.view, nullptr);
|
||||
vkDestroyImage(device, multiviewPass.depth.image, nullptr);
|
||||
vkFreeMemory(device, multiviewPass.depth.memory, nullptr);
|
||||
vkDestroyRenderPass(device, multiviewPass.renderPass, nullptr);
|
||||
vkDestroySampler(device, multiviewPass.sampler, nullptr);
|
||||
vkDestroyFramebuffer(device, multiviewPass.frameBuffer, nullptr);
|
||||
vkFreeCommandBuffers(device, cmdPool, static_cast<uint32_t>(multiviewPass.commandBuffers.size()), multiviewPass.commandBuffers.data());
|
||||
vkDestroySemaphore(device, multiviewPass.semaphore, nullptr);
|
||||
for (auto& fence : multiviewPass.waitFences) {
|
||||
vkDestroyFence(device, fence, nullptr);
|
||||
}
|
||||
for (auto& pipeline : viewDisplayPipelines) {
|
||||
vkDestroyPipeline(device, pipeline, nullptr);
|
||||
}
|
||||
uniformBuffer.destroy();
|
||||
}
|
||||
|
||||
uniformBuffer.destroy();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -150,8 +143,9 @@ public:
|
|||
depthStencilView.flags = 0;
|
||||
depthStencilView.subresourceRange = {};
|
||||
depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
if (depthFormat >= VK_FORMAT_D16_UNORM_S8_UINT)
|
||||
if (depthFormat >= VK_FORMAT_D16_UNORM_S8_UINT) {
|
||||
depthStencilView.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
}
|
||||
depthStencilView.subresourceRange.baseMipLevel = 0;
|
||||
depthStencilView.subresourceRange.levelCount = 1;
|
||||
depthStencilView.subresourceRange.baseArrayLayer = 0;
|
||||
|
|
@ -583,13 +577,8 @@ public:
|
|||
// Prepare and initialize uniform buffer containing shader uniforms
|
||||
void prepareUniformBuffers()
|
||||
{
|
||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
||||
&uniformBuffer,
|
||||
sizeof(ubo)));
|
||||
VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &uniformBuffer, sizeof(UniformData)));
|
||||
VK_CHECK_RESULT(uniformBuffer.map());
|
||||
updateUniformBuffers();
|
||||
}
|
||||
|
||||
void updateUniformBuffers()
|
||||
|
|
@ -625,8 +614,8 @@ public:
|
|||
|
||||
transM = glm::translate(glm::mat4(1.0f), camera.position - camRight * (eyeSeparation / 2.0f));
|
||||
|
||||
ubo.projection[0] = glm::frustum(left, right, bottom, top, zNear, zFar);
|
||||
ubo.modelview[0] = rotM * transM;
|
||||
uniformData.projection[0] = glm::frustum(left, right, bottom, top, zNear, zFar);
|
||||
uniformData.modelview[0] = rotM * transM;
|
||||
|
||||
// Right eye
|
||||
left = -aspectRatio * wd2 + 0.5f * eyeSeparation * ndfl;
|
||||
|
|
@ -634,35 +623,10 @@ public:
|
|||
|
||||
transM = glm::translate(glm::mat4(1.0f), camera.position + camRight * (eyeSeparation / 2.0f));
|
||||
|
||||
ubo.projection[1] = glm::frustum(left, right, bottom, top, zNear, zFar);
|
||||
ubo.modelview[1] = rotM * transM;
|
||||
uniformData.projection[1] = glm::frustum(left, right, bottom, top, zNear, zFar);
|
||||
uniformData.modelview[1] = rotM * transM;
|
||||
|
||||
memcpy(uniformBuffer.mapped, &ubo, sizeof(ubo));
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
VulkanExampleBase::prepareFrame();
|
||||
|
||||
// Multiview offscreen render
|
||||
VK_CHECK_RESULT(vkWaitForFences(device, 1, &multiviewPass.waitFences[currentBuffer], VK_TRUE, UINT64_MAX));
|
||||
VK_CHECK_RESULT(vkResetFences(device, 1, &multiviewPass.waitFences[currentBuffer]));
|
||||
submitInfo.pWaitSemaphores = &semaphores.presentComplete;
|
||||
submitInfo.pSignalSemaphores = &multiviewPass.semaphore;
|
||||
submitInfo.commandBufferCount = 1;
|
||||
submitInfo.pCommandBuffers = &multiviewPass.commandBuffers[currentBuffer];
|
||||
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, multiviewPass.waitFences[currentBuffer]));
|
||||
|
||||
// View display
|
||||
VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[currentBuffer], VK_TRUE, UINT64_MAX));
|
||||
VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[currentBuffer]));
|
||||
submitInfo.pWaitSemaphores = &multiviewPass.semaphore;
|
||||
submitInfo.pSignalSemaphores = &semaphores.renderComplete;
|
||||
submitInfo.commandBufferCount = 1;
|
||||
submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer];
|
||||
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, waitFences[currentBuffer]));
|
||||
|
||||
VulkanExampleBase::submitFrame();
|
||||
memcpy(uniformBuffer.mapped, &uniformData, sizeof(UniformData));
|
||||
}
|
||||
|
||||
void prepare()
|
||||
|
|
@ -728,19 +692,37 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
VulkanExampleBase::prepareFrame();
|
||||
|
||||
// Multiview offscreen render
|
||||
VK_CHECK_RESULT(vkWaitForFences(device, 1, &multiviewPass.waitFences[currentBuffer], VK_TRUE, UINT64_MAX));
|
||||
VK_CHECK_RESULT(vkResetFences(device, 1, &multiviewPass.waitFences[currentBuffer]));
|
||||
submitInfo.pWaitSemaphores = &semaphores.presentComplete;
|
||||
submitInfo.pSignalSemaphores = &multiviewPass.semaphore;
|
||||
submitInfo.commandBufferCount = 1;
|
||||
submitInfo.pCommandBuffers = &multiviewPass.commandBuffers[currentBuffer];
|
||||
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, multiviewPass.waitFences[currentBuffer]));
|
||||
|
||||
// View display
|
||||
VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[currentBuffer], VK_TRUE, UINT64_MAX));
|
||||
VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[currentBuffer]));
|
||||
submitInfo.pWaitSemaphores = &multiviewPass.semaphore;
|
||||
submitInfo.pSignalSemaphores = &semaphores.renderComplete;
|
||||
submitInfo.commandBufferCount = 1;
|
||||
submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer];
|
||||
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, waitFences[currentBuffer]));
|
||||
|
||||
VulkanExampleBase::submitFrame();
|
||||
}
|
||||
|
||||
virtual void render()
|
||||
{
|
||||
if (!prepared)
|
||||
return;
|
||||
draw();
|
||||
if (camera.updated) {
|
||||
updateUniformBuffers();
|
||||
}
|
||||
}
|
||||
|
||||
virtual void viewChanged()
|
||||
{
|
||||
updateUniformBuffers();
|
||||
draw();
|
||||
}
|
||||
|
||||
virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay)
|
||||
|
|
@ -749,7 +731,7 @@ public:
|
|||
if (overlay->sliderFloat("Eye separation", &eyeSeparation, -1.0f, 1.0f)) {
|
||||
updateUniformBuffers();
|
||||
}
|
||||
if (overlay->sliderFloat("Barrel distortion", &ubo.distortionAlpha, -0.6f, 0.6f)) {
|
||||
if (overlay->sliderFloat("Barrel distortion", &uniformData.distortionAlpha, -0.6f, 0.6f)) {
|
||||
updateUniformBuffers();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue