improvements

This commit is contained in:
2025-12-14 12:32:24 +02:00
parent 90a0c55d1d
commit c4406d1891
20 changed files with 529 additions and 95 deletions

View File

@@ -2,6 +2,7 @@
#include "materialsystem/imaterialsystem.h"
#include "tier0/lib.h"
#include "tier0/platform.h"
#include "tier1/interface.h"
#include "tier1/utlstring.h"
#include "tier1/utlvector.h"
#define VK_NO_PROTOTYPES
@@ -36,41 +37,11 @@ CUtlVector<VkFence> g_vkFences;
CUtlVector<VkSemaphore> g_vkGraphicsSemaphores;
CUtlVector<VkSemaphore> g_vkPresentSemaphores;
VkCommandPool g_vkCommandPool;
CUtlVector<VkCommandBuffer> g_vkCommandBuffers;
CUtlVector<VkCommandPool> g_vkCommandPools;
CUtlVector<IImage*> g_vkSwapchainImages;
VkFormat g_vkWindowImageFormat;
class CVkImage: public IImage
{
public:
CVkImage();
CVkImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
~CVkImage();
virtual void SetDebugName( const char *szName ) override;
virtual uint32_t GetImageWidth() override;
virtual uint32_t GetImageHeight() override;
virtual EImageFormat GetImageFormat() override;
virtual EMultisampleType GetMultisampleType() override;
void CreateImage( uint32_t nWidth, uint32_t nHeight, EImageFormat eFormat, EMultisampleType eMultisampleType );
void CreateImageView();
static VkImageViewType GetImageViewType( enum EImageType eImageType );
static VkFormat GetImageFormat( enum EImageFormat eImageFormat );
uint32_t m_nWidth;
uint32_t m_nHeight;
EImageFormat m_eFormat;
EMultisampleType m_eMultisampleType;
EImageType m_eImageType;
VkImage m_image;
VkImageView m_imageView;
VmaAllocation m_allocation;
};
CVkImage::CVkImage()
{
@@ -343,6 +314,51 @@ void CVkRenderContext::DestroyImage( IImage *pImage )
}
IShader *CVkRenderContext::CreateShader( const char *szName )
{
}
void CVkRenderContext::DestroyShader( IShader *pMaterial )
{
}
IMaterial *CVkRenderContext::CreateMaterial( IShader *pShader )
{
}
void CVkRenderContext::DestroyMaterial( IMaterial *pMaterial )
{
}
void CVkRenderContext::SetMaterial( IMaterial *pMaterial )
{
}
void CVkRenderContext::SetVertexBuffer( IVertexBuffer *pBuffer )
{
}
void CVkRenderContext::SetIndexBuffer( IVertexBuffer *pBuffer )
{
}
void CVkRenderContext::DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
}
void CVkRenderContext::DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance )
{
}
void CVkRenderContext::Init()
{
VkResult r;
@@ -443,22 +459,27 @@ void CVkRenderContext::Init()
CreateSwapchain();
g_vkCommandBuffers.Resize(g_vkSwapchainImages.GetSize());
g_vkCommandPools.Resize(g_vkSwapchainImages.GetSize());
VkCommandPoolCreateInfo commandPoolCreateInfo = {};
commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
commandPoolCreateInfo.queueFamilyIndex = g_iDrawFamily;
commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
vkCreateCommandPool(g_vkDevice, &commandPoolCreateInfo, NULL, &g_vkCommandPool);
for (auto &pool: g_vkCommandPools)
{
VkCommandPoolCreateInfo commandPoolCreateInfo = {};
commandPoolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
commandPoolCreateInfo.queueFamilyIndex = g_iDrawFamily;
commandPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
vkCreateCommandPool(g_vkDevice, &commandPoolCreateInfo, NULL, &pool);
}
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
commandBufferAllocInfo.commandPool = g_vkCommandPool;
commandBufferAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
commandBufferAllocInfo.commandBufferCount = g_vkSwapchainImages.GetSize();
vkAllocateCommandBuffers(g_vkDevice, &commandBufferAllocInfo, g_vkCommandBuffers.GetData());
g_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL);
g_pCommandBufferManager->Init();
IVkCommandBuffer *pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
CVkCommand *pCommand = g_pCommandBufferManager->CreateCommand("Draw");
pCommand->AddDependency(g_vkSwapchainImages[0], DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION);
pCommand->SetImageParam("Image", g_vkSwapchainImages[0]);
pCommandBuffer->AddCommand(pCommand);
pCommandBuffer->Render();
}
void CVkRenderContext::Frame( float fDeltaTime )
@@ -466,25 +487,21 @@ void CVkRenderContext::Frame( float fDeltaTime )
static uint32_t s_nImageIndex = 0;
uint32_t nImageIndex = 0;
vkWaitForFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex], UINT64_MAX, VK_TRUE);
vkWaitForFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex], VK_TRUE, UINT64_MAX);
VkResult r = vkAcquireNextImageKHR(g_vkDevice, g_vkSwapchain, UINT64_MAX, g_vkGraphicsSemaphores[s_nImageIndex], NULL, &nImageIndex);
VkCommandBufferBeginInfo commandBufferBeginInfo = {};
commandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
vkBeginCommandBuffer(GetCommandBuffer(), &commandBufferBeginInfo);
vkEndCommandBuffer(GetCommandBuffer());
vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]);
VkCommandBuffer currentCommandBuffer = GetCommandBuffer();
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
VkSubmitInfo stSubmitInfo = {};
stSubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
stSubmitInfo.waitSemaphoreCount = 1;
stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex];
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
stSubmitInfo.commandBufferCount = 1;
stSubmitInfo.pCommandBuffers = &currentCommandBuffer;
stSubmitInfo.commandBufferCount = g_vkCommandBuffers.GetSize();
stSubmitInfo.pCommandBuffers = g_vkCommandBuffers.GetData();
stSubmitInfo.signalSemaphoreCount = 1;
stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex];
@@ -693,7 +710,3 @@ CUtlVector<const char *> CVkRenderContext::GetDeviceExtensions()
return enabledExtensions;
}
VkCommandBuffer CVkRenderContext::GetCommandBuffer()
{
return g_vkCommandBuffers[0];
}