added renderpass manager
This commit is contained in:
@@ -16,8 +16,6 @@ class CAndroidDirectoryHandle: public IDirectoryHandle
|
||||
public:
|
||||
};
|
||||
|
||||
#include "android/log.h"
|
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "funnygame", __VA_ARGS__)
|
||||
extern struct android_app *g_android_app;
|
||||
class CAndroidFileSystem : public IFileSystem
|
||||
{
|
||||
@@ -29,7 +27,6 @@ public:
|
||||
|
||||
virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override
|
||||
{
|
||||
LOGI("Opening file: %s", szFileName);
|
||||
FILE *pFile;
|
||||
CAndroidFileHandle *pHandle = NULL;
|
||||
|
||||
@@ -44,7 +41,6 @@ public:
|
||||
pHandle = new CAndroidFileHandle;
|
||||
pHandle->m_pFileSystem = this;
|
||||
pHandle->m_pFile = AAssetManager_open(g_android_app->activity->assetManager, szFileName, AASSET_MODE_RANDOM);
|
||||
LOGI("Opened file: %p", pHandle->m_pFile);
|
||||
pHandle->m_nSize = AAsset_getLength64(pHandle->m_pFile);
|
||||
return pHandle;
|
||||
}
|
||||
|
||||
@@ -336,6 +336,7 @@ void CKotUIBuffer::Draw( IImage *pImage )
|
||||
|
||||
pList->EndRecording();
|
||||
m_pRenderContext->SubmitCommandList(pList);
|
||||
m_pRenderContext->DestroyCommandList(pList);
|
||||
m_pRenderContext->DestroyBuffer(pScreenBuffer);
|
||||
|
||||
}
|
||||
|
||||
@@ -85,9 +85,9 @@ void CClientGameBridge::Init()
|
||||
g_pKotUI->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
g_pKotUI->Init();
|
||||
|
||||
//g_pXRManager->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
//g_pXRManager->Init();
|
||||
//g_pRenderContext->ConnectInterface(g_pXRManager, XR_INTERFACE_VERSION);
|
||||
g_pXRManager->ConnectInterface(g_pRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
g_pXRManager->Init();
|
||||
g_pRenderContext->ConnectInterface(g_pXRManager, XR_INTERFACE_VERSION);
|
||||
|
||||
|
||||
g_pWorldRenderer->Init();
|
||||
@@ -96,7 +96,6 @@ void CClientGameBridge::Init()
|
||||
m_pMainViewport->SetPosition({0,0,0});
|
||||
m_pMainViewport->SetRotation({0,0,0,1});
|
||||
|
||||
/*
|
||||
IXRHeadset *pHeadSet = g_pXRManager->GetHeadset(0);
|
||||
if (pHeadSet)
|
||||
{
|
||||
@@ -118,7 +117,6 @@ void CClientGameBridge::Init()
|
||||
pHeadSet->GetController(i)->SetInputCallback(XRInputCallback);
|
||||
V_printf("callback set on %p\n", pHeadSet->GetController(i));
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void CClientGameBridge::Tick( float fDelta )
|
||||
@@ -168,7 +166,7 @@ void CClientGameBridge::Frame( float fDelta )
|
||||
TryToConnectToServer();
|
||||
|
||||
|
||||
//g_pXRManager->Frame();
|
||||
g_pXRManager->Frame();
|
||||
|
||||
INetworkBase *pCurrentServer = g_pServerBridge;
|
||||
pCurrentServer = g_pServerBridge;
|
||||
|
||||
@@ -32,6 +32,7 @@ CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
|
||||
"vulkan/commands/transfer.cpp",
|
||||
"vulkan/commands/base.cpp",
|
||||
"vulkan/libraries/raster.cpp",
|
||||
"vulkan/renderpassmgr.cpp",
|
||||
EXTERNAL"volk/volk.c",
|
||||
"stb.c",
|
||||
};
|
||||
|
||||
@@ -179,7 +179,6 @@ void CAndroidGameWindowManager::Frame( float fDelta )
|
||||
while (ALooper_pollOnce(0, nullptr, &events, (void**)&source) >= 0) {
|
||||
if (source) source->process(g_android_app, source);
|
||||
}
|
||||
LOGI("%u %u", m_window.m_uRenderWidth, m_window.m_uRenderHeight);
|
||||
uint32_t uNewWidth = ANativeWindow_getWidth(g_android_app->window);
|
||||
uint32_t uNewHeight = ANativeWindow_getHeight(g_android_app->window);
|
||||
if (m_window.m_uRenderWidth != uNewWidth || m_window.m_uRenderHeight != uNewHeight)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "tier1/utlvector.h"
|
||||
#include "vulkan_state.h"
|
||||
#include "renderpassmgr.h"
|
||||
|
||||
BEGIN_VULKAN_COMMAND(Empty)
|
||||
END_VULKAN_COMMAND()
|
||||
@@ -36,12 +37,10 @@ BEGIN_VULKAN_COMMAND(Begin)
|
||||
bool bDepthEnabled = {};
|
||||
uint32_t nResolutionX = 0;
|
||||
uint32_t nResolutionY = 0;
|
||||
VkRenderPass hRenderPass;
|
||||
VkFramebuffer hFrameBuffer;
|
||||
CRenderPassMgr *pMgr;
|
||||
END_VULKAN_COMMAND()
|
||||
|
||||
BEGIN_VULKAN_COMMAND(End)
|
||||
CVkBeginCommand *pBeginCommand;
|
||||
END_VULKAN_COMMAND()
|
||||
|
||||
BEGIN_VULKAN_COMMAND(SetVertexBuffer)
|
||||
|
||||
@@ -23,9 +23,6 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
{
|
||||
if (vkCmdBeginRendering || vkCmdBeginRenderingKHR)
|
||||
{
|
||||
V_printf("USING DYNAMIC RENDERING\n");
|
||||
V_printf("%p\n", vkCmdBeginRendering);
|
||||
V_printf("%p\n", vkCmdBeginRenderingKHR);
|
||||
VkRenderingInfo stRenderingInfo = {};
|
||||
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
|
||||
VkRenderingAttachmentInfo depthAttachment = {};
|
||||
@@ -78,98 +75,42 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
}
|
||||
else
|
||||
{
|
||||
V_printf("USING RENDERPASS");
|
||||
CUtlVector<VkAttachmentDescription> attachments = {};
|
||||
CUtlVector<VkAttachmentReference> input_refs = {};
|
||||
CUtlVector<VkImageView> image_views = {};
|
||||
CUtlVector<VkClearValue> colors = {};
|
||||
attachments.Resize(images.GetSize());
|
||||
input_refs.Resize(images.GetSize());
|
||||
image_views.Resize(images.GetSize());
|
||||
colors.Resize(images.GetSize());
|
||||
uint32_t i = 0;
|
||||
|
||||
for (auto f: images)
|
||||
CUtlVector<RenderImage> imgs = {};
|
||||
for (auto &a: images)
|
||||
{
|
||||
VkAttachmentDescription a = {};
|
||||
a.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
a.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
a.format = CVkImage::GetImageFormat(
|
||||
((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_eFormat);
|
||||
a.samples = CVkImage::GetMultisampling(
|
||||
((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_eMultisampleType);
|
||||
switch( f.m_eLoadMode )
|
||||
{
|
||||
case LOAD_MODE_DONT_CARE:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||
break;
|
||||
case LOAD_MODE_LOAD:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||
break;
|
||||
case LOAD_MODE_CLEAR:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
colors[i].color.float32[0] = f.m_fClearColor[0];
|
||||
colors[i].color.float32[1] = f.m_fClearColor[1];
|
||||
colors[i].color.float32[2] = f.m_fClearColor[2];
|
||||
colors[i].color.float32[3] = f.m_fClearColor[3];
|
||||
break;
|
||||
}
|
||||
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
attachments[i] = a;
|
||||
|
||||
VkAttachmentReference ref = {};
|
||||
ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
ref.attachment = i;
|
||||
input_refs[i] = ref;
|
||||
|
||||
image_views[i] = ((CVkImage*)VulkanGetObject(f.m_stImage, iCurrentFrame))->m_imageView;
|
||||
i++;
|
||||
|
||||
RenderImage ri = {};
|
||||
ri.pImage = (IImage*)a.m_stImage.m_pSingle;
|
||||
ri.eLoadMode = a.m_eLoadMode;
|
||||
ri.eStoreMode = a.m_eStoreMode;
|
||||
VkClearValue ci = {};
|
||||
ci.color.float32[0] = a.m_fClearColor[0];
|
||||
ci.color.float32[1] = a.m_fClearColor[1];
|
||||
ci.color.float32[2] = a.m_fClearColor[2];
|
||||
ci.color.float32[3] = a.m_fClearColor[3];
|
||||
colors.AppendTail(ci);
|
||||
imgs.AppendTail(ri);
|
||||
}
|
||||
RenderImage depth = {};
|
||||
depth.pImage = (IImage*)stDepthImage.m_stImage.m_pSingle;
|
||||
depth.eLoadMode = stDepthImage.m_eLoadMode;
|
||||
depth.eStoreMode = stDepthImage.m_eStoreMode;
|
||||
BeginInfo bi = {};
|
||||
bi.uRenderImageCount = imgs.GetSize();
|
||||
bi.pRenderImages = imgs.GetData();
|
||||
bi.uWidth = nResolutionX;
|
||||
bi.uHeight = nResolutionY;
|
||||
if (bDepthEnabled)
|
||||
{
|
||||
CVkImage *depth = (CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame);
|
||||
VkAttachmentDescription desc = {};
|
||||
desc.format = CVkImage::GetImageFormat(depth->m_eFormat);
|
||||
desc.samples = CVkImage::GetMultisampling(depth->m_eMultisampleType);
|
||||
desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
attachments.AppendTail(desc);
|
||||
VkClearValue val = {};
|
||||
val.depthStencil.depth = stDepthImage.m_fClearDepth;
|
||||
colors.AppendTail(val);
|
||||
image_views.AppendTail(depth->m_imageView);
|
||||
bi.pDepth = &depth;
|
||||
VkClearValue ci = {};
|
||||
ci.depthStencil.depth = stDepthImage.m_fClearDepth;
|
||||
colors.AppendTail(ci);
|
||||
}
|
||||
VkAttachmentReference depthRef;
|
||||
depthRef.attachment = attachments.GetSize() - 1;
|
||||
depthRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
VkSubpassDescription subpass = {};
|
||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||
subpass.colorAttachmentCount = input_refs.GetSize();
|
||||
subpass.pColorAttachments = input_refs.GetData();
|
||||
if (bDepthEnabled)
|
||||
{
|
||||
subpass.pDepthStencilAttachment = &depthRef;
|
||||
}
|
||||
VkRenderPassCreateInfo rpci = {};
|
||||
rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||
rpci.attachmentCount = attachments.GetSize();
|
||||
rpci.pAttachments = attachments.GetData();
|
||||
rpci.subpassCount = 1;
|
||||
rpci.pSubpasses = &subpass;
|
||||
vkCreateRenderPass(hDevice, &rpci, NULL, &hRenderPass);
|
||||
VkRenderPass hRenderPass;
|
||||
VkFramebuffer hFrameBuffer;
|
||||
pMgr->CreateRenderPass(&bi, &hRenderPass, &hFrameBuffer);
|
||||
|
||||
VkFramebufferCreateInfo fbci = {};
|
||||
fbci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||
fbci.renderPass = hRenderPass;
|
||||
fbci.attachmentCount = image_views.GetSize();
|
||||
fbci.pAttachments = image_views.GetData();
|
||||
fbci.width = nResolutionX;
|
||||
fbci.height = nResolutionY;
|
||||
fbci.layers = 1;
|
||||
vkCreateFramebuffer(hDevice, &fbci, NULL, &hFrameBuffer);
|
||||
VkRenderPassBeginInfo rpbi = {};
|
||||
rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||
rpbi.renderPass = hRenderPass;
|
||||
@@ -190,7 +131,6 @@ DECLARE_VULKAN_COMMAND(End)
|
||||
else
|
||||
{
|
||||
vkCmdEndRenderPass(hCommandBuffer);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ void CVkRenderCommandList::Begin( BeginInfo *pBegin )
|
||||
images.AppendTail(output);
|
||||
}
|
||||
pBeginCommand->images = images;
|
||||
pBeginCommand->pMgr = m_pRenderPassMgr;
|
||||
if ( pBegin->pDepth )
|
||||
{
|
||||
VulkanRenderOutput_t output = {};
|
||||
@@ -50,7 +51,6 @@ void CVkRenderCommandList::Begin( BeginInfo *pBegin )
|
||||
void CVkRenderCommandList::End()
|
||||
{
|
||||
CVkEndCommand *pEndCommand = CREATE_COMMAND(m_pCommandBufferManager, End);
|
||||
pEndCommand->pBeginCommand = (CVkBeginCommand*)m_pCurrentBegin;
|
||||
m_pCommandBuffer->AddCommand(pEndCommand);
|
||||
}
|
||||
|
||||
@@ -181,6 +181,7 @@ void CVkRenderCommandList::ResolveImage( IImage *pOriginal, IImage *pResolved )
|
||||
|
||||
void CVkRenderCommandList::StartRecording()
|
||||
{
|
||||
if (m_pCommandBuffer == NULL)
|
||||
m_pCommandBuffer = m_pCommandBufferManager->CreateCommandBuffer();
|
||||
m_pCommandBuffer->Reset();
|
||||
}
|
||||
|
||||
@@ -156,8 +156,9 @@ VkFormat CVkImage::GetImageFormat( enum EImageFormat eImageFormat )
|
||||
|
||||
case IMAGE_FORMAT_D32_SFLOAT:
|
||||
return VK_FORMAT_D32_SFLOAT;
|
||||
}
|
||||
default:
|
||||
return VK_FORMAT_UNDEFINED;
|
||||
}
|
||||
}
|
||||
|
||||
VkSampleCountFlagBits CVkImage::GetMultisampling( enum EMultisampleType eImageFormat )
|
||||
@@ -514,6 +515,7 @@ public:
|
||||
virtual void *GetVulkanPhysicalDevice() override;
|
||||
virtual void *GetVulkanDevice() 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();
|
||||
@@ -538,6 +540,7 @@ private:
|
||||
CUtlVector<CVkImage*> m_scheduledRemovalImages;
|
||||
|
||||
CVkSampler m_defaultSampler;
|
||||
CRenderPassMgr m_renderPassMgr = {};
|
||||
};
|
||||
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
|
||||
@@ -681,6 +684,7 @@ IRenderCommandList *CVkRenderContext::CreateCommandList()
|
||||
{
|
||||
CVkRenderCommandList *pList = new CVkRenderCommandList;
|
||||
pList->m_pCommandBufferManager = m_pCommandBufferManager;
|
||||
pList->m_pRenderPassMgr = &m_renderPassMgr;
|
||||
return pList;
|
||||
}
|
||||
|
||||
@@ -941,6 +945,8 @@ void CVkRenderContext::Init()
|
||||
samplerInfo.minLod = 0.0f;
|
||||
samplerInfo.maxLod = VK_LOD_CLAMP_NONE;
|
||||
vkCreateSampler(s_vkDevice, &samplerInfo, nullptr, &m_defaultSampler.m_sampler);
|
||||
|
||||
m_renderPassMgr.m_hDevice = s_vkDevice;
|
||||
}
|
||||
|
||||
#include "time.h"
|
||||
@@ -1127,6 +1133,8 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
m_scheduledRemovalTextureArrays = {};
|
||||
m_scheduledRemovalBuffers = {};
|
||||
|
||||
m_renderPassMgr.Frame();
|
||||
|
||||
}
|
||||
|
||||
VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
#include "renderpassmgr.h"
|
||||
|
||||
void CRenderPassMgr::CreateRenderPass(BeginInfo *pBeginInfo, VkRenderPass *prp, VkFramebuffer *pfb)
|
||||
{
|
||||
RenderPassHandle *pRP = FindRenderPass(pBeginInfo);
|
||||
|
||||
*prp = pRP->renderpass;
|
||||
if (pRP->framebuffer)
|
||||
{
|
||||
if (pRP->uWidth != pBeginInfo->uWidth)
|
||||
goto recreate;
|
||||
if (pRP->uHeight != pBeginInfo->uHeight)
|
||||
goto recreate;
|
||||
for (uint32_t i = 0; i < pRP->usages.GetSize(); i++)
|
||||
{
|
||||
RenderPassUsage *u = &pRP->usages[i];
|
||||
RenderImage *im = &pBeginInfo->pRenderImages[i];
|
||||
CVkImage *vku = (CVkImage*)u->pImage;
|
||||
CVkImage *imu = (CVkImage*)im->pImage;
|
||||
if (vku != imu)
|
||||
goto recreate;
|
||||
if (vku->m_imageView != imu->m_imageView)
|
||||
goto recreate;
|
||||
}
|
||||
if (pRP->bIsDepth)
|
||||
{
|
||||
|
||||
CVkImage *vku = (CVkImage*)pRP->depth.pImage;
|
||||
CVkImage *imu = (CVkImage*)pBeginInfo->pDepth->pImage;
|
||||
if (vku != imu)
|
||||
goto recreate;
|
||||
if (vku->m_imageView != imu->m_imageView)
|
||||
goto recreate;
|
||||
}
|
||||
*pfb = pRP->framebuffer;
|
||||
return;
|
||||
recreate:
|
||||
m_scheduledReleasesFB.AppendTail(pRP->framebuffer);
|
||||
}
|
||||
|
||||
CUtlVector<VkImageView> image_views = {};
|
||||
for (uint32_t i = 0; i < pRP->usages.GetSize(); i++)
|
||||
{
|
||||
RenderPassUsage *u = &pRP->usages[i];
|
||||
RenderImage *im = &pBeginInfo->pRenderImages[i];
|
||||
CVkImage *imu = (CVkImage*)im->pImage;
|
||||
u->pImage = imu;
|
||||
image_views.AppendTail(imu->m_imageView);
|
||||
}
|
||||
if (pRP->bIsDepth)
|
||||
{
|
||||
CVkImage *imu = (CVkImage*)pBeginInfo->pDepth->pImage;
|
||||
pRP->depth.pImage = imu;
|
||||
image_views.AppendTail(imu->m_imageView);
|
||||
}
|
||||
image_views.Reserve(pBeginInfo->uRenderImageCount);
|
||||
VkFramebufferCreateInfo fbci = {};
|
||||
fbci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||
fbci.renderPass = pRP->renderpass;
|
||||
fbci.attachmentCount = image_views.GetSize();
|
||||
fbci.pAttachments = image_views.GetData();
|
||||
fbci.width = pBeginInfo->uWidth;
|
||||
fbci.height = pBeginInfo->uHeight;
|
||||
fbci.layers = 1;
|
||||
vkCreateFramebuffer(m_hDevice, &fbci, NULL, &pRP->framebuffer);
|
||||
pRP->uWidth = pBeginInfo->uWidth;
|
||||
pRP->uHeight = pBeginInfo->uHeight;
|
||||
*pfb = pRP->framebuffer;
|
||||
}
|
||||
|
||||
void CRenderPassMgr::Frame()
|
||||
{
|
||||
CUtlVector<RenderPassHandle> renderPassHandles = {};
|
||||
for (auto &r: m_renderPassHandles)
|
||||
{
|
||||
if (r.bIsUsed)
|
||||
{
|
||||
renderPassHandles.AppendTail(r);
|
||||
r.bIsUsed = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_scheduledReleasesRP.AppendTail(r.renderpass);
|
||||
m_scheduledReleasesFB.AppendTail(r.framebuffer);
|
||||
}
|
||||
|
||||
}
|
||||
m_renderPassHandles = renderPassHandles;
|
||||
|
||||
for (auto fb: m_scheduledReleasesFB)
|
||||
{
|
||||
vkDestroyFramebuffer(m_hDevice, fb, NULL);
|
||||
}
|
||||
for (auto rp: m_scheduledReleasesRP)
|
||||
{
|
||||
vkDestroyRenderPass(m_hDevice, rp, NULL);
|
||||
}
|
||||
m_scheduledReleasesFB = {};
|
||||
m_scheduledReleasesRP = {};
|
||||
|
||||
}
|
||||
RenderPassHandle *CRenderPassMgr::FindRenderPass(BeginInfo *pBeginInfo)
|
||||
{
|
||||
for (auto &r: m_renderPassHandles)
|
||||
{
|
||||
if (!(pBeginInfo->pDepth && r.bIsDepth))
|
||||
continue;
|
||||
if (pBeginInfo->uRenderImageCount != r.usages.GetSize())
|
||||
continue;
|
||||
for (uint32_t i = 0; i < r.usages.GetSize(); i++)
|
||||
{
|
||||
RenderPassUsage *u = &r.usages[i];
|
||||
RenderImage *im = &pBeginInfo->pRenderImages[i];
|
||||
if (u->eLoadMode != im->eLoadMode)
|
||||
goto next_usage;
|
||||
if (u->eStoreMode != im->eStoreMode)
|
||||
goto next_usage;
|
||||
if (u->eFormat != im->pImage->GetImageFormat())
|
||||
goto next_usage;
|
||||
if (u->eMultisampleType != im->pImage->GetMultisampleType())
|
||||
goto next_usage;
|
||||
}
|
||||
r.bIsUsed = true;
|
||||
return &r;
|
||||
next_usage:
|
||||
continue;
|
||||
}
|
||||
|
||||
VkRenderPass hRenderPass = NULL;
|
||||
CUtlVector<VkAttachmentDescription> attachments = {};
|
||||
CUtlVector<VkAttachmentReference> input_refs = {};
|
||||
attachments.Resize(pBeginInfo->uRenderImageCount);
|
||||
input_refs.Resize(pBeginInfo->uRenderImageCount);
|
||||
uint32_t i = 0;
|
||||
|
||||
for (uint32_t i = 0; i < pBeginInfo->uRenderImageCount; i++)
|
||||
{
|
||||
RenderImage *ri = pBeginInfo->pRenderImages+i;
|
||||
|
||||
VkAttachmentDescription a = {};
|
||||
a.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
a.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
a.format = CVkImage::GetImageFormat(ri->pImage->GetImageFormat());
|
||||
a.samples = CVkImage::GetMultisampling(ri->pImage->GetMultisampleType());
|
||||
|
||||
V_printf("INTERNAL IMAGE %p\n",ri->pImage);
|
||||
V_printf(" %u\n",ri->pImage->GetImageFormat());
|
||||
V_printf(" %u\n",ri->pImage->GetMultisampleType());
|
||||
switch( ri->eLoadMode )
|
||||
{
|
||||
case LOAD_MODE_DONT_CARE:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||
break;
|
||||
case LOAD_MODE_LOAD:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
|
||||
break;
|
||||
case LOAD_MODE_CLEAR:
|
||||
a.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
break;
|
||||
}
|
||||
a.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
attachments[i] = a;
|
||||
|
||||
VkAttachmentReference ref = {};
|
||||
ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
ref.attachment = i;
|
||||
input_refs[i] = ref;
|
||||
|
||||
}
|
||||
if (pBeginInfo->pDepth)
|
||||
{
|
||||
CVkImage *depth = (CVkImage*)pBeginInfo->pDepth->pImage;
|
||||
VkAttachmentDescription desc = {};
|
||||
desc.format = CVkImage::GetImageFormat(depth->GetImageFormat());
|
||||
desc.samples = CVkImage::GetMultisampling(depth->GetMultisampleType());
|
||||
desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
attachments.AppendTail(desc);
|
||||
}
|
||||
VkAttachmentReference depthRef;
|
||||
depthRef.attachment = attachments.GetSize() - 1;
|
||||
depthRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
|
||||
VkSubpassDescription subpass = {};
|
||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||
subpass.colorAttachmentCount = input_refs.GetSize();
|
||||
subpass.pColorAttachments = input_refs.GetData();
|
||||
if (pBeginInfo->pDepth)
|
||||
{
|
||||
subpass.pDepthStencilAttachment = &depthRef;
|
||||
}
|
||||
VkRenderPassCreateInfo rpci = {};
|
||||
rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||
rpci.attachmentCount = attachments.GetSize();
|
||||
rpci.pAttachments = attachments.GetData();
|
||||
rpci.subpassCount = 1;
|
||||
rpci.pSubpasses = &subpass;
|
||||
vkCreateRenderPass(m_hDevice, &rpci, NULL, &hRenderPass);
|
||||
|
||||
RenderPassHandle hHandle = {};
|
||||
if (pBeginInfo->pDepth)
|
||||
{
|
||||
V_printf("DEPTH %p\n", pBeginInfo->pDepth->pImage);
|
||||
hHandle.depth.pImage = pBeginInfo->pDepth->pImage;
|
||||
hHandle.depth.eMultisampleType = pBeginInfo->pDepth->pImage->GetMultisampleType();
|
||||
hHandle.depth.eFormat = pBeginInfo->pDepth->pImage->GetImageFormat();
|
||||
hHandle.depth.eLoadMode = pBeginInfo->pDepth->eLoadMode;
|
||||
hHandle.depth.eStoreMode = pBeginInfo->pDepth->eStoreMode;
|
||||
hHandle.bIsDepth = true;
|
||||
}
|
||||
for (uint32_t i = 0; i < pBeginInfo->uRenderImageCount; i++)
|
||||
{
|
||||
RenderPassUsage hUsage = {};
|
||||
RenderImage *ri = pBeginInfo->pRenderImages+i;
|
||||
hUsage.pImage = ri->pImage;
|
||||
hUsage.eMultisampleType = ri->pImage->GetMultisampleType();
|
||||
hUsage.eFormat = ri->pImage->GetImageFormat();
|
||||
hUsage.eLoadMode = ri->eLoadMode;
|
||||
hUsage.eStoreMode = ri->eStoreMode;
|
||||
hHandle.usages.AppendTail(hUsage);
|
||||
}
|
||||
hHandle.bIsUsed = true;
|
||||
hHandle.renderpass = hRenderPass;
|
||||
m_renderPassHandles.AppendTail(hHandle);
|
||||
return &m_renderPassHandles[m_renderPassHandles.GetSize()-1];
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef RENDERPASSMGR_H
|
||||
#define RENDERPASSMGR_H
|
||||
|
||||
#include "vulkan_state.h"
|
||||
|
||||
struct RenderPassUsage
|
||||
{
|
||||
IImage *pImage;
|
||||
EImageFormat eFormat;
|
||||
EMultisampleType eMultisampleType;
|
||||
ELoadMode eLoadMode;
|
||||
EStoreMode eStoreMode;
|
||||
};
|
||||
|
||||
struct RenderPassHandle
|
||||
{
|
||||
uint32_t uWidth;
|
||||
uint32_t uHeight;
|
||||
CUtlVector<RenderPassUsage> usages;
|
||||
RenderPassUsage depth;
|
||||
VkRenderPass renderpass;
|
||||
VkFramebuffer framebuffer;
|
||||
bool bIsDepth;
|
||||
bool bIsUsed;
|
||||
};
|
||||
|
||||
class CRenderPassMgr
|
||||
{
|
||||
public:
|
||||
void CreateRenderPass(BeginInfo *pBeginInfo, VkRenderPass *prp, VkFramebuffer *pfb);
|
||||
void Frame();
|
||||
VkDevice m_hDevice;
|
||||
private:
|
||||
RenderPassHandle *FindRenderPass(BeginInfo *pBeginInfo);
|
||||
CUtlVector<RenderPassHandle> m_renderPassHandles;
|
||||
CUtlVector<VkFramebuffer> m_scheduledReleasesFB;
|
||||
CUtlVector<VkRenderPass> m_scheduledReleasesRP;
|
||||
|
||||
};
|
||||
#endif
|
||||
@@ -456,6 +456,7 @@ public:
|
||||
void Submit();
|
||||
|
||||
IVkCommandBufferManager *m_pCommandBufferManager;
|
||||
class CRenderPassMgr *m_pRenderPassMgr;
|
||||
private:
|
||||
IVkCommandBuffer *m_pCommandBuffer = NULL;
|
||||
CVkCommand *m_pCurrentBegin = NULL;
|
||||
|
||||
Reference in New Issue
Block a user