improvements
This commit is contained in:
@@ -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 = ¤tCommandBuffer;
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user