diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 50d896b..079299e 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -698,6 +698,7 @@ void VulkanExampleBase::initVulkan() assert(validDepthFormat); swapChain.connect(instance, physicalDevice, device); + #if defined(VK_USE_PLATFORM_ANDROID_KHR) // Get Android device name and manufacturer (to display along GPU name) @@ -1955,13 +1956,14 @@ void VulkanExampleBase::setupFrameBuffer() VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view)); // - + VkImageView attachments[4]; if (settings.multiSampling) { attachments[0] = multisampleTarget.color.view; attachments[2] = multisampleTarget.depth.view; attachments[3] = depthStencil.view; + } else { attachments[1] = depthStencil.view; @@ -1977,6 +1979,8 @@ void VulkanExampleBase::setupFrameBuffer() frameBufferCI.height = height; frameBufferCI.layers = 1; + + // Create frame buffers for every swap chain image frameBuffers.resize(swapChain.imageCount); for (uint32_t i = 0; i < frameBuffers.size(); i++) { @@ -2057,6 +2061,7 @@ void VulkanExampleBase::handleMouseMove(int32_t x, int32_t y) void VulkanExampleBase::initSwapchain() { #if defined(_WIN32) + swapChain.initSurface(windowInstance, window); #elif defined(VK_USE_PLATFORM_ANDROID_KHR) swapChain.initSurface(androidApp->window); diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index e43804b..b6d0e1f 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -112,7 +112,7 @@ public: bool paused = false; uint32_t lastFPS = 0; - struct Settings { + static struct Settings { bool validation = false; // 校验层开关 bool fullscreen = false; // 全屏开关 bool vsync = false; // 垂直同步开关 diff --git a/src/render/render.cpp b/src/render/render.cpp index 013409b..c431fe4 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -183,7 +183,11 @@ PlumageRender::PlumageRender() } // User interface - gui->draw(currentCB); + if (!settings.headless) + { + gui->draw(currentCB); + } + vkCmdEndRenderPass(currentCB); VK_CHECK_RESULT(vkEndCommandBuffer(currentCB)); @@ -1545,11 +1549,15 @@ PlumageRender::PlumageRender() VkFenceCreateInfo fenceCI{ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT }; VK_CHECK_RESULT(vkCreateFence(device, &fenceCI, nullptr, &waitFence)); } - // Queue ordering semaphores - for (auto& semaphore : presentCompleteSemaphores) { - VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; - VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore)); + if (!settings.headless) + { + for (auto& semaphore : presentCompleteSemaphores) { + VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; + VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore)); + } } + // Queue ordering semaphores + for (auto& semaphore : renderCompleteSemaphores) { VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore)); @@ -1570,9 +1578,12 @@ PlumageRender::PlumageRender() prepareUniformBuffers(); setupDescriptors(); preparePipelines(); - - gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, settings.sampleCount); - updateUIOverlay(); + if (!settings.headless) + { + gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, settings.sampleCount); + updateUIOverlay(); + } + buildCommandBuffers(); @@ -1618,7 +1629,7 @@ PlumageRender::PlumageRender() // Source for the copy is the last rendered swapchain image VkImage srcImage = swapChain.images[currentBuffer]; - + // Create the linear tiled destination image to copy to and to read the memory from VkImageCreateInfo imageCreateCI(vks::initializers::imageCreateInfo()); imageCreateCI.imageType = VK_IMAGE_TYPE_2D; @@ -1668,6 +1679,7 @@ PlumageRender::PlumageRender() srcImage, VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT, + //VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, @@ -1732,17 +1744,20 @@ PlumageRender::PlumageRender() VK_PIPELINE_STAGE_TRANSFER_BIT, VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); - // Transition back the swap chain image after the blit is done - vks::tools::insertImageMemoryBarrier( - copyCmd, - srcImage, - VK_ACCESS_TRANSFER_READ_BIT, - VK_ACCESS_MEMORY_READ_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); + if (!settings.headless) + { + // Transition back the swap chain image after the blit is done + vks::tools::insertImageMemoryBarrier( + copyCmd, + srcImage, + VK_ACCESS_TRANSFER_READ_BIT, + VK_ACCESS_MEMORY_READ_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); + } vulkanDevice->flushCommandBuffer(copyCmd, queue); @@ -1935,23 +1950,7 @@ PlumageRender::PlumageRender() } - uint32_t PlumageRender::getMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties) - { - VkPhysicalDeviceMemoryProperties deviceMemoryProperties; - vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); - for (uint32_t i = 0; i < deviceMemoryProperties.memoryTypeCount; i++) - { - if ((typeBits & 1) == 1) - { - if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) - { - return i; - } - } - typeBits >>= 1; - } - return 0; - } + void PlumageRender::render() { @@ -1959,15 +1958,19 @@ PlumageRender::PlumageRender() return; } - updateUIOverlay(); + if (!settings.headless) + { + updateUIOverlay(); + } + //加入写到文件的函数 //swapChainImage = swapChain.images[frameIndex]; //outputImageSequeue(swapChainImage,filePath.imageSequenceFilePath); - - VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[frameIndex], VK_TRUE, UINT64_MAX)); outputImageSequence(); + VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[frameIndex], VK_TRUE, UINT64_MAX)); + imageSequenceToVideo(); VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[frameIndex])); @@ -1981,6 +1984,7 @@ PlumageRender::PlumageRender() } + // Update UBOs updateUniformBuffers(); UniformBufferSet currentUB = uniformBuffers[currentBuffer]; @@ -2001,6 +2005,7 @@ PlumageRender::PlumageRender() VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, waitFences[frameIndex])); //显示队列 + VkResult present = swapChain.queuePresent(queue, currentBuffer, renderCompleteSemaphores[frameIndex]); if (!((present == VK_SUCCESS) || (present == VK_SUBOPTIMAL_KHR))) { if (present == VK_ERROR_OUT_OF_DATE_KHR) { @@ -2279,8 +2284,12 @@ PlumageRender::PlumageRender() { for (int32_t i = 0; i < __argc; i++) { PlumageRender::args.push_back(__argv[i]); }; plumageRender = new PlumageRender(); + plumageRender->initVulkan(); - plumageRender->setupWindow(hInstance, WndProc); + if (!PlumageRender::settings.headless) + { + plumageRender->setupWindow(hInstance, WndProc); + } plumageRender->prepare(); plumageRender->renderLoop(); delete(plumageRender); diff --git a/src/render/render.h b/src/render/render.h index 80ca512..5e1ef09 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -365,7 +365,7 @@ public: void imageSequenceToVideo(); void removeImageSequence(); //void outputScreenShot(); - uint32_t getMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties); + //uint32_t getMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties); virtual void render(); virtual void updateUIOverlay(); virtual void fileDropped(std::string filename);