准备摘头
parent
6244917553
commit
91b3fa0a03
|
@ -699,6 +699,7 @@ void VulkanExampleBase::initVulkan()
|
||||||
|
|
||||||
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)
|
||||||
androidProduct = "";
|
androidProduct = "";
|
||||||
|
@ -1962,6 +1963,7 @@ void VulkanExampleBase::setupFrameBuffer()
|
||||||
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);
|
||||||
|
|
|
@ -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; // 垂直同步开关
|
||||||
|
|
|
@ -183,7 +183,11 @@ PlumageRender::PlumageRender()
|
||||||
}
|
}
|
||||||
|
|
||||||
// User interface
|
// User interface
|
||||||
|
if (!settings.headless)
|
||||||
|
{
|
||||||
gui->draw(currentCB);
|
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) {
|
for (auto& semaphore : presentCompleteSemaphores) {
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// 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);
|
gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, settings.sampleCount);
|
||||||
updateUIOverlay();
|
updateUIOverlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
buildCommandBuffers();
|
buildCommandBuffers();
|
||||||
|
|
||||||
|
@ -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,6 +1744,8 @@ 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 });
|
||||||
|
|
||||||
|
if (!settings.headless)
|
||||||
|
{
|
||||||
// Transition back the swap chain image after the blit is done
|
// Transition back the swap chain image after the blit is done
|
||||||
vks::tools::insertImageMemoryBarrier(
|
vks::tools::insertImageMemoryBarrier(
|
||||||
copyCmd,
|
copyCmd,
|
||||||
|
@ -1743,6 +1757,7 @@ PlumageRender::PlumageRender()
|
||||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||||
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 });
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!settings.headless)
|
||||||
|
{
|
||||||
updateUIOverlay();
|
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();
|
||||||
|
if (!PlumageRender::settings.headless)
|
||||||
|
{
|
||||||
plumageRender->setupWindow(hInstance, WndProc);
|
plumageRender->setupWindow(hInstance, WndProc);
|
||||||
|
}
|
||||||
plumageRender->prepare();
|
plumageRender->prepare();
|
||||||
plumageRender->renderLoop();
|
plumageRender->renderLoop();
|
||||||
delete(plumageRender);
|
delete(plumageRender);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue