something
This commit is contained in:
@@ -23,6 +23,9 @@ void CVkCommandBuffer::Reset()
|
|||||||
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
|
VkCommandBufferAllocateInfo commandBufferAllocInfo = {};
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
m_hBuffers = {};
|
||||||
|
m_hBuffers.Resize(g_vkCommandPools.GetSize());
|
||||||
|
|
||||||
for ( auto pool: g_vkCommandPools)
|
for ( auto pool: g_vkCommandPools)
|
||||||
{
|
{
|
||||||
commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||||
@@ -66,51 +69,18 @@ void CVkCommandBuffer::Render()
|
|||||||
|
|
||||||
for (auto hBuffer: m_hBuffers)
|
for (auto hBuffer: m_hBuffers)
|
||||||
{
|
{
|
||||||
|
VkCommandBufferBeginInfo stCommandBufferBeginInfo = {};
|
||||||
|
stCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
vkBeginCommandBuffer(hBuffer, &stCommandBufferBeginInfo);
|
||||||
|
|
||||||
for (auto &pCommand: g_commands)
|
for (auto &pCommand: g_commands)
|
||||||
{
|
{
|
||||||
pCommand->Execute(hBuffer);
|
pCommand->Execute(hBuffer);
|
||||||
};
|
};
|
||||||
|
vkEndCommandBuffer(hBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVkCommand::SetUIntParam( const char *szName, uint32_t uintParam )
|
|
||||||
{
|
|
||||||
for ( auto p: m_parameters )
|
|
||||||
{
|
|
||||||
if (!V_strcmp(p.m_szName, szName))
|
|
||||||
p.uint32_Data = uintParam;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t CVkCommand::GetUIntParam( const char *szName )
|
|
||||||
{
|
|
||||||
for ( auto p: m_parameters )
|
|
||||||
{
|
|
||||||
if (!V_strcmp(p.m_szName, szName))
|
|
||||||
return p.uint32_Data;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CVkCommand::SetImageParam( const char *szName, IImage *pImageParam )
|
|
||||||
{
|
|
||||||
for ( auto p: m_parameters )
|
|
||||||
{
|
|
||||||
if (!V_strcmp(p.m_szName, szName))
|
|
||||||
p.pImageData = pImageParam;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
IImage *CVkCommand::GetImageParam( const char *szName )
|
|
||||||
{
|
|
||||||
for ( auto p: m_parameters )
|
|
||||||
{
|
|
||||||
if (!V_strcmp(p.m_szName, szName))
|
|
||||||
return p.pImageData;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
class CVkCommandBufferManager: public IVkCommandBufferManager
|
class CVkCommandBufferManager: public IVkCommandBufferManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -167,3 +137,7 @@ CVkCommandRegistry::CVkCommandRegistry( const char *szName, fnCreateVulkanComman
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CVkCommand::AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode )
|
||||||
|
{
|
||||||
|
m_depedencies.AppendTail({ pObject, eDependencyMode });
|
||||||
|
}
|
||||||
|
|||||||
15
materialsystem/vulkan/commands.h
Normal file
15
materialsystem/vulkan/commands.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef VULKAN_COMMANDS_H
|
||||||
|
#define VULKAN_COMMANDS_H
|
||||||
|
|
||||||
|
#include "vulkan_state.h"
|
||||||
|
|
||||||
|
BEGIN_VULKAN_COMMAND(ClearColor)
|
||||||
|
float r;
|
||||||
|
float g;
|
||||||
|
float b;
|
||||||
|
float a;
|
||||||
|
IImage *pImage;
|
||||||
|
IImage **ppImage;
|
||||||
|
END_VULKAN_COMMAND(ClearColor)
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
#include "../vulkan_state.h"
|
#include "../vulkan_state.h"
|
||||||
|
#include "../commands.h"
|
||||||
BEGIN_DECLARE_VULKAN_COMMAND(ClearColor)
|
|
||||||
float r;
|
|
||||||
float g;
|
|
||||||
float b;
|
|
||||||
float a;
|
|
||||||
IImage *pImage;
|
|
||||||
END_DECLARE_VULKAN_COMMAND(ClearColor)
|
|
||||||
|
|
||||||
|
|
||||||
DECLARE_VULKAN_COMMAND(ClearColor)
|
DECLARE_VULKAN_COMMAND(ClearColor)
|
||||||
{
|
{
|
||||||
CVkImage *pImage = (CVkImage*)pImage;
|
AddDependency(pImage, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION);
|
||||||
VkClearColorValue color = {.float32 = {1,0,1,0}};
|
|
||||||
|
CVkImage *pImg;
|
||||||
|
if (pImage)
|
||||||
|
pImg = (CVkImage*)pImage;
|
||||||
|
if (ppImage)
|
||||||
|
pImg = (CVkImage*)*ppImage;
|
||||||
|
|
||||||
|
VkClearColorValue color = {.float32 = {r,g,b,a}};
|
||||||
VkImageSubresourceRange range = {
|
VkImageSubresourceRange range = {
|
||||||
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
.levelCount = 1,
|
.levelCount = 1,
|
||||||
.layerCount = 1,
|
.layerCount = 1,
|
||||||
};
|
};
|
||||||
vkCmdClearColorImage(hCommandBuffer, pImage->m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &range);
|
vkCmdClearColorImage(hCommandBuffer, pImg->m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &range);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
REQUIRED_EXTENSION(VK_KHR_SWAPCHAIN)
|
REQUIRED_EXTENSION(VK_KHR_SWAPCHAIN)
|
||||||
|
REQUIRED_EXTENSION(VK_KHR_PIPELINE_LIBRARY)
|
||||||
|
REQUIRED_EXTENSION(VK_EXT_GRAPHICS_PIPELINE_LIBRARY)
|
||||||
OPTIONAL_EXTENSION(VK_KHR_RAY_TRACING_PIPELINE)
|
OPTIONAL_EXTENSION(VK_KHR_RAY_TRACING_PIPELINE)
|
||||||
OPTIONAL_EXTENSION(VK_KHR_ACCELERATION_STRUCTURE)
|
OPTIONAL_EXTENSION(VK_KHR_ACCELERATION_STRUCTURE)
|
||||||
OPTIONAL_EXTENSION(VK_KHR_DEFERRED_HOST_OPERATIONS)
|
OPTIONAL_EXTENSION(VK_KHR_DEFERRED_HOST_OPERATIONS)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "SDL3/SDL_vulkan.h"
|
#include "SDL3/SDL_vulkan.h"
|
||||||
|
#include "commands.h"
|
||||||
#include "materialsystem/imaterialsystem.h"
|
#include "materialsystem/imaterialsystem.h"
|
||||||
#include "tier0/lib.h"
|
#include "tier0/lib.h"
|
||||||
#include "tier0/platform.h"
|
#include "tier0/platform.h"
|
||||||
@@ -358,7 +359,9 @@ void CVkRenderContext::DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFi
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IVkCommandBuffer *pCommandBuffer;
|
||||||
|
IVkCommandBuffer *s_pPresentCommandBuffer;
|
||||||
|
IImage *pCurrentImage;
|
||||||
void CVkRenderContext::Init()
|
void CVkRenderContext::Init()
|
||||||
{
|
{
|
||||||
VkResult r;
|
VkResult r;
|
||||||
@@ -473,12 +476,19 @@ void CVkRenderContext::Init()
|
|||||||
g_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL);
|
g_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL);
|
||||||
g_pCommandBufferManager->Init();
|
g_pCommandBufferManager->Init();
|
||||||
|
|
||||||
IVkCommandBuffer *pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
|
pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer();
|
||||||
CVkCommand *pCommand = g_pCommandBufferManager->CreateCommand("ClearColor");
|
CVkClearColorCommand *pCommand = (CVkClearColorCommand*)g_pCommandBufferManager->CreateCommand("ClearColor");
|
||||||
|
|
||||||
pCommand->AddDependency(g_vkSwapchainImages[0], DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION);
|
pCommand->pImage = g_vkSwapchainImages[0];
|
||||||
|
printf("what3 %p\n", ((CVkImage*)g_vkSwapchainImages[0])->m_image);
|
||||||
|
printf("what4 %p\n", ((CVkImage*)pCommand->pImage)->m_image);
|
||||||
|
pCommand->r = 1;
|
||||||
|
pCommand->b = 1;
|
||||||
|
|
||||||
|
pCommandBuffer->Reset();
|
||||||
pCommandBuffer->AddCommand(pCommand);
|
pCommandBuffer->AddCommand(pCommand);
|
||||||
pCommandBuffer->Render();
|
pCommandBuffer->Render();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVkRenderContext::Frame( float fDeltaTime )
|
void CVkRenderContext::Frame( float fDeltaTime )
|
||||||
@@ -488,7 +498,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
|||||||
|
|
||||||
vkWaitForFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex], VK_TRUE, UINT64_MAX);
|
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);
|
VkResult r = vkAcquireNextImageKHR(g_vkDevice, g_vkSwapchain, UINT64_MAX, g_vkGraphicsSemaphores[s_nImageIndex], NULL, &nImageIndex);
|
||||||
|
|
||||||
vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]);
|
vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]);
|
||||||
|
|
||||||
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
VkPipelineStageFlags uPipelineStageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
@@ -498,12 +508,16 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
|||||||
stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex];
|
stSubmitInfo.pWaitSemaphores = &g_vkGraphicsSemaphores[s_nImageIndex];
|
||||||
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
|
stSubmitInfo.pWaitDstStageMask = &uPipelineStageFlags;
|
||||||
|
|
||||||
|
g_vkCommandBuffers = {};
|
||||||
|
pCommandBuffer->Submit(nImageIndex);
|
||||||
|
|
||||||
stSubmitInfo.commandBufferCount = g_vkCommandBuffers.GetSize();
|
stSubmitInfo.commandBufferCount = g_vkCommandBuffers.GetSize();
|
||||||
stSubmitInfo.pCommandBuffers = g_vkCommandBuffers.GetData();
|
stSubmitInfo.pCommandBuffers = g_vkCommandBuffers.GetData();
|
||||||
|
|
||||||
stSubmitInfo.signalSemaphoreCount = 1;
|
stSubmitInfo.signalSemaphoreCount = 1;
|
||||||
stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex];
|
stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex];
|
||||||
|
|
||||||
|
|
||||||
vkQueueSubmit(g_vkDrawQueue, 1, &stSubmitInfo, g_vkFences[s_nImageIndex]);
|
vkQueueSubmit(g_vkDrawQueue, 1, &stSubmitInfo, g_vkFences[s_nImageIndex]);
|
||||||
|
|
||||||
VkPresentInfoKHR stPresentInfo = {};
|
VkPresentInfoKHR stPresentInfo = {};
|
||||||
@@ -599,11 +613,13 @@ formatPicked:
|
|||||||
CVkImage *pImage;
|
CVkImage *pImage;
|
||||||
pImage = new CVkImage;
|
pImage = new CVkImage;
|
||||||
pImage->m_image = swapchainImages[i];
|
pImage->m_image = swapchainImages[i];
|
||||||
|
printf("what %p\n", pImage->m_image);
|
||||||
pImage->m_eImageType = IMAGE_TYPE_2D;
|
pImage->m_eImageType = IMAGE_TYPE_2D;
|
||||||
pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE;
|
pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE;
|
||||||
pImage->m_eFormat = IMAGE_FORMAT_WINDOW;
|
pImage->m_eFormat = IMAGE_FORMAT_WINDOW;
|
||||||
pImage->CreateImageView();
|
pImage->CreateImageView();
|
||||||
g_vkSwapchainImages[i] = pImage;
|
g_vkSwapchainImages[i] = pImage;
|
||||||
|
printf("what2 %p\n", ((CVkImage*)g_vkSwapchainImages[i])->m_image);
|
||||||
|
|
||||||
stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||||
|
|||||||
@@ -83,12 +83,13 @@ struct VulkanCommandParameter_t
|
|||||||
abstract_class CVkCommand
|
abstract_class CVkCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode );
|
|
||||||
virtual void Execute( VkCommandBuffer hCommandBuffer ) = 0;
|
virtual void Execute( VkCommandBuffer hCommandBuffer ) = 0;
|
||||||
//virtual const char *GetName();
|
//virtual const char *GetName();
|
||||||
|
|
||||||
CUtlVector<VulkanCommandDepenency_t> m_depedencies;
|
CUtlVector<VulkanCommandDepenency_t> m_depedencies;
|
||||||
EVulkanCommandType m_eType;
|
EVulkanCommandType m_eType;
|
||||||
|
protected:
|
||||||
|
void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode );
|
||||||
};
|
};
|
||||||
|
|
||||||
abstract_class IVkCommandBuffer
|
abstract_class IVkCommandBuffer
|
||||||
@@ -118,19 +119,19 @@ public:
|
|||||||
CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate );
|
CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate );
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BEGIN_DECLARE_VULKAN_COMMAND( name ) \
|
#define BEGIN_VULKAN_COMMAND( name ) \
|
||||||
class CVk##Command : public CVkCommand \
|
class CVk##name##Command : public CVkCommand \
|
||||||
{ \
|
{ \
|
||||||
public: \
|
public: \
|
||||||
virtual void Execute( VkCommandBuffer hCommandBuffer ) override; \
|
virtual void Execute( VkCommandBuffer hCommandBuffer ) override; \
|
||||||
|
|
||||||
#define END_DECLARE_VULKAN_COMMAND( name ) \
|
#define END_VULKAN_COMMAND( name ) \
|
||||||
}; \
|
}; \
|
||||||
|
|
||||||
#define DECLARE_VULKAN_COMMAND(name) \
|
#define DECLARE_VULKAN_COMMAND(name) \
|
||||||
CVkCommand *_VulkanCommandCreate_##name() { return new CVk##Command; } \
|
CVkCommand *_VulkanCommandCreate_##name() { return new CVk##name##Command; } \
|
||||||
CVkCommandRegistry _VulkanCommandRegistry_##name( #name, _VulkanCommandCreate_##name ); \
|
CVkCommandRegistry _VulkanCommandRegistry_##name( #name, _VulkanCommandCreate_##name ); \
|
||||||
void CVk##Command::Execute( VkCommandBuffer hCommandBuffer ) \
|
void CVk##name##Command::Execute( VkCommandBuffer hCommandBuffer ) \
|
||||||
|
|
||||||
#undef __cplusplus
|
#undef __cplusplus
|
||||||
#include "vulkan/vk_enum_string_helper.h"
|
#include "vulkan/vk_enum_string_helper.h"
|
||||||
|
|||||||
Reference in New Issue
Block a user