global update
This commit is contained in:
@@ -45,9 +45,6 @@ struct VulkanWindow_t
|
||||
VkSurfaceKHR m_surface;
|
||||
VkSwapchainKHR m_swapchain;
|
||||
VkFormat m_eFormat;
|
||||
VkFence m_fences[FRAMES_IN_FLIGHT];
|
||||
VkSemaphore m_imageAvailable[FRAMES_IN_FLIGHT];
|
||||
VkSemaphore m_renderFinished[FRAMES_IN_FLIGHT];
|
||||
CUtlVector<IImage*> m_images;
|
||||
uint32_t m_uCurrentFrame;
|
||||
};
|
||||
@@ -58,21 +55,13 @@ CVkImage::CVkImage()
|
||||
|
||||
}
|
||||
|
||||
CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlagBits eUsage )
|
||||
CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFormat eFormat, EMultisampleType eMultisampleType, EImageType eImageType, VkImageUsageFlags eUsage )
|
||||
{
|
||||
m_nWidth = nWidth;
|
||||
m_nHeight = nHeight;
|
||||
m_eMultisampleType = eMultisampleType;
|
||||
m_eImageType = eImageType;
|
||||
m_eFormat = eFormat;
|
||||
if (eFormat == IMAGE_FORMAT_D32_SFLOAT)
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
else
|
||||
if (eUsage == VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
else
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage);
|
||||
CreateImageView();
|
||||
}
|
||||
@@ -186,7 +175,7 @@ VkSampleCountFlagBits CVkImage::GetMultisampling( enum EMultisampleType eImageFo
|
||||
}
|
||||
}
|
||||
|
||||
void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlagBits eUsage )
|
||||
void CVkImage::CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType, VkImageUsageFlags eUsage )
|
||||
{
|
||||
VkImageCreateInfo stCreateInfo = {};
|
||||
VmaAllocationCreateInfo stAlloc = {};
|
||||
@@ -233,7 +222,13 @@ void CVkImage::CreateImageView()
|
||||
}
|
||||
void CVkImage::SetDebugName( const char *szName )
|
||||
{
|
||||
VkDebugUtilsObjectNameInfoEXT nameInfo = {};
|
||||
nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
|
||||
nameInfo.objectType = VK_OBJECT_TYPE_IMAGE;
|
||||
nameInfo.objectHandle = (uint64_t)m_image;
|
||||
nameInfo.pObjectName = szName;
|
||||
|
||||
vkSetDebugUtilsObjectNameEXT(s_vkDevice, &nameInfo);
|
||||
}
|
||||
|
||||
|
||||
@@ -421,12 +416,21 @@ uint32_t CVkTextureArray::CreateTexture( uint32_t i, const char *szPath )
|
||||
stbi_image_free(pImg);
|
||||
|
||||
|
||||
CVkLayoutBarrierCommand *pBarrierCommand = NULL;
|
||||
CVkCopyBufferToImageCommand *pCopyCommand = NULL;
|
||||
|
||||
IVkCommandBuffer *pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
|
||||
pCommandBuffer->Reset();
|
||||
|
||||
pBarrierCommand = CREATE_COMMAND(m_pCommandBufferManager, LayoutBarrier);
|
||||
pBarrierCommand->pImage = pImage;
|
||||
pBarrierCommand->eHazard = 0;
|
||||
pBarrierCommand->eStageIn = STAGE_HAZARD_NONE;
|
||||
pBarrierCommand->eStageOut = STAGE_HAZARD_TRANSFER;
|
||||
pBarrierCommand->eLayoutIn = IMAGE_LAYOUT_UNDEFINED;
|
||||
pBarrierCommand->eLayoutOut = IMAGE_LAYOUT_TRANSFER_DST;
|
||||
pCommandBuffer->AddCommand(pBarrierCommand);
|
||||
pCopyCommand = CREATE_COMMAND(m_pCommandBufferManager, CopyBufferToImage);
|
||||
pCopyCommand->AddDependency((IRenderingObject*)pBuffer, DEPENDENCY_MODE_BUFFER_SOURCE);
|
||||
pCopyCommand->AddDependency((IRenderingObject*)pImage, DEPENDENCY_MODE_IMAGE_DESTINATION);
|
||||
pCopyCommand->pBuffer = pBuffer;
|
||||
pCopyCommand->stOutputImage.m_eObjectType = FRAME_OBJECT_TYPE_SINGLE;
|
||||
pCopyCommand->stOutputImage.m_pSingle = pImage;
|
||||
@@ -502,7 +506,7 @@ public:
|
||||
virtual void *GetVulkanInstance() override;
|
||||
virtual void *GetVulkanPhysicalDevice() override;
|
||||
virtual void *GetVulkanDevice() override;
|
||||
virtual IImage *CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
|
||||
virtual IImage *CreateImageFromVkImage( uint64_t pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType ) override;
|
||||
private:
|
||||
VkPhysicalDevice SelectPhysicalDevice( CUtlVector<VkPhysicalDevice> physicalDevices );
|
||||
CUtlVector<const char *> GetDeviceExtensions();
|
||||
@@ -593,14 +597,13 @@ IBuffer *CVkRenderContext::CreateBufferAligned( uint32_t nSize, uint32_t nAlignm
|
||||
IImage *CVkRenderContext::CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType )
|
||||
{
|
||||
if (eFormat == IMAGE_FORMAT_D32_SFLOAT)
|
||||
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
|
||||
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
else
|
||||
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
|
||||
return new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
}
|
||||
IImage *CVkRenderContext::CreateTexture( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType )
|
||||
{
|
||||
CVkImage *pImage = new CVkImage(x, y, 1, eFormat, eMultisampleType, IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT);
|
||||
pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
return pImage;
|
||||
}
|
||||
|
||||
@@ -734,7 +737,7 @@ void *CVkRenderContext::GetVulkanDevice()
|
||||
return s_vkDevice;
|
||||
}
|
||||
|
||||
IImage *CVkRenderContext::CreateImageFromVkImage( void *pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType )
|
||||
IImage *CVkRenderContext::CreateImageFromVkImage( uint64_t pVkImage, uint32_t x, uint32_t y, uint64_t optimalLayout, EImageFormat eFormat, EMultisampleType eMultisampleType )
|
||||
{
|
||||
CVkImage *pImage;
|
||||
pImage = new CVkImage;
|
||||
@@ -744,7 +747,6 @@ IImage *CVkRenderContext::CreateImageFromVkImage( void *pVkImage, uint32_t x, ui
|
||||
pImage->m_eFormat = eFormat;
|
||||
pImage->m_nHeight = x;
|
||||
pImage->m_nWidth = y;
|
||||
pImage->m_ePreferredLayout = (VkImageLayout)optimalLayout;
|
||||
pImage->CreateImageView();
|
||||
return pImage;
|
||||
}
|
||||
@@ -798,6 +800,7 @@ void CVkRenderContext::Init()
|
||||
stInstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||
stInstanceCreateInfo.pApplicationInfo = &stApplicationInfo;
|
||||
enabledInstanceExtensions.AppendTail(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
|
||||
enabledInstanceExtensions.AppendTail(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
stInstanceCreateInfo.enabledExtensionCount = enabledInstanceExtensions.GetSize();
|
||||
stInstanceCreateInfo.ppEnabledExtensionNames = enabledInstanceExtensions.GetData();
|
||||
|
||||
@@ -862,6 +865,7 @@ void CVkRenderContext::Init()
|
||||
vk12Features.runtimeDescriptorArray = VK_TRUE;
|
||||
vk12Features.descriptorBindingPartiallyBound = VK_TRUE;
|
||||
vk12Features.descriptorBindingVariableDescriptorCount = VK_TRUE;
|
||||
vk12Features.timelineSemaphore = VK_TRUE;
|
||||
VkPhysicalDeviceVulkan11Features vk11Features = {};
|
||||
vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
|
||||
vk11Features.pNext = &vk12Features;
|
||||
@@ -925,13 +929,10 @@ void CVkRenderContext::Init()
|
||||
vkCreateSampler(s_vkDevice, &samplerInfo, nullptr, &m_defaultSampler.m_sampler);
|
||||
}
|
||||
|
||||
#include "time.h"
|
||||
void CVkRenderContext::Frame( float fDeltaTime )
|
||||
{
|
||||
|
||||
uint32_t i;
|
||||
CUtlVector<VkFence> fences = {};
|
||||
CUtlVector<VkSemaphore> imageReady = {};
|
||||
CUtlVector<VkSemaphore> renderFinish = {};
|
||||
CUtlVector<VkSwapchainKHR> swapchains = {};
|
||||
CUtlVector<uint32_t> uImageIndexes = {};
|
||||
CUtlVector<uint32_t> uSwapchainImageIndexes = {};
|
||||
@@ -961,24 +962,25 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
|
||||
for ( auto &s: m_renderWindows)
|
||||
{
|
||||
fences.AppendTail(s.m_fences[s.m_uCurrentFrame]);
|
||||
imageReady.AppendTail(s.m_imageAvailable[s.m_uCurrentFrame]);
|
||||
renderFinish.AppendTail(s.m_renderFinished[s.m_uCurrentFrame]);
|
||||
swapchains.AppendTail(s.m_swapchain);
|
||||
uImageIndexes.AppendTail(s.m_uCurrentFrame);
|
||||
}
|
||||
uSwapchainImageIndexes.Resize(m_renderWindows.GetSize());
|
||||
|
||||
|
||||
vkWaitForFences(s_vkDevice, fences.GetSize(), fences.GetData(), VK_TRUE, UINT64_MAX);
|
||||
vkResetFences(s_vkDevice, fences.GetSize(), fences.GetData());
|
||||
|
||||
VkFence fence;
|
||||
VkFenceCreateInfo fci = {};
|
||||
fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||
fci.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||
vkCreateFence(s_vkDevice, &fci, NULL, &fence);
|
||||
i = 0;
|
||||
for ( auto &s: m_renderWindows )
|
||||
{
|
||||
VkResult r = vkAcquireNextImageKHR(s_vkDevice, s.m_swapchain, UINT64_MAX, s.m_imageAvailable[s.m_uCurrentFrame], NULL, &uSwapchainImageIndexes[i]);
|
||||
vkResetFences(s_vkDevice, 1, &fence);
|
||||
VkResult r = vkAcquireNextImageKHR(s_vkDevice, s.m_swapchain, UINT64_MAX, NULL, fence, &uSwapchainImageIndexes[i]);
|
||||
vkWaitForFences(s_vkDevice, 1, &fence, true, UINT64_MAX);
|
||||
i++;
|
||||
}
|
||||
vkDestroyFence(s_vkDevice, fence, 0);
|
||||
|
||||
if (m_pXRManager)
|
||||
m_pXRManager->PreRender();
|
||||
@@ -987,13 +989,11 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
pList->StartRecording();
|
||||
|
||||
|
||||
double a = Plat_GetTime();
|
||||
i = 0;
|
||||
for ( auto &s: m_renderWindows )
|
||||
{
|
||||
|
||||
|
||||
CVkBlitCommand *pBlitCommand = NULL;
|
||||
if (s.m_pWindow->GetOutputImage())
|
||||
{
|
||||
|
||||
@@ -1007,7 +1007,23 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
dst.m_iHeight = s.m_pWindow->GetRenderHeight();
|
||||
dst.m_iX = 0;
|
||||
dst.m_iY = 0;
|
||||
pList->BarrierTransition(
|
||||
s.m_pWindow->GetOutputImage(),
|
||||
IMAGE_LAYOUT_GENERAL, IMAGE_LAYOUT_TRANSFER_SRC,
|
||||
STAGE_HAZARD_NONE, STAGE_HAZARD_TRANSFER, 0);
|
||||
pList->BarrierTransition(
|
||||
s.m_images[uSwapchainImageIndexes[i]],
|
||||
IMAGE_LAYOUT_UNDEFINED, IMAGE_LAYOUT_TRANSFER_DST,
|
||||
STAGE_HAZARD_NONE, STAGE_HAZARD_TRANSFER, 0);
|
||||
pList->BlitImageToImage(s.m_pWindow->GetOutputImage(), src, s.m_images[uSwapchainImageIndexes[i]], dst);
|
||||
pList->BarrierTransition(
|
||||
s.m_pWindow->GetOutputImage(),
|
||||
IMAGE_LAYOUT_TRANSFER_SRC, IMAGE_LAYOUT_GENERAL,
|
||||
STAGE_HAZARD_TRANSFER, STAGE_HAZARD_NONE, 0);
|
||||
pList->BarrierTransition(
|
||||
s.m_images[uSwapchainImageIndexes[i]],
|
||||
IMAGE_LAYOUT_TRANSFER_DST, IMAGE_LAYOUT_PRESENT,
|
||||
STAGE_HAZARD_TRANSFER, STAGE_HAZARD_NONE, 0);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
@@ -1017,34 +1033,54 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
|
||||
if (m_pXRManager)
|
||||
m_pXRManager->CopySwapchain();
|
||||
VkSemaphoreTypeCreateInfo timelineInfo = {};
|
||||
timelineInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO;
|
||||
timelineInfo.pNext = NULL;
|
||||
timelineInfo.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE;
|
||||
timelineInfo.initialValue = 0;
|
||||
|
||||
VkSemaphoreCreateInfo semaphore_ci = {};
|
||||
semaphore_ci.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||
semaphore_ci.pNext = &timelineInfo;
|
||||
VkSemaphore semaphore = {};
|
||||
vkCreateSemaphore(s_vkDevice, &semaphore_ci, NULL, &semaphore);
|
||||
|
||||
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||
VkSubmitInfo stSubmitInfo = {};
|
||||
stSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||
stSubmitInfo.waitSemaphoreCount = imageReady.GetSize();
|
||||
stSubmitInfo.pWaitSemaphores = imageReady.GetData();
|
||||
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
|
||||
|
||||
stSubmitInfo.commandBufferCount = m_pCommandBufferManager->GetVulkanCommands().GetSize();
|
||||
stSubmitInfo.pCommandBuffers = m_pCommandBufferManager->GetVulkanCommands().GetData();
|
||||
|
||||
stSubmitInfo.signalSemaphoreCount = renderFinish.GetSize();
|
||||
stSubmitInfo.pSignalSemaphores = renderFinish.GetData();
|
||||
stSubmitInfo.signalSemaphoreCount = 1;
|
||||
stSubmitInfo.pSignalSemaphores = &semaphore;
|
||||
|
||||
const uint64_t v = 1;
|
||||
VkTimelineSemaphoreSubmitInfo tssi = {};
|
||||
tssi.sType = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO;
|
||||
tssi.signalSemaphoreValueCount = 1;
|
||||
tssi.pSignalSemaphoreValues = &v;
|
||||
stSubmitInfo.pNext = &tssi;
|
||||
|
||||
vkQueueSubmit(s_vkDrawQueue, 1, &stSubmitInfo, fences[0]);
|
||||
double a = Plat_GetTime();
|
||||
vkQueueSubmit(s_vkDrawQueue, 1, &stSubmitInfo, 0);
|
||||
VkSemaphoreWaitInfo wi = {};
|
||||
wi.sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO;
|
||||
wi.semaphoreCount = 1;
|
||||
wi.pSemaphores = &semaphore;
|
||||
wi.pValues = &v;
|
||||
vkWaitSemaphores(s_vkDevice, &wi, UINT64_MAX);
|
||||
|
||||
VkPresentInfoKHR stPresentInfo = {};
|
||||
stPresentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||
stPresentInfo.waitSemaphoreCount = renderFinish.GetSize();
|
||||
stPresentInfo.pWaitSemaphores = renderFinish.GetData();
|
||||
stPresentInfo.swapchainCount = swapchains.GetSize();
|
||||
stPresentInfo.pSwapchains = swapchains.GetData();
|
||||
stPresentInfo.pImageIndices = uImageIndexes.GetData();
|
||||
|
||||
vkQueuePresentKHR(s_vkPresentQueue, &stPresentInfo);
|
||||
vkDeviceWaitIdle(s_vkDevice);
|
||||
vkDestroySemaphore(s_vkDevice, semaphore, NULL);
|
||||
if (m_pXRManager)
|
||||
m_pXRManager->PostRender();
|
||||
|
||||
@@ -1116,6 +1152,7 @@ VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )
|
||||
|
||||
for (auto &format: surfaceFormats)
|
||||
{
|
||||
|
||||
for (int i = 0; i < sizeof(preferedSurfaceFormats)/sizeof(VkFormat); i++)
|
||||
{
|
||||
if (format.format == preferedSurfaceFormats[i])
|
||||
@@ -1126,6 +1163,7 @@ VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )
|
||||
}
|
||||
}
|
||||
formatPicked:
|
||||
V_printf("Surface format: %s\n", string_VkFormat(stSelectedFormat.format));
|
||||
|
||||
vkGetPhysicalDeviceSurfacePresentModesKHR(s_vkPhysicalDevice, window.m_surface, &nSurfacePresentModes, NULL);
|
||||
surfacePresentModes.Resize(nSurfacePresentModes);
|
||||
@@ -1165,20 +1203,9 @@ formatPicked:
|
||||
pImage->m_eFormat = IMAGE_FORMAT_BGRA8_UNORM;
|
||||
pImage->m_nHeight = pWindow->GetRenderWidth();
|
||||
pImage->m_nWidth = pWindow->GetRenderHeight();
|
||||
pImage->m_ePreferredLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||
pImage->CreateImageView();
|
||||
window.m_images[i] = pImage;
|
||||
}
|
||||
for ( int i = 0; i < FRAMES_IN_FLIGHT; i++ )
|
||||
{
|
||||
stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||
stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||
vkCreateFence(s_vkDevice, &stFenceCreateInfo, NULL, &window.m_fences[i]);
|
||||
|
||||
stSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||
vkCreateSemaphore(s_vkDevice, &stSemaphoreCreateInfo, NULL, &window.m_imageAvailable[i]);
|
||||
vkCreateSemaphore(s_vkDevice, &stSemaphoreCreateInfo, NULL, &window.m_renderFinished[i]);
|
||||
}
|
||||
|
||||
window.m_pWindow = pWindow;
|
||||
return window;
|
||||
@@ -1193,12 +1220,6 @@ void CVkRenderContext::DestroySwapchain( uint32_t uIndex )
|
||||
}
|
||||
vkDestroySwapchainKHR(s_vkDevice, m_renderWindows[uIndex].m_swapchain, NULL);
|
||||
m_renderWindows[uIndex].m_pWindow->DestroyVulkanSurface(s_vkInstance);
|
||||
for ( int i = 0; i < FRAMES_IN_FLIGHT; i++ )
|
||||
{
|
||||
vkDestroyFence(s_vkDevice, m_renderWindows[uIndex].m_fences[i], NULL);
|
||||
vkDestroySemaphore(s_vkDevice, m_renderWindows[uIndex].m_imageAvailable[i], NULL);
|
||||
vkDestroySemaphore(s_vkDevice, m_renderWindows[uIndex].m_renderFinished[i], NULL);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user