lots of updates
This commit is contained in:
@@ -3,7 +3,8 @@
|
||||
#include "ld.h"
|
||||
#include "tier1/utlstring.h"
|
||||
|
||||
#define FUNNYSTDLIB "../external/funnystdlib/"
|
||||
#define EXTERNAL "../external/"
|
||||
#define FUNNYSTDLIB EXTERNAL"funnystdlib/"
|
||||
ADD_DEPENDENCY_BUILD_FILE(tier0, FUNNYSTDLIB"tier0/build.cpp");
|
||||
ADD_DEPENDENCY_BUILD_FILE(tier1, FUNNYSTDLIB"tier1/build.cpp");
|
||||
ADD_DEPENDENCY_BUILD_FILE(tier2, FUNNYSTDLIB"tier2/build.cpp");
|
||||
@@ -26,7 +27,7 @@ CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
|
||||
"vulkan/commands/transfer.cpp",
|
||||
"vulkan/commands/base.cpp",
|
||||
"vulkan/libraries/raster.cpp",
|
||||
"../external/volk/volk.c",
|
||||
EXTERNAL"volk/volk.c",
|
||||
"gamewindow_sdl.cpp"
|
||||
};
|
||||
|
||||
@@ -40,6 +41,7 @@ DECLARE_BUILD_STAGE(MaterialSystem)
|
||||
compileProject.includeDirectories = {
|
||||
"../public",
|
||||
FUNNYSTDLIB"public",
|
||||
EXTERNAL"SDL/include",
|
||||
};
|
||||
compileProject.bFPIC = true;
|
||||
ldProject = ccompiler->Compile(&compileProject);
|
||||
@@ -49,9 +51,9 @@ DECLARE_BUILD_STAGE(MaterialSystem)
|
||||
};
|
||||
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
|
||||
|
||||
if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES)
|
||||
if (ldProject.m_target.kernel == TARGET_KERNEL_WINDOWS)
|
||||
{
|
||||
ldProject.libraries.AppendTail("pthread");
|
||||
ldProject.libraryDirectories.AppendTail(EXTERNAL"windows");
|
||||
};
|
||||
|
||||
CUtlString outputProject = linker->Link(&ldProject);
|
||||
@@ -72,10 +74,11 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
|
||||
compileProject.includeDirectories = {
|
||||
"../public",
|
||||
FUNNYSTDLIB"public",
|
||||
"../external/Vulkan-Headers/include",
|
||||
"../external/Vulkan-Utility-Libraries/include",
|
||||
"../external/VulkanMemoryAllocator/include",
|
||||
"../external/volk"
|
||||
EXTERNAL"SDL/include",
|
||||
EXTERNAL"Vulkan-Headers/include",
|
||||
EXTERNAL"Vulkan-Utility-Libraries/include",
|
||||
EXTERNAL"VulkanMemoryAllocator/include",
|
||||
EXTERNAL"volk"
|
||||
};
|
||||
compileProject.bFPIC = true;
|
||||
ldProject = ccompiler->Compile(&compileProject);
|
||||
@@ -84,11 +87,21 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
|
||||
GET_PROJECT_LIBRARY(tier0, "tier0"),
|
||||
};
|
||||
ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")});
|
||||
if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES)
|
||||
{
|
||||
ldProject.libraries.AppendTail("pthread");
|
||||
};
|
||||
ldProject.libraries.AppendTail("SDL3");
|
||||
if (ldProject.m_target.kernel == TARGET_KERNEL_WINDOWS)
|
||||
{
|
||||
ldProject.libraryDirectories.AppendTail(EXTERNAL"windows");
|
||||
ldProject.libraries.AppendTail("winpthread-1");
|
||||
ldProject.libraries.AppendTail("winmm");
|
||||
ldProject.libraries.AppendTail("ole32");
|
||||
ldProject.libraries.AppendTail("gdi32");
|
||||
ldProject.libraries.AppendTail("oleaut32");
|
||||
ldProject.libraries.AppendTail("setupapi");
|
||||
ldProject.libraries.AppendTail("imm32");
|
||||
ldProject.libraries.AppendTail("version");
|
||||
ldProject.libraries.AppendTail("shell32");
|
||||
ldProject.libraries.AppendTail("uuid");
|
||||
};
|
||||
|
||||
CUtlString outputProject = linker->Link(&ldProject);
|
||||
ADD_OUTPUT_OBJECT("RenderSystemVulkan", outputProject);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#include "SDL3/SDL_error.h"
|
||||
#include "materialsystem/igamewindow.h"
|
||||
#include "tier0/lib.h"
|
||||
#include "tier0/platform.h"
|
||||
@@ -49,7 +48,7 @@ void CSDLGameWindow::Init()
|
||||
if (!m_pWindow)
|
||||
Plat_FatalErrorFunc("SDL_CreateWindow: %s\n", SDL_GetError());
|
||||
m_uRenderWidth = 1280;
|
||||
m_uRenderWidth = 720;
|
||||
m_uRenderHeight = 720;
|
||||
}
|
||||
|
||||
void CSDLGameWindow::Shutdown()
|
||||
|
||||
@@ -26,6 +26,7 @@ public:
|
||||
virtual void Reset() override;
|
||||
virtual void Submit( int iFrameIndex ) override;
|
||||
virtual void Render() override;
|
||||
void FreeWithCommands();
|
||||
private:
|
||||
void SortDependencies();
|
||||
void TryBarrier( int iCurrent, int iCurrentBuffer );
|
||||
@@ -40,9 +41,23 @@ private:
|
||||
|
||||
VkDevice m_hDevice;
|
||||
IVkCommandBufferManager *m_pMgr;
|
||||
VkCommandPool m_hPool;
|
||||
VkCommandPool m_hPool = NULL;
|
||||
};
|
||||
|
||||
void CVkCommandBuffer::FreeWithCommands()
|
||||
{
|
||||
if (m_hPool)
|
||||
{
|
||||
for ( auto &c: m_commands)
|
||||
{
|
||||
delete c;
|
||||
};
|
||||
vkFreeCommandBuffers(m_hDevice, m_hPool, m_hBuffers.GetSize(), m_hBuffers.GetData());
|
||||
vkDestroyCommandPool(m_hDevice, m_hPool, NULL);
|
||||
m_hPool = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CVkCommandBuffer::SetVulkanHandlers( VkDevice hDevice, IVkCommandBufferManager *pManager )
|
||||
{
|
||||
m_hDevice = hDevice;
|
||||
@@ -54,6 +69,8 @@ void CVkCommandBuffer::Reset()
|
||||
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
|
||||
VkCommandPoolCreateInfo stCreateInfo = {};
|
||||
|
||||
FreeWithCommands();
|
||||
|
||||
stCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||
stCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||
vkCreateCommandPool(m_hDevice, &stCreateInfo, NULL, &m_hPool);
|
||||
@@ -343,6 +360,7 @@ public:
|
||||
virtual IVkCommandBuffer *CreateCommandBuffer() override;
|
||||
virtual CVkCommand *CreateCommand( const char *szName ) override;
|
||||
virtual CUtlVector<VkCommandBuffer> &GetVulkanCommands() override;
|
||||
virtual void FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer) override;
|
||||
virtual void RenderingFinished() override;
|
||||
private:
|
||||
|
||||
@@ -399,6 +417,12 @@ CUtlVector<VkCommandBuffer> &CVkCommandBufferManager::GetVulkanCommands()
|
||||
{
|
||||
return m_commands;
|
||||
}
|
||||
void CVkCommandBufferManager::FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer)
|
||||
{
|
||||
CVkCommandBuffer *pVkBuffer = (CVkCommandBuffer*)pCommandBuffer;
|
||||
pVkBuffer->FreeWithCommands();
|
||||
delete pVkBuffer;
|
||||
};
|
||||
|
||||
void CVkCommandBufferManager::RenderingFinished()
|
||||
{
|
||||
|
||||
@@ -27,9 +27,10 @@ END_VULKAN_COMMAND(ClearColor)
|
||||
|
||||
BEGIN_VULKAN_COMMAND(Begin)
|
||||
CUtlVector<VulkanRenderOutput_t> images;
|
||||
VulkanRenderOutput_t stDepthImage;
|
||||
uint32_t nResolutionX;
|
||||
uint32_t nResolutionY;
|
||||
VulkanRenderOutput_t stDepthImage = {};
|
||||
bool bDepthEnabled = {};
|
||||
uint32_t nResolutionX = 0;
|
||||
uint32_t nResolutionY = 0;
|
||||
|
||||
|
||||
END_VULKAN_COMMAND(Begin)
|
||||
|
||||
@@ -32,6 +32,7 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
{
|
||||
VkRenderingInfo stRenderingInfo = {};
|
||||
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
|
||||
VkRenderingAttachmentInfo depthAttachment = {};
|
||||
for (auto i: images)
|
||||
{
|
||||
VkRenderingAttachmentInfo a = {};
|
||||
@@ -46,6 +47,16 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
a.imageView = ((CVkImage*)VulkanGetObject(i.m_stImage, iCurrentFrame))->m_imageView;
|
||||
attachments.AppendTail(a);
|
||||
}
|
||||
if (bDepthEnabled)
|
||||
{
|
||||
depthAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
|
||||
depthAttachment.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
depthAttachment.clearValue.depthStencil.depth = stDepthImage.m_fClearDepth;
|
||||
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
depthAttachment.imageView = ((CVkImage*)VulkanGetObject(stDepthImage.m_stImage, iCurrentFrame))->m_imageView;
|
||||
stRenderingInfo.pDepthAttachment = &depthAttachment;
|
||||
}
|
||||
|
||||
stRenderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO;
|
||||
stRenderingInfo.layerCount = 1;
|
||||
|
||||
@@ -3,16 +3,20 @@ CVkMaterial::CVkMaterial( IShader *pShader )
|
||||
{
|
||||
m_pVkShader = (CVkShader*)pShader;
|
||||
|
||||
VkDescriptorPoolSize pools[1] =
|
||||
VkDescriptorPoolSize pools[2] =
|
||||
{
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
128,
|
||||
},
|
||||
{
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
|
||||
128,
|
||||
}
|
||||
};
|
||||
VkDescriptorPoolCreateInfo stPool = {};
|
||||
stPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
stPool.poolSizeCount = 1;
|
||||
stPool.poolSizeCount = 2;
|
||||
stPool.pPoolSizes = pools;
|
||||
stPool.maxSets = 1;
|
||||
stPool.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
|
||||
@@ -37,6 +41,7 @@ CVkMaterial::CVkMaterial( IShader *pShader )
|
||||
switch (b.eDescriptorType)
|
||||
{
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
write.pBufferInfo = new VkDescriptorBufferInfo;
|
||||
break;
|
||||
default:
|
||||
@@ -88,6 +93,6 @@ void CVkMaterial::SetShaderResource( uint32_t uRegister, uint32_t uSet, IRenderi
|
||||
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->buffer = pBuffer->m_buffer;
|
||||
((VkDescriptorBufferInfo*)m_writes[uRegister].pBufferInfo)->range = pBuffer->m_nSize;
|
||||
}
|
||||
Frame();
|
||||
vkUpdateDescriptorSets(m_pVkShader->m_hDevice, 1, &m_writes[uRegister], 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
#include "vulkan_state.h"
|
||||
#include "commands.h"
|
||||
|
||||
CVkRenderCommandList::~CVkRenderCommandList()
|
||||
{
|
||||
ResetRendering();
|
||||
}
|
||||
|
||||
|
||||
void CVkRenderCommandList::ResetRendering()
|
||||
{
|
||||
/*
|
||||
for ( auto m: m_materials)
|
||||
for ( auto m: m_materials )
|
||||
{
|
||||
delete m.m_pCommandBuffer;
|
||||
m_pCommandBufferManager->FreeCommandBufferWithCommands(m.m_pCommandBuffer);
|
||||
}
|
||||
*/
|
||||
m_materials = {};
|
||||
}
|
||||
|
||||
@@ -33,7 +37,15 @@ void CVkRenderCommandList::SetClearColor( uint32_t uIndex, float r, float g, flo
|
||||
void CVkRenderCommandList::SetDepthTarget( IImage *pDepth )
|
||||
{
|
||||
SwitchRenderingStage(RENDERING_STAGE_SETUP_RASTER);
|
||||
m_depth.m_stImage.m_pSingle = pDepth;
|
||||
if (pDepth)
|
||||
{
|
||||
m_bDepthEnabled = true;
|
||||
m_depth.m_stImage.m_pSingle = pDepth;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bDepthEnabled = false;
|
||||
}
|
||||
|
||||
}
|
||||
void CVkRenderCommandList::SetClearDepth( float fVal)
|
||||
@@ -76,11 +88,17 @@ void CVkRenderCommandList::SetMaterial( IMaterial *pMaterial )
|
||||
pBeginCommand->images = m_pOutput;
|
||||
pBeginCommand->nResolutionX = m_uWidth;
|
||||
pBeginCommand->nResolutionY = m_uHeight;
|
||||
pBeginCommand->stDepthImage = m_depth;
|
||||
for ( auto &i: pBeginCommand->images)
|
||||
{
|
||||
pBeginCommand->AddDependency(i.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE);
|
||||
}
|
||||
if ( m_bDepthEnabled )
|
||||
{
|
||||
pBeginCommand->AddDependency(m_depth.m_stImage.m_pSingle, DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE);
|
||||
pBeginCommand->bDepthEnabled = m_bDepthEnabled;
|
||||
pBeginCommand->stDepthImage = m_depth;
|
||||
|
||||
}
|
||||
m_pCurrentMaterialBuffer->AddCommand(pBeginCommand);
|
||||
|
||||
CVkSetShaderCommand *pSetShader = CREATE_COMMAND(SetShader);
|
||||
@@ -207,5 +225,5 @@ IVkCommandBuffer *CVkRenderCommandList::FindOrCreateMaterialCommandBuffer( IMate
|
||||
m_materials.AppendTail(mat);
|
||||
if (pbWasCreated)
|
||||
*pbWasCreated = true;
|
||||
return m_materials.GetLast().m_pCommandBuffer;
|
||||
return m_materials[m_materials.GetSize()-1].m_pCommandBuffer;
|
||||
}
|
||||
|
||||
@@ -62,7 +62,11 @@ CVkImage::CVkImage( uint32_t nWidth, uint32_t nHeight, uint32_t nDepth, EImageFo
|
||||
m_eMultisampleType = eMultisampleType;
|
||||
m_eImageType = eImageType;
|
||||
m_eFormat = eFormat;
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
if (eFormat == IMAGE_FORMAT_D32_SFLOAT)
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
else
|
||||
m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
|
||||
CreateImage(nWidth, nHeight, eFormat, eMultisampleType, eUsage);
|
||||
CreateImageView();
|
||||
}
|
||||
@@ -211,7 +215,7 @@ CVkBuffer::CVkBuffer( uint32_t nSize, VkBufferUsageFlags2 eUsage, uint32_t nAlig
|
||||
|
||||
CVkBuffer::~CVkBuffer()
|
||||
{
|
||||
|
||||
vmaDestroyBuffer(s_vkAllocator, m_buffer, m_allocation);
|
||||
}
|
||||
|
||||
|
||||
@@ -233,7 +237,9 @@ void *CVkBuffer::Map()
|
||||
void *pData;
|
||||
|
||||
pData = NULL;
|
||||
vmaMapMemory(s_vkAllocator, m_allocation, &pData);
|
||||
VkResult r = vmaMapMemory(s_vkAllocator, m_allocation, &pData);
|
||||
VULKAN_RESULT_PRINT(r, vmaMapMemory);
|
||||
|
||||
return pData;
|
||||
}
|
||||
|
||||
@@ -295,6 +301,10 @@ private:
|
||||
|
||||
CUtlVector<VulkanWindow_t> m_renderWindows;
|
||||
CUtlVector<CVkMaterial*> m_pMaterials;
|
||||
|
||||
CUtlVector<CVkRenderCommandList*> m_scheduledRemovalLists;
|
||||
CUtlVector<CVkBuffer*> m_scheduledRemovalBuffers;
|
||||
CUtlVector<CVkImage*> m_scheduledRemovalImages;
|
||||
};
|
||||
EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION);
|
||||
|
||||
@@ -366,7 +376,7 @@ IImage *CVkRenderContext::CreateStorageImage( uint32_t x, uint32_t y, EImageForm
|
||||
|
||||
void CVkRenderContext::DestroyBuffer( IBuffer *pBuffer )
|
||||
{
|
||||
delete (CVkBuffer*)pBuffer;
|
||||
m_scheduledRemovalBuffers.AppendTail((CVkBuffer*)pBuffer);
|
||||
}
|
||||
|
||||
void CVkRenderContext::DestroyImage( IImage *pImage )
|
||||
@@ -412,7 +422,7 @@ IRenderCommandList *CVkRenderContext::CreateCommandList()
|
||||
|
||||
void CVkRenderContext::DestroyCommandList( IRenderCommandList *pCommandList )
|
||||
{
|
||||
|
||||
m_scheduledRemovalLists.AppendTail((CVkRenderCommandList*)pCommandList);
|
||||
}
|
||||
|
||||
void CVkRenderContext::SubmitCommandList(IRenderCommandList *pList)
|
||||
@@ -711,6 +721,21 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
s.m_uCurrentFrame = (s.m_uCurrentFrame + 1) % FRAMES_IN_FLIGHT;
|
||||
}
|
||||
m_pCommandBufferManager->RenderingFinished();
|
||||
vkDeviceWaitIdle(s_vkDevice);
|
||||
|
||||
for (auto &a: m_scheduledRemovalBuffers)
|
||||
{
|
||||
delete a;
|
||||
}
|
||||
for (auto &a: m_scheduledRemovalLists)
|
||||
{
|
||||
delete a;
|
||||
}
|
||||
m_scheduledRemovalLists = {};
|
||||
m_scheduledRemovalBuffers = {};
|
||||
m_pCommandBufferManager->FreeCommandBufferWithCommands(s_pPresentCommandBuffer);
|
||||
vkDeviceWaitIdle(s_vkDevice);
|
||||
|
||||
}
|
||||
|
||||
VulkanWindow_t CVkRenderContext::CreateSwapchain( IGameWindow *pWindow )
|
||||
|
||||
@@ -37,6 +37,11 @@ void CVkShader::AddOutputImage( int iImageIndex, EImageFormat eFormat )
|
||||
|
||||
void CVkShader::SetDepthImage( EImageFormat eFormat )
|
||||
{
|
||||
m_eDepthFormat = CVkImage::GetImageFormat(eFormat);
|
||||
}
|
||||
void CVkShader::DisablePixelShader( bool bDisable )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -71,12 +76,11 @@ void CVkShader::Build()
|
||||
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nMetadataLump);
|
||||
for ( int u = 0; u < pMetaData->nDescriptorsCount; u++ )
|
||||
{
|
||||
VulkanDescriptor_t *pDescriptor = (VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets);
|
||||
V_printf("%s\n" ,pDescriptor->szName);
|
||||
VulkanDescriptor_t stDescriptor = ((VulkanDescriptor_t*)m_shader.GetLumpPtr(pMetaData->pDescriptorSets))[u];
|
||||
bool bFound = false;
|
||||
for ( auto &b: bindings )
|
||||
{
|
||||
if (b.binding != pDescriptor->uBinding)
|
||||
if (b.binding != stDescriptor.uBinding)
|
||||
continue;
|
||||
bFound = true;
|
||||
break;
|
||||
@@ -84,12 +88,12 @@ void CVkShader::Build()
|
||||
if (bFound)
|
||||
break;
|
||||
VkDescriptorSetLayoutBinding bind = {};
|
||||
bind.binding = pDescriptor->uBinding;
|
||||
bind.binding = stDescriptor.uBinding;
|
||||
bind.descriptorCount = 1;
|
||||
bind.descriptorType = pDescriptor->eDescriptorType;
|
||||
bind.descriptorType = stDescriptor.eDescriptorType;
|
||||
bind.stageFlags = VK_SHADER_STAGE_ALL;
|
||||
bindings.AppendTail(bind);
|
||||
m_bindings.AppendTail(*pDescriptor);
|
||||
m_bindings.AppendTail(stDescriptor);
|
||||
}
|
||||
modules[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
modules[i].pCode = (uint32_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nDataLump);
|
||||
@@ -146,6 +150,13 @@ void CVkShader::Build()
|
||||
render.pColorAttachmentFormats = m_eFormats.GetData();
|
||||
|
||||
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
|
||||
if (m_eDepthFormat == VK_FORMAT_D32_SFLOAT)
|
||||
{
|
||||
depthStencil.depthTestEnable = VK_TRUE;
|
||||
depthStencil.depthWriteEnable = VK_TRUE;
|
||||
depthStencil.depthCompareOp = VK_COMPARE_OP_LESS;
|
||||
render.depthAttachmentFormat = m_eDepthFormat;
|
||||
}
|
||||
|
||||
for ( auto e: m_eFormats )
|
||||
{
|
||||
@@ -159,10 +170,6 @@ void CVkShader::Build()
|
||||
blend.attachmentCount = attachments.GetSize();
|
||||
blend.pAttachments = attachments.GetData();
|
||||
|
||||
render.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO;
|
||||
render.colorAttachmentCount = m_eFormats.GetSize();
|
||||
render.pColorAttachmentFormats = m_eFormats.GetData();
|
||||
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||
createInfo.stageCount = stages.GetSize();
|
||||
createInfo.pStages = stages.GetData();
|
||||
|
||||
@@ -18,7 +18,9 @@ VkAccessFlags2 VulkanGetAccessFlags( EDependencyMode eMode )
|
||||
{
|
||||
switch (eMode)
|
||||
{
|
||||
case DEPENDENCY_MODE_JUST_CREATED: return VK_ACCESS_2_NONE;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
|
||||
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_ACCESS_2_NONE;
|
||||
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_ACCESS_2_TRANSFER_WRITE_BIT;
|
||||
@@ -32,7 +34,9 @@ VkPipelineStageFlags2 VulkanGetStageFlags( EDependencyMode eMode )
|
||||
{
|
||||
switch (eMode)
|
||||
{
|
||||
case DEPENDENCY_MODE_JUST_CREATED: return VK_PIPELINE_STAGE_2_NONE;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT;
|
||||
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_PIPELINE_STAGE_2_TRANSFER_BIT;
|
||||
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION:
|
||||
@@ -47,7 +51,9 @@ VkImageLayout VulkanGetImageLayout( EDependencyMode eMode )
|
||||
{
|
||||
switch (eMode)
|
||||
{
|
||||
case DEPENDENCY_MODE_JUST_CREATED: return VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE: return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
case DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE: return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
|
||||
case DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||
case DEPENDENCY_MODE_IMAGE_PRESENT: return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||
case DEPENDENCY_MODE_BLIT_IMAGE_DESTINATION: return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||
|
||||
@@ -42,6 +42,7 @@ enum EVulkanCommandParameterType
|
||||
|
||||
enum EDependencyMode
|
||||
{
|
||||
DEPENDENCY_MODE_JUST_CREATED,
|
||||
|
||||
DEPENDENCY_MODE_SHADER_IMAGE_READ,
|
||||
DEPENDENCY_MODE_SHADER_BUFFER_READ,
|
||||
@@ -52,6 +53,7 @@ enum EDependencyMode
|
||||
DEPENDENCY_MODE_DRAWCALL_VERTEX_BUFFER,
|
||||
DEPENDENCY_MODE_DRAWCALL_INDEX_BUFFER,
|
||||
DEPENDENCY_MODE_DRAWCALL_OUTPUT_IMAGE,
|
||||
DEPENDENCY_MODE_DRAWCALL_OUTPUT_DEPTH_IMAGE,
|
||||
DEPENDENCY_MODE_DRAWCALL_INPUT_IMAGE,
|
||||
DEPENDENCY_MODE_DRAWCALL_MIXED_IMAGE,
|
||||
|
||||
@@ -96,6 +98,7 @@ abstract_class CVkCommand
|
||||
{
|
||||
public:
|
||||
virtual void Execute( VkCommandBuffer hCommandBuffer, int iCurrentFrame ) = 0;
|
||||
virtual ~CVkCommand() = default;
|
||||
//virtual const char *GetName();
|
||||
|
||||
CUtlVector<VulkanCommandDepenency_t> m_dependencies = {};
|
||||
@@ -127,6 +130,7 @@ public:
|
||||
virtual IVkCommandBuffer *CreateCommandBuffer() = 0;
|
||||
virtual CVkCommand *CreateCommand( const char *szName ) = 0;
|
||||
virtual CUtlVector<VkCommandBuffer> &GetVulkanCommands() = 0;
|
||||
virtual void FreeCommandBufferWithCommands(IVkCommandBuffer* pCommandBuffer) = 0;
|
||||
virtual void RenderingFinished() = 0;
|
||||
};
|
||||
#define VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME "VulkanCommandBufferManager"
|
||||
@@ -194,7 +198,7 @@ public:
|
||||
VkImageLayout m_ePreferredLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
|
||||
VkImageLayout m_eImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
EDependencyMode m_eLastUsage;
|
||||
EDependencyMode m_eLastUsage = DEPENDENCY_MODE_JUST_CREATED;
|
||||
};
|
||||
|
||||
class CVkBuffer: public IBuffer
|
||||
@@ -261,6 +265,7 @@ public:
|
||||
virtual void SetTopology( ETopologyMode eTopology ) override;
|
||||
virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) override;
|
||||
virtual void SetDepthImage( EImageFormat eFormat ) override;
|
||||
virtual void DisablePixelShader( bool bDisable) override;
|
||||
virtual void Build() override;
|
||||
|
||||
VkPipeline m_hPipeline = NULL;
|
||||
@@ -274,6 +279,8 @@ private:
|
||||
CUtlVector<VkVertexInputBindingDescription> m_layouts;
|
||||
CUtlVector<VkVertexInputAttributeDescription> m_attributes;
|
||||
CUtlVector<VkFormat> m_eFormats;
|
||||
VkFormat m_eDepthFormat;
|
||||
bool m_bIsFragmentEnabled;
|
||||
|
||||
};
|
||||
|
||||
@@ -347,6 +354,7 @@ struct VulkanRenderOutput_t {
|
||||
class CVkRenderCommandList: public IRenderCommandList
|
||||
{
|
||||
public:
|
||||
~CVkRenderCommandList();
|
||||
virtual void ResetRendering() override;
|
||||
|
||||
virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) override;
|
||||
@@ -381,10 +389,11 @@ private:
|
||||
VulkanRenderOutput_t *FindOrCreateRenderOutput( uint32_t uIndex );
|
||||
IVkCommandBuffer *FindOrCreateMaterialCommandBuffer( IMaterial *pMaterial, bool *pbWasCreated = NULL );
|
||||
|
||||
VulkanRenderOutput_t m_depth;
|
||||
bool m_bDepthEnabled = false;
|
||||
VulkanRenderOutput_t m_depth = {};
|
||||
|
||||
CUtlVector<VulkanRenderOutput_t> m_pOutput = {};
|
||||
CUtlSelfReferencingVector<VulkanMaterialCommandBuffer_t> m_materials = {};
|
||||
CUtlVector<VulkanMaterialCommandBuffer_t> m_materials = {};
|
||||
IVkCommandBuffer *m_pPostRaster;
|
||||
|
||||
IVkCommandBuffer *m_pCurrentMaterialBuffer = NULL;
|
||||
|
||||
Reference in New Issue
Block a user