准备摘头

ink-soul 2024-03-29 18:11:09 +08:00
parent 6244917553
commit 91b3fa0a03
4 changed files with 58 additions and 44 deletions

View File

@ -698,6 +698,7 @@ void VulkanExampleBase::initVulkan()
assert(validDepthFormat); assert(validDepthFormat);
swapChain.connect(instance, physicalDevice, device); swapChain.connect(instance, physicalDevice, device);
#if defined(VK_USE_PLATFORM_ANDROID_KHR) #if defined(VK_USE_PLATFORM_ANDROID_KHR)
// Get Android device name and manufacturer (to display along GPU name) // 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)); VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view));
// //
VkImageView attachments[4]; VkImageView attachments[4];
if (settings.multiSampling) { if (settings.multiSampling) {
attachments[0] = multisampleTarget.color.view; attachments[0] = multisampleTarget.color.view;
attachments[2] = multisampleTarget.depth.view; attachments[2] = multisampleTarget.depth.view;
attachments[3] = depthStencil.view; attachments[3] = depthStencil.view;
} }
else { else {
attachments[1] = depthStencil.view; attachments[1] = depthStencil.view;
@ -1977,6 +1979,8 @@ void VulkanExampleBase::setupFrameBuffer()
frameBufferCI.height = height; frameBufferCI.height = height;
frameBufferCI.layers = 1; frameBufferCI.layers = 1;
// Create frame buffers for every swap chain image // Create frame buffers for every swap chain image
frameBuffers.resize(swapChain.imageCount); frameBuffers.resize(swapChain.imageCount);
for (uint32_t i = 0; i < frameBuffers.size(); i++) { 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() void VulkanExampleBase::initSwapchain()
{ {
#if defined(_WIN32) #if defined(_WIN32)
swapChain.initSurface(windowInstance, window); swapChain.initSurface(windowInstance, window);
#elif defined(VK_USE_PLATFORM_ANDROID_KHR) #elif defined(VK_USE_PLATFORM_ANDROID_KHR)
swapChain.initSurface(androidApp->window); swapChain.initSurface(androidApp->window);

View File

@ -112,7 +112,7 @@ public:
bool paused = false; bool paused = false;
uint32_t lastFPS = 0; uint32_t lastFPS = 0;
struct Settings { static struct Settings {
bool validation = false; // 校验层开关 bool validation = false; // 校验层开关
bool fullscreen = false; // 全屏开关 bool fullscreen = false; // 全屏开关
bool vsync = false; // 垂直同步开关 bool vsync = false; // 垂直同步开关

View File

@ -183,7 +183,11 @@ PlumageRender::PlumageRender()
} }
// User interface // User interface
gui->draw(currentCB); if (!settings.headless)
{
gui->draw(currentCB);
}
vkCmdEndRenderPass(currentCB); vkCmdEndRenderPass(currentCB);
VK_CHECK_RESULT(vkEndCommandBuffer(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 }; VkFenceCreateInfo fenceCI{ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT };
VK_CHECK_RESULT(vkCreateFence(device, &fenceCI, nullptr, &waitFence)); VK_CHECK_RESULT(vkCreateFence(device, &fenceCI, nullptr, &waitFence));
} }
// Queue ordering semaphores if (!settings.headless)
for (auto& semaphore : presentCompleteSemaphores) { {
VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; for (auto& semaphore : presentCompleteSemaphores) {
VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore)); 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) { for (auto& semaphore : renderCompleteSemaphores) {
VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 };
VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore)); VK_CHECK_RESULT(vkCreateSemaphore(device, &semaphoreCI, nullptr, &semaphore));
@ -1570,9 +1578,12 @@ PlumageRender::PlumageRender()
prepareUniformBuffers(); prepareUniformBuffers();
setupDescriptors(); setupDescriptors();
preparePipelines(); preparePipelines();
if (!settings.headless)
gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, settings.sampleCount); {
updateUIOverlay(); gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, settings.sampleCount);
updateUIOverlay();
}
buildCommandBuffers(); buildCommandBuffers();
@ -1618,7 +1629,7 @@ PlumageRender::PlumageRender()
// Source for the copy is the last rendered swapchain image // Source for the copy is the last rendered swapchain image
VkImage srcImage = swapChain.images[currentBuffer]; VkImage srcImage = swapChain.images[currentBuffer];
// Create the linear tiled destination image to copy to and to read the memory from // Create the linear tiled destination image to copy to and to read the memory from
VkImageCreateInfo imageCreateCI(vks::initializers::imageCreateInfo()); VkImageCreateInfo imageCreateCI(vks::initializers::imageCreateInfo());
imageCreateCI.imageType = VK_IMAGE_TYPE_2D; imageCreateCI.imageType = VK_IMAGE_TYPE_2D;
@ -1668,6 +1679,7 @@ PlumageRender::PlumageRender()
srcImage, srcImage,
VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_MEMORY_READ_BIT,
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT,
//VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
@ -1732,17 +1744,20 @@ PlumageRender::PlumageRender()
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 });
// Transition back the swap chain image after the blit is done if (!settings.headless)
vks::tools::insertImageMemoryBarrier( {
copyCmd, // Transition back the swap chain image after the blit is done
srcImage, vks::tools::insertImageMemoryBarrier(
VK_ACCESS_TRANSFER_READ_BIT, copyCmd,
VK_ACCESS_MEMORY_READ_BIT, srcImage,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_ACCESS_MEMORY_READ_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 });
}
vulkanDevice->flushCommandBuffer(copyCmd, queue); 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() void PlumageRender::render()
{ {
@ -1959,15 +1958,19 @@ PlumageRender::PlumageRender()
return; return;
} }
updateUIOverlay(); if (!settings.headless)
{
updateUIOverlay();
}
//加入写到文件的函数 //加入写到文件的函数
//swapChainImage = swapChain.images[frameIndex]; //swapChainImage = swapChain.images[frameIndex];
//outputImageSequeue(swapChainImage,filePath.imageSequenceFilePath); //outputImageSequeue(swapChainImage,filePath.imageSequenceFilePath);
VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[frameIndex], VK_TRUE, UINT64_MAX));
outputImageSequence(); outputImageSequence();
VK_CHECK_RESULT(vkWaitForFences(device, 1, &waitFences[frameIndex], VK_TRUE, UINT64_MAX));
imageSequenceToVideo(); imageSequenceToVideo();
VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[frameIndex])); VK_CHECK_RESULT(vkResetFences(device, 1, &waitFences[frameIndex]));
@ -1981,6 +1984,7 @@ PlumageRender::PlumageRender()
} }
// Update UBOs // Update UBOs
updateUniformBuffers(); updateUniformBuffers();
UniformBufferSet currentUB = uniformBuffers[currentBuffer]; UniformBufferSet currentUB = uniformBuffers[currentBuffer];
@ -2001,6 +2005,7 @@ PlumageRender::PlumageRender()
VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, waitFences[frameIndex])); VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, waitFences[frameIndex]));
//显示队列 //显示队列
VkResult present = swapChain.queuePresent(queue, currentBuffer, renderCompleteSemaphores[frameIndex]); VkResult present = swapChain.queuePresent(queue, currentBuffer, renderCompleteSemaphores[frameIndex]);
if (!((present == VK_SUCCESS) || (present == VK_SUBOPTIMAL_KHR))) { if (!((present == VK_SUCCESS) || (present == VK_SUBOPTIMAL_KHR))) {
if (present == VK_ERROR_OUT_OF_DATE_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]); }; for (int32_t i = 0; i < __argc; i++) { PlumageRender::args.push_back(__argv[i]); };
plumageRender = new PlumageRender(); plumageRender = new PlumageRender();
plumageRender->initVulkan(); plumageRender->initVulkan();
plumageRender->setupWindow(hInstance, WndProc); if (!PlumageRender::settings.headless)
{
plumageRender->setupWindow(hInstance, WndProc);
}
plumageRender->prepare(); plumageRender->prepare();
plumageRender->renderLoop(); plumageRender->renderLoop();
delete(plumageRender); delete(plumageRender);

View File

@ -365,7 +365,7 @@ public:
void imageSequenceToVideo(); void imageSequenceToVideo();
void removeImageSequence(); void removeImageSequence();
//void outputScreenShot(); //void outputScreenShot();
uint32_t getMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties); //uint32_t getMemoryTypeIndex(uint32_t typeBits, VkMemoryPropertyFlags properties);
virtual void render(); virtual void render();
virtual void updateUIOverlay(); virtual void updateUIOverlay();
virtual void fileDropped(std::string filename); virtual void fileDropped(std::string filename);