diff --git a/materialsystem/vulkan/commandbuffer.cpp b/materialsystem/vulkan/commandbuffer.cpp index 092a772..5df6905 100644 --- a/materialsystem/vulkan/commandbuffer.cpp +++ b/materialsystem/vulkan/commandbuffer.cpp @@ -23,6 +23,9 @@ void CVkCommandBuffer::Reset() VkCommandBufferAllocateInfo commandBufferAllocInfo = {}; int i = 0; + m_hBuffers = {}; + m_hBuffers.Resize(g_vkCommandPools.GetSize()); + for ( auto pool: g_vkCommandPools) { commandBufferAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; @@ -66,51 +69,18 @@ void CVkCommandBuffer::Render() for (auto hBuffer: m_hBuffers) { + VkCommandBufferBeginInfo stCommandBufferBeginInfo = {}; + stCommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + vkBeginCommandBuffer(hBuffer, &stCommandBufferBeginInfo); + for (auto &pCommand: g_commands) { 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 { public: @@ -167,3 +137,7 @@ CVkCommandRegistry::CVkCommandRegistry( const char *szName, fnCreateVulkanComman } +void CVkCommand::AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ) +{ + m_depedencies.AppendTail({ pObject, eDependencyMode }); +} diff --git a/materialsystem/vulkan/commands.h b/materialsystem/vulkan/commands.h new file mode 100644 index 0000000..7db99bb --- /dev/null +++ b/materialsystem/vulkan/commands.h @@ -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 diff --git a/materialsystem/vulkan/commands/draw.cpp b/materialsystem/vulkan/commands/draw.cpp index d87ef64..789e31c 100644 --- a/materialsystem/vulkan/commands/draw.cpp +++ b/materialsystem/vulkan/commands/draw.cpp @@ -1,22 +1,22 @@ #include "../vulkan_state.h" - -BEGIN_DECLARE_VULKAN_COMMAND(ClearColor) - float r; - float g; - float b; - float a; - IImage *pImage; -END_DECLARE_VULKAN_COMMAND(ClearColor) +#include "../commands.h" DECLARE_VULKAN_COMMAND(ClearColor) { - CVkImage *pImage = (CVkImage*)pImage; - VkClearColorValue color = {.float32 = {1,0,1,0}}; + AddDependency(pImage, DEPENDENCY_MODE_COLOR_CLEAR_DESTINATION); + + CVkImage *pImg; + if (pImage) + pImg = (CVkImage*)pImage; + if (ppImage) + pImg = (CVkImage*)*ppImage; + + VkClearColorValue color = {.float32 = {r,g,b,a}}; VkImageSubresourceRange range = { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .levelCount = 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); } diff --git a/materialsystem/vulkan/device_extensions.h b/materialsystem/vulkan/device_extensions.h index cd52f8c..30b60b5 100644 --- a/materialsystem/vulkan/device_extensions.h +++ b/materialsystem/vulkan/device_extensions.h @@ -1,4 +1,6 @@ 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_ACCELERATION_STRUCTURE) OPTIONAL_EXTENSION(VK_KHR_DEFERRED_HOST_OPERATIONS) diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index 746eceb..ffb94c3 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -1,4 +1,5 @@ #include "SDL3/SDL_vulkan.h" +#include "commands.h" #include "materialsystem/imaterialsystem.h" #include "tier0/lib.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() { VkResult r; @@ -473,12 +476,19 @@ void CVkRenderContext::Init() g_pCommandBufferManager = (IVkCommandBufferManager*)CreateInterface(VULKAN_COMMAND_BUFFER_MANAGER_INTERFACE_NAME, NULL); g_pCommandBufferManager->Init(); - IVkCommandBuffer *pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer(); - CVkCommand *pCommand = g_pCommandBufferManager->CreateCommand("ClearColor"); + pCommandBuffer = g_pCommandBufferManager->CreateCommandBuffer(); + 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->Render(); + } 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); VkResult r = vkAcquireNextImageKHR(g_vkDevice, g_vkSwapchain, UINT64_MAX, g_vkGraphicsSemaphores[s_nImageIndex], NULL, &nImageIndex); - + vkResetFences(g_vkDevice, 1, &g_vkFences[s_nImageIndex]); 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.pWaitDstStageMask = &uPipelineStageFlags; + g_vkCommandBuffers = {}; + pCommandBuffer->Submit(nImageIndex); + stSubmitInfo.commandBufferCount = g_vkCommandBuffers.GetSize(); stSubmitInfo.pCommandBuffers = g_vkCommandBuffers.GetData(); stSubmitInfo.signalSemaphoreCount = 1; stSubmitInfo.pSignalSemaphores = &g_vkPresentSemaphores[nImageIndex]; + vkQueueSubmit(g_vkDrawQueue, 1, &stSubmitInfo, g_vkFences[s_nImageIndex]); VkPresentInfoKHR stPresentInfo = {}; @@ -599,11 +613,13 @@ formatPicked: CVkImage *pImage; pImage = new CVkImage; pImage->m_image = swapchainImages[i]; + printf("what %p\n", pImage->m_image); pImage->m_eImageType = IMAGE_TYPE_2D; pImage->m_eMultisampleType = MULTISAMPLE_TYPE_NONE; pImage->m_eFormat = IMAGE_FORMAT_WINDOW; pImage->CreateImageView(); g_vkSwapchainImages[i] = pImage; + printf("what2 %p\n", ((CVkImage*)g_vkSwapchainImages[i])->m_image); stFenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; stFenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index e760522..e549caf 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -83,12 +83,13 @@ struct VulkanCommandParameter_t abstract_class CVkCommand { public: - void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ); virtual void Execute( VkCommandBuffer hCommandBuffer ) = 0; //virtual const char *GetName(); CUtlVector m_depedencies; EVulkanCommandType m_eType; +protected: + void AddDependency( IRenderingObject *pObject, EDependencyMode eDependencyMode ); }; abstract_class IVkCommandBuffer @@ -118,19 +119,19 @@ public: CVkCommandRegistry( const char *szName, fnCreateVulkanCommand_t pfnCreate ); }; -#define BEGIN_DECLARE_VULKAN_COMMAND( name ) \ -class CVk##Command : public CVkCommand \ +#define BEGIN_VULKAN_COMMAND( name ) \ +class CVk##name##Command : public CVkCommand \ { \ public: \ virtual void Execute( VkCommandBuffer hCommandBuffer ) override; \ -#define END_DECLARE_VULKAN_COMMAND( name ) \ +#define END_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 ); \ -void CVk##Command::Execute( VkCommandBuffer hCommandBuffer ) \ +void CVk##name##Command::Execute( VkCommandBuffer hCommandBuffer ) \ #undef __cplusplus #include "vulkan/vk_enum_string_helper.h"