diff --git a/Axiom/RHI/IRHI.h b/Axiom/RHI/IRHI.h index 1a81c4b..4ca765b 100644 --- a/Axiom/RHI/IRHI.h +++ b/Axiom/RHI/IRHI.h @@ -19,6 +19,16 @@ enum class RHIPipelineType : uint8_t { Compute, }; +enum class RHIBindPoint : uint8_t { + Graphics = 0, + Compute, +}; + +enum class RHIIndexType : uint8_t { + UInt16 = 0, + UInt32, +}; + enum class RHICommandStage : uint8_t { All = 0, Draw, @@ -118,6 +128,8 @@ class IRHISwapchain; class IRHIFence; class IRHISemaphore; +using RHINativeHandle = uintptr_t; + struct RHIQueueWaitInfo { IRHISemaphore *Semaphore{nullptr}; uint64_t Value{0}; @@ -138,6 +150,44 @@ class IRHICommandList { virtual void End() = 0; [[nodiscard]] virtual bool IsRecording() const = 0; [[nodiscard]] virtual RHIQueueType GetQueueType() const = 0; + [[nodiscard]] virtual RHINativeHandle GetNativeCommandBuffer() const = 0; + + virtual void BeginRendering(const void *RenderingInfo) = 0; + virtual void EndRendering() = 0; + virtual void SetViewport(const void *Viewport) = 0; + virtual void SetScissor(const void *Scissor) = 0; + virtual void BindPipeline(RHIBindPoint BindPoint, + RHINativeHandle Pipeline) = 0; + virtual void BindDescriptorSet(RHIBindPoint BindPoint, + RHINativeHandle PipelineLayout, + uint32_t FirstSet, + std::span Sets) = 0; + virtual void PushConstants(RHINativeHandle PipelineLayout, + uint32_t ShaderStages, uint32_t Offset, + uint32_t Size, const void *Data) = 0; + virtual void BindVertexBuffer(uint32_t FirstBinding, RHINativeHandle Buffer, + uint64_t Offset) = 0; + virtual void BindIndexBuffer(RHINativeHandle Buffer, uint64_t Offset, + RHIIndexType IndexType) = 0; + virtual void DrawIndexed(uint32_t IndexCount, uint32_t InstanceCount, + uint32_t FirstIndex, int32_t VertexOffset, + uint32_t FirstInstance) = 0; + virtual void DrawIndexedIndirect(RHINativeHandle Buffer, uint64_t Offset, + uint32_t DrawCount, uint32_t Stride) = 0; + virtual void Dispatch(uint32_t GroupCountX, uint32_t GroupCountY, + uint32_t GroupCountZ) = 0; + virtual void CopyBuffer(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) = 0; + virtual void CopyBufferToImage(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationImage, + uint32_t DestinationImageLayout, + const void *CopyRegion) = 0; + virtual void CopyImageToBuffer(RHINativeHandle SourceImage, + uint32_t SourceImageLayout, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) = 0; + virtual void PipelineBarrier(const void *DependencyInfo) = 0; }; class IRHIQueue { diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.cpp b/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.cpp index 1e88c38..8ab68b6 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.cpp +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.cpp @@ -96,7 +96,7 @@ void VulkanDrawSubmissionSystem::Init(const CreateInfo &CreateInfo) { } void VulkanDrawSubmissionSystem::SetRecordPreparedScenePasses( - std::function + std::function RecordPreparedScenePasses) { m_RecordPreparedScenePasses = std::move(RecordPreparedScenePasses); } @@ -396,14 +396,14 @@ void VulkanDrawSubmissionSystem::ClearDepthImage(VkCommandBuffer CommandBuffer, PreviousLayout, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); } -void VulkanDrawSubmissionSystem::DrawMeshes(VkCommandBuffer CommandBuffer, +void VulkanDrawSubmissionSystem::DrawMeshes(IRHICommandList &CommandList, RenderScene &Scene, uint64_t FrameNumber, RendererViewMode ViewMode) { if (!m_RecordPreparedScenePasses) { return; } - m_RecordPreparedScenePasses(CommandBuffer, Scene, FrameNumber, ViewMode); + m_RecordPreparedScenePasses(CommandList, Scene, FrameNumber, ViewMode); } void VulkanDrawSubmissionSystem::RecordOffscreenCapture( @@ -629,7 +629,7 @@ void VulkanDrawSubmissionSystem::DrawFrame(const FrameRequest &Request) { VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, MeshFrame.TimestampQueryPool, 2); if (Request.ActiveScene != nullptr) { - DrawMeshes(CommandBuffer, *Request.ActiveScene, Request.FrameNumber, + DrawMeshes(CommandList, *Request.ActiveScene, Request.FrameNumber, Request.ViewMode); } vkCmdWriteTimestamp2(CommandBuffer, diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.h b/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.h index e7df622..0cefa78 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.h +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanDrawSubmissionSystem.h @@ -2,6 +2,7 @@ #include "Renderer/RenderScene.h" #include "Renderer/RenderSurface.h" +#include "RHI/IRHI.h" #include "AxiomRHI/Vulkan/VulkanCommandContext.h" #include "AxiomRHI/Vulkan/VulkanDeletionQueue.h" #include "AxiomRHI/Vulkan/VulkanDevice.h" @@ -34,7 +35,7 @@ class VulkanDrawSubmissionSystem { VulkanOcclusionCulling &OcclusionCulling; bool EnableImGui{false}; bool HasPresentationSurface{false}; - std::function RecordPreparedScenePasses; std::function DestroyResourceManagerHDRTexture; @@ -51,7 +52,7 @@ class VulkanDrawSubmissionSystem { void Init(const CreateInfo &CreateInfo); void Shutdown(); void SetRecordPreparedScenePasses( - std::function RecordPreparedScenePasses); void BeginFrame(bool StopRendering); @@ -80,7 +81,7 @@ class VulkanDrawSubmissionSystem { void CollectCompletedTransfers(); void CollectFrameStats(MeshFrameResources &Frame); void ClearDepthImage(VkCommandBuffer CommandBuffer, uint64_t FrameNumber); - void DrawMeshes(VkCommandBuffer CommandBuffer, RenderScene &Scene, + void DrawMeshes(IRHICommandList &CommandList, RenderScene &Scene, uint64_t FrameNumber, RendererViewMode ViewMode); void RecordOffscreenCapture(VkCommandBuffer CommandBuffer, const AllocatedBuffer &ReadbackBuffer, @@ -108,7 +109,7 @@ class VulkanDrawSubmissionSystem { bool m_EnableImGui{false}; bool m_HasPresentationSurface{false}; bool m_IsInitialized{false}; - std::function + std::function m_RecordPreparedScenePasses; VulkanGizmoRenderer m_GizmoRenderer; diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.cpp b/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.cpp index 91f4995..be0eed0 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.cpp +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.cpp @@ -31,6 +31,146 @@ void VulkanCommandList::End() { m_IsRecording = false; } +void VulkanCommandList::BeginRendering(const void *RenderingInfo) { + vkCmdBeginRendering( + m_CommandBuffer, static_cast(RenderingInfo)); +} + +void VulkanCommandList::EndRendering() { vkCmdEndRendering(m_CommandBuffer); } + +void VulkanCommandList::SetViewport(const void *Viewport) { + vkCmdSetViewport(m_CommandBuffer, 0, 1, + static_cast(Viewport)); +} + +void VulkanCommandList::SetScissor(const void *Scissor) { + vkCmdSetScissor(m_CommandBuffer, 0, 1, static_cast(Scissor)); +} + +void VulkanCommandList::BindPipeline(RHIBindPoint BindPoint, + RHINativeHandle Pipeline) { + vkCmdBindPipeline(m_CommandBuffer, ToVulkanBindPoint(BindPoint), + DecodeNativeHandle(Pipeline)); +} + +void VulkanCommandList::BindDescriptorSet( + RHIBindPoint BindPoint, RHINativeHandle PipelineLayout, uint32_t FirstSet, + std::span Sets) { + std::vector DescriptorSets; + DescriptorSets.reserve(Sets.size()); + for (RHINativeHandle Set : Sets) { + DescriptorSets.push_back(DecodeNativeHandle(Set)); + } + + vkCmdBindDescriptorSets( + m_CommandBuffer, ToVulkanBindPoint(BindPoint), + DecodeNativeHandle(PipelineLayout), FirstSet, + static_cast(DescriptorSets.size()), DescriptorSets.data(), 0, + VK_NULL_HANDLE); +} + +void VulkanCommandList::PushConstants(RHINativeHandle PipelineLayout, + uint32_t ShaderStages, uint32_t Offset, + uint32_t Size, const void *Data) { + vkCmdPushConstants(m_CommandBuffer, + DecodeNativeHandle(PipelineLayout), + static_cast(ShaderStages), Offset, Size, + Data); +} + +void VulkanCommandList::BindVertexBuffer(uint32_t FirstBinding, + RHINativeHandle Buffer, + uint64_t Offset) { + const VkBuffer VulkanBuffer = DecodeNativeHandle(Buffer); + const VkDeviceSize VulkanOffset = static_cast(Offset); + vkCmdBindVertexBuffers(m_CommandBuffer, FirstBinding, 1, &VulkanBuffer, + &VulkanOffset); +} + +void VulkanCommandList::BindIndexBuffer(RHINativeHandle Buffer, uint64_t Offset, + RHIIndexType IndexType) { + vkCmdBindIndexBuffer(m_CommandBuffer, DecodeNativeHandle(Buffer), + static_cast(Offset), + ToVulkanIndexType(IndexType)); +} + +void VulkanCommandList::DrawIndexed(uint32_t IndexCount, uint32_t InstanceCount, + uint32_t FirstIndex, int32_t VertexOffset, + uint32_t FirstInstance) { + vkCmdDrawIndexed(m_CommandBuffer, IndexCount, InstanceCount, FirstIndex, + VertexOffset, FirstInstance); +} + +void VulkanCommandList::DrawIndexedIndirect(RHINativeHandle Buffer, + uint64_t Offset, uint32_t DrawCount, + uint32_t Stride) { + vkCmdDrawIndexedIndirect(m_CommandBuffer, DecodeNativeHandle(Buffer), + static_cast(Offset), DrawCount, Stride); +} + +void VulkanCommandList::Dispatch(uint32_t GroupCountX, uint32_t GroupCountY, + uint32_t GroupCountZ) { + vkCmdDispatch(m_CommandBuffer, GroupCountX, GroupCountY, GroupCountZ); +} + +void VulkanCommandList::CopyBuffer(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) { + vkCmdCopyBuffer(m_CommandBuffer, DecodeNativeHandle(SourceBuffer), + DecodeNativeHandle(DestinationBuffer), 1, + static_cast(CopyRegion)); +} + +void VulkanCommandList::CopyBufferToImage(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationImage, + uint32_t DestinationImageLayout, + const void *CopyRegion) { + vkCmdCopyBufferToImage( + m_CommandBuffer, DecodeNativeHandle(SourceBuffer), + DecodeNativeHandle(DestinationImage), + static_cast(DestinationImageLayout), 1, + static_cast(CopyRegion)); +} + +void VulkanCommandList::CopyImageToBuffer(RHINativeHandle SourceImage, + uint32_t SourceImageLayout, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) { + vkCmdCopyImageToBuffer( + m_CommandBuffer, DecodeNativeHandle(SourceImage), + static_cast(SourceImageLayout), + DecodeNativeHandle(DestinationBuffer), 1, + static_cast(CopyRegion)); +} + +void VulkanCommandList::PipelineBarrier(const void *DependencyInfo) { + vkCmdPipelineBarrier2( + m_CommandBuffer, static_cast(DependencyInfo)); +} + +VkPipelineBindPoint +VulkanCommandList::ToVulkanBindPoint(RHIBindPoint BindPoint) { + switch (BindPoint) { + case RHIBindPoint::Graphics: + return VK_PIPELINE_BIND_POINT_GRAPHICS; + case RHIBindPoint::Compute: + return VK_PIPELINE_BIND_POINT_COMPUTE; + } + + return VK_PIPELINE_BIND_POINT_GRAPHICS; +} + +VkIndexType VulkanCommandList::ToVulkanIndexType(RHIIndexType IndexType) { + switch (IndexType) { + case RHIIndexType::UInt16: + return VK_INDEX_TYPE_UINT16; + case RHIIndexType::UInt32: + return VK_INDEX_TYPE_UINT32; + } + + return VK_INDEX_TYPE_UINT32; +} + VulkanFence::~VulkanFence() { if (m_OwnsFence && m_Device != VK_NULL_HANDLE && m_Fence != VK_NULL_HANDLE) { vkDestroyFence(m_Device, m_Fence, VK_NULL_HANDLE); diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.h b/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.h index 3ce837a..7de0721 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.h +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanRhiObjects.h @@ -5,6 +5,7 @@ #include "AxiomRHI/Vulkan/VulkanTypes.h" #include +#include namespace Axiom { class VulkanCommandList final : public IRHICommandList { @@ -18,10 +19,67 @@ class VulkanCommandList final : public IRHICommandList { void End() override; bool IsRecording() const override { return m_IsRecording; } RHIQueueType GetQueueType() const override { return m_QueueType; } + RHINativeHandle GetNativeCommandBuffer() const override { + return EncodeNativeHandle(m_CommandBuffer); + } VkCommandBuffer GetCommandBuffer() const { return m_CommandBuffer; } + void BeginRendering(const void *RenderingInfo) override; + void EndRendering() override; + void SetViewport(const void *Viewport) override; + void SetScissor(const void *Scissor) override; + void BindPipeline(RHIBindPoint BindPoint, RHINativeHandle Pipeline) override; + void BindDescriptorSet(RHIBindPoint BindPoint, RHINativeHandle PipelineLayout, + uint32_t FirstSet, + std::span Sets) override; + void PushConstants(RHINativeHandle PipelineLayout, uint32_t ShaderStages, + uint32_t Offset, uint32_t Size, const void *Data) override; + void BindVertexBuffer(uint32_t FirstBinding, RHINativeHandle Buffer, + uint64_t Offset) override; + void BindIndexBuffer(RHINativeHandle Buffer, uint64_t Offset, + RHIIndexType IndexType) override; + void DrawIndexed(uint32_t IndexCount, uint32_t InstanceCount, + uint32_t FirstIndex, int32_t VertexOffset, + uint32_t FirstInstance) override; + void DrawIndexedIndirect(RHINativeHandle Buffer, uint64_t Offset, + uint32_t DrawCount, uint32_t Stride) override; + void Dispatch(uint32_t GroupCountX, uint32_t GroupCountY, + uint32_t GroupCountZ) override; + void CopyBuffer(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) override; + void CopyBufferToImage(RHINativeHandle SourceBuffer, + RHINativeHandle DestinationImage, + uint32_t DestinationImageLayout, + const void *CopyRegion) override; + void CopyImageToBuffer(RHINativeHandle SourceImage, + uint32_t SourceImageLayout, + RHINativeHandle DestinationBuffer, + const void *CopyRegion) override; + void PipelineBarrier(const void *DependencyInfo) override; + + template + static RHINativeHandle EncodeNativeHandle(VulkanHandle Handle) { + if constexpr (std::is_pointer_v) { + return reinterpret_cast(Handle); + } else { + return static_cast(Handle); + } + } private: + template + static VulkanHandle DecodeNativeHandle(RHINativeHandle Handle) { + if constexpr (std::is_pointer_v) { + return reinterpret_cast(Handle); + } else { + return static_cast(Handle); + } + } + + static VkPipelineBindPoint ToVulkanBindPoint(RHIBindPoint BindPoint); + static VkIndexType ToVulkanIndexType(RHIIndexType IndexType); + VkDevice m_Device{VK_NULL_HANDLE}; VkCommandPool m_CommandPool{VK_NULL_HANDLE}; VkCommandBuffer m_CommandBuffer{VK_NULL_HANDLE}; diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.cpp b/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.cpp index c5791aa..e815a1d 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.cpp +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.cpp @@ -25,20 +25,28 @@ glm::vec3 TransformPoint(const glm::mat4 &Transform, const glm::vec3 &Point) { namespace Axiom { namespace { -VulkanRhiDevice *RequireVulkanDevice(IRHIDevice &Device) { - return dynamic_cast(&Device); +RHINativeHandle RHIHandle(auto Handle) { + return VulkanCommandList::EncodeNativeHandle(Handle); +} + +std::array RHIDescriptorSets(VkDescriptorSet Set) { + return {RHIHandle(Set)}; +} + +VkCommandBuffer GetVulkanCommandBuffer(const IRHICommandList &CommandList) { + return reinterpret_cast(CommandList.GetNativeCommandBuffer()); } } // namespace void VulkanSceneRenderer::Init(IRHIDevice &Device, const RendererCreateInfo &CreateInfo) { - m_Device = RequireVulkanDevice(Device); + m_Device = static_cast(&Device); if (m_Device != nullptr) { m_FrameOutput = CreateInfo.FrameOutput; m_Device->GetDrawSubmissionSystem().SetRecordPreparedScenePasses( - [this](VkCommandBuffer CommandBuffer, RenderScene &Scene, + [this](IRHICommandList &CommandList, RenderScene &Scene, uint64_t FrameNumber, RendererViewMode ViewMode) { - RecordPreparedScenePasses(CommandBuffer, Scene, FrameNumber, ViewMode); + RecordPreparedScenePasses(CommandList, Scene, FrameNumber, ViewMode); }); } } @@ -346,7 +354,7 @@ void VulkanSceneRenderer::RenderFallbackBackground(RenderScene &Scene) { } void VulkanSceneRenderer::RecordPreparedScenePasses( - VkCommandBuffer CommandBuffer, RenderScene &Scene, uint64_t FrameNumber, + IRHICommandList &CommandList, RenderScene &Scene, uint64_t FrameNumber, RendererViewMode ViewMode) { m_ActiveScene = &Scene; m_ViewMode = ViewMode; @@ -361,38 +369,38 @@ void VulkanSceneRenderer::RecordPreparedScenePasses( for (const ScenePassPrimitive Pass : m_QueuedScenePasses) { switch (Pass) { case ScenePassPrimitive::Background: - EnsureDrawImageLayout(CommandBuffer, VK_IMAGE_LAYOUT_GENERAL); - DrawBackgroundPass(CommandBuffer, m_ActiveScene); + EnsureDrawImageLayout(CommandList, VK_IMAGE_LAYOUT_GENERAL); + DrawBackgroundPass(CommandList, m_ActiveScene); break; case ScenePassPrimitive::DepthPrepass: - EnsureRasterDepthLayout(CommandBuffer, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); - RecordDepthPrepassPass(CommandBuffer, Frame); + EnsureRasterDepthLayout(CommandList, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); + RecordDepthPrepassPass(CommandList, Frame); break; case ScenePassPrimitive::Hzb: - EnsureRasterDepthLayout(CommandBuffer, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); - BuildHzbPass(CommandBuffer, Frame); + EnsureRasterDepthLayout(CommandList, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); + BuildHzbPass(CommandList, Frame); break; case ScenePassPrimitive::ComputeMeshPath: - EnsureRasterDepthLayout(CommandBuffer, + EnsureRasterDepthLayout(CommandList, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL); - EnsureDrawImageLayout(CommandBuffer, VK_IMAGE_LAYOUT_GENERAL); - RecordComputeMeshPathPass(CommandBuffer, Frame); + EnsureDrawImageLayout(CommandList, VK_IMAGE_LAYOUT_GENERAL); + RecordComputeMeshPathPass(CommandList, Frame); break; case ScenePassPrimitive::OpaqueForward: - EnsureRasterDepthLayout(CommandBuffer, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); - EnsureDrawImageLayout(CommandBuffer, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - RecordOpaqueForwardPass(CommandBuffer, Frame); + EnsureRasterDepthLayout(CommandList, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); + EnsureDrawImageLayout(CommandList, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + RecordOpaqueForwardPass(CommandList, Frame); break; case ScenePassPrimitive::TranslucentForward: - EnsureRasterDepthLayout(CommandBuffer, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); - EnsureDrawImageLayout(CommandBuffer, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - RecordTranslucentForwardPass(CommandBuffer, Frame); + EnsureRasterDepthLayout(CommandList, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); + EnsureDrawImageLayout(CommandList, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + RecordTranslucentForwardPass(CommandList, Frame); break; } } } -void VulkanSceneRenderer::DrawBackgroundPass(VkCommandBuffer CommandBuffer, +void VulkanSceneRenderer::DrawBackgroundPass(IRHICommandList &CommandList, RenderScene *Scene) { auto &ResourceManager = m_Device->GetResourceManager(); ResourceManager.SyncHDRSkyboxTexture( @@ -407,36 +415,39 @@ void VulkanSceneRenderer::DrawBackgroundPass(VkCommandBuffer CommandBuffer, !Scene->ActiveCamera->IsOrthographic(); if (UseHDR) { - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetHDRSkyboxPipeline()); - const std::array Sets = { - ResourceManager.GetDrawImageDescriptorSet(), - ResourceManager.GetHDRSkyboxDescriptorSet()}; - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetHDRSkyboxPipelineLayout(), 0, - static_cast(Sets.size()), Sets.data(), 0, VK_NULL_HANDLE); + CommandList.BindPipeline(RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary() + .GetHDRSkyboxPipeline())); + const std::array Sets = { + RHIHandle(ResourceManager.GetDrawImageDescriptorSet()), + RHIHandle(ResourceManager.GetHDRSkyboxDescriptorSet())}; + CommandList.BindDescriptorSet( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetHDRSkyboxPipelineLayout()), + 0, Sets); const glm::mat4 InverseViewProj = glm::inverse(Scene->ActiveCamera->GetViewProjectionMatrix()); - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetHDRSkyboxPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetHDRSkyboxPipelineLayout()), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(glm::mat4), glm::value_ptr(InverseViewProj)); - vkCmdDispatch(CommandBuffer, - static_cast(std::ceil(DrawExtent.width / 16.0f)), - static_cast(std::ceil(DrawExtent.height / 16.0f)), 1); + CommandList.Dispatch( + static_cast(std::ceil(DrawExtent.width / 16.0f)), + static_cast(std::ceil(DrawExtent.height / 16.0f)), 1); return; } - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetGradientPipeline()); + CommandList.BindPipeline( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetGradientPipeline())); const VkDescriptorSet DrawImageDescriptorSet = ResourceManager.GetDrawImageDescriptorSet(); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetGradientPipelineLayout(), 0, 1, - &DrawImageDescriptorSet, 0, VK_NULL_HANDLE); + const auto Sets = RHIDescriptorSets(DrawImageDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetGradientPipelineLayout()), 0, + Sets); ComputePushConstants PC; if (Scene != nullptr) { @@ -447,22 +458,23 @@ void VulkanSceneRenderer::DrawBackgroundPass(VkCommandBuffer CommandBuffer, PC.data2 = glm::vec4(0.14f, 0.24f, 0.38f, 1.0f); } - vkCmdPushConstants(CommandBuffer, - m_Device->GetPipelineLibrary().GetGradientPipelineLayout(), - VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(PC), &PC); - vkCmdDispatch(CommandBuffer, - static_cast(std::ceil(DrawExtent.width / 16.0f)), - static_cast(std::ceil(DrawExtent.height / 16.0f)), 1); + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetGradientPipelineLayout()), + VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(PC), &PC); + CommandList.Dispatch( + static_cast(std::ceil(DrawExtent.width / 16.0f)), + static_cast(std::ceil(DrawExtent.height / 16.0f)), 1); } -void VulkanSceneRenderer::BuildHzbPass(VkCommandBuffer CommandBuffer, +void VulkanSceneRenderer::BuildHzbPass(IRHICommandList &CommandList, MeshFrameResources &Frame) { - if (CommandBuffer == VK_NULL_HANDLE) { + if (CommandList.GetNativeCommandBuffer() == 0) { QueueScenePass(ScenePassPrimitive::Hzb); return; } - m_Device->GetDrawSubmissionSystem().BuildHzb(CommandBuffer, Frame); + m_Device->GetDrawSubmissionSystem().BuildHzb(GetVulkanCommandBuffer(CommandList), + Frame); if (m_PreparedSceneState.HasPreparedCamera) { Frame.HzbViewProjection = m_PreparedSceneState.CameraData.ViewProjection; Frame.HzbViewportSize = glm::vec2(m_PreparedSceneState.CameraData.ViewportSize); @@ -640,7 +652,7 @@ void VulkanSceneRenderer::PrepareGraphicsMaterialDescriptors() { } void VulkanSceneRenderer::RecordDepthPrepassPass( - VkCommandBuffer CommandBuffer, const MeshFrameResources &Frame) const { + IRHICommandList &CommandList, const MeshFrameResources &Frame) const { const auto &OpaqueGraphicsSubmissions = m_PreparedSceneState.VisibleSubmissions.OpaqueGraphics; const auto &ComputeSubmissions = m_PreparedSceneState.VisibleSubmissions.Compute; @@ -666,15 +678,17 @@ void VulkanSceneRenderer::RecordDepthPrepassPass( .pDepthAttachment = &DepthOnlyAttachment, .pStencilAttachment = VK_NULL_HANDLE}; - vkCmdBeginRendering(CommandBuffer, &DepthOnlyRenderingInfo); - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshDepthPipeline()); - vkCmdSetViewport(CommandBuffer, 0, 1, &Viewport); - vkCmdSetScissor(CommandBuffer, 0, 1, &Scissor); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshDepthPipelineLayout(), 0, 1, - &Frame.DepthFrameDescriptorSet, 0, VK_NULL_HANDLE); + CommandList.BeginRendering(&DepthOnlyRenderingInfo); + CommandList.BindPipeline( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshDepthPipeline())); + CommandList.SetViewport(&Viewport); + CommandList.SetScissor(&Scissor); + const auto DepthFrameSets = RHIDescriptorSets(Frame.DepthFrameDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshDepthPipelineLayout()), 0, + DepthFrameSets); auto RecordSubmission = [&](const VisibleSubmission &Visible) { const RenderMeshSubmission &Submission = GetSubmission(Visible.SubmissionIndex); @@ -685,12 +699,12 @@ void VulkanSceneRenderer::RecordDepthPrepassPass( MeshGraphicsPushConstants PushConstants{}; PushConstants.Model = Submission.Transform; - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetMeshDepthPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetMeshDepthPipelineLayout()), VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(CommandBuffer, *Mesh); - vkCmdDrawIndexed(CommandBuffer, Mesh->IndexCount, 1, 0, 0, 0); + BindMeshBuffers(CommandList, *Mesh); + CommandList.DrawIndexed(Mesh->IndexCount, 1, 0, 0, 0); }; for (const VisibleSubmission &Visible : OpaqueGraphicsSubmissions) { @@ -700,11 +714,11 @@ void VulkanSceneRenderer::RecordDepthPrepassPass( RecordSubmission(Visible); } - vkCmdEndRendering(CommandBuffer); + CommandList.EndRendering(); } void VulkanSceneRenderer::RecordComputeMeshPathPass( - VkCommandBuffer CommandBuffer, const MeshFrameResources &Frame) const { + IRHICommandList &CommandList, const MeshFrameResources &Frame) const { for (const VisibleSubmission &Visible : m_PreparedSceneState.VisibleSubmissions.Compute) { VulkanMesh *Mesh = ResolveVisibleMesh(Visible); @@ -712,27 +726,27 @@ void VulkanSceneRenderer::RecordComputeMeshPathPass( continue; } - std::array DescriptorSets = { - Frame.ComputeFrameDescriptorSet, Mesh->DescriptorSet}; + const std::array DescriptorSets = { + RHIHandle(Frame.ComputeFrameDescriptorSet), RHIHandle(Mesh->DescriptorSet)}; - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetMeshProjectPipeline()); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetMeshProjectPipelineLayout(), 0, - static_cast(DescriptorSets.size()), DescriptorSets.data(), 0, - VK_NULL_HANDLE); + CommandList.BindPipeline( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshProjectPipeline())); + CommandList.BindDescriptorSet( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshProjectPipelineLayout()), + 0, DescriptorSets); MeshProjectPushConstants ProjectPushConstants{}; ProjectPushConstants.Model = GetSubmission(Visible.SubmissionIndex).Transform; ProjectPushConstants.Counts.x = Mesh->VertexCount; - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetMeshProjectPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetMeshProjectPipelineLayout()), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(MeshProjectPushConstants), &ProjectPushConstants); const uint32_t VertexGroupCount = std::max(1u, (Mesh->VertexCount + 63u) / 64u); - vkCmdDispatch(CommandBuffer, VertexGroupCount, 1, 1); + CommandList.Dispatch(VertexGroupCount, 1, 1); VkBufferMemoryBarrier2 ProjectedVertexBarrier{ .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2, @@ -751,25 +765,25 @@ void VulkanSceneRenderer::RecordComputeMeshPathPass( .pNext = VK_NULL_HANDLE, .bufferMemoryBarrierCount = 1, .pBufferMemoryBarriers = &ProjectedVertexBarrier}; - vkCmdPipelineBarrier2(CommandBuffer, &ProjectDependencyInfo); + CommandList.PipelineBarrier(&ProjectDependencyInfo); - vkCmdBindPipeline(CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetMeshPipeline()); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, - m_Device->GetPipelineLibrary().GetMeshPipelineLayout(), 0, - static_cast(DescriptorSets.size()), DescriptorSets.data(), 0, - VK_NULL_HANDLE); + CommandList.BindPipeline( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshPipeline())); + CommandList.BindDescriptorSet( + RHIBindPoint::Compute, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshPipelineLayout()), 0, + DescriptorSets); MeshRasterPushConstants RasterPushConstants{}; RasterPushConstants.Counts.x = Mesh->TriangleCount; - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetMeshPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetMeshPipelineLayout()), VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(MeshRasterPushConstants), &RasterPushConstants); const uint32_t GroupCount = std::max(1u, (Mesh->TriangleCount + 63u) / 64u); - vkCmdDispatch(CommandBuffer, GroupCount, 1, 1); + CommandList.Dispatch(GroupCount, 1, 1); VkImageMemoryBarrier2 DrawImageBarrier{ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, @@ -791,12 +805,12 @@ void VulkanSceneRenderer::RecordComputeMeshPathPass( .pNext = VK_NULL_HANDLE, .imageMemoryBarrierCount = 1, .pImageMemoryBarriers = &DrawImageBarrier}; - vkCmdPipelineBarrier2(CommandBuffer, &ComputeDependencyInfo); + CommandList.PipelineBarrier(&ComputeDependencyInfo); } } void VulkanSceneRenderer::RecordOpaqueForwardPass( - VkCommandBuffer CommandBuffer, const MeshFrameResources &Frame) { + IRHICommandList &CommandList, const MeshFrameResources &Frame) { const auto &GraphicsSubmissions = m_PreparedSceneState.VisibleSubmissions.OpaqueGraphics; if (GraphicsSubmissions.empty()) { @@ -821,18 +835,20 @@ void VulkanSceneRenderer::RecordOpaqueForwardPass( VkRenderingInfo RenderingInfo = VkInit::RenderingInfo(DrawExtent, &ColorAttachment, &DepthAttachment); - vkCmdBeginRendering(CommandBuffer, &RenderingInfo); - vkCmdBindPipeline( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_PreparedSceneState.ForceWireframe - ? m_Device->GetPipelineLibrary().GetMeshWireframePipeline() - : m_Device->GetPipelineLibrary().GetMeshGraphicsPipeline()); - vkCmdSetViewport(CommandBuffer, 0, 1, &Viewport); - vkCmdSetScissor(CommandBuffer, 0, 1, &Scissor); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), 0, 1, - &Frame.GraphicsFrameDescriptorSet, 0, VK_NULL_HANDLE); + CommandList.BeginRendering(&RenderingInfo); + CommandList.BindPipeline( + RHIBindPoint::Graphics, + RHIHandle(m_PreparedSceneState.ForceWireframe + ? m_Device->GetPipelineLibrary().GetMeshWireframePipeline() + : m_Device->GetPipelineLibrary().GetMeshGraphicsPipeline())); + CommandList.SetViewport(&Viewport); + CommandList.SetScissor(&Scissor); + const auto GraphicsFrameSets = + RHIDescriptorSets(Frame.GraphicsFrameDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), + 0, GraphicsFrameSets); VkDescriptorSet BoundMaterialDescriptorSet = VK_NULL_HANDLE; #if !defined(NDEBUG) @@ -849,10 +865,11 @@ void VulkanSceneRenderer::RecordOpaqueForwardPass( m_Device->GetMaterialResources().ResolveMaterialDescriptorSet( m_Device->ResolveMaterialHandle(Submission.MaterialHandle)); if (MaterialDescriptorSet != BoundMaterialDescriptorSet) { - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), 1, 1, - &MaterialDescriptorSet, 0, VK_NULL_HANDLE); + const auto MaterialSets = RHIDescriptorSets(MaterialDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), + 1, MaterialSets); BoundMaterialDescriptorSet = MaterialDescriptorSet; #if !defined(NDEBUG) ++MaterialDescriptorBindCount; @@ -867,15 +884,15 @@ void VulkanSceneRenderer::RecordOpaqueForwardPass( PushConstants.Metallic = Material->Metallic; PushConstants.Roughness = Material->Roughness; } - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(CommandBuffer, *Mesh); - vkCmdDrawIndexed(CommandBuffer, Mesh->IndexCount, 1, 0, 0, 0); + BindMeshBuffers(CommandList, *Mesh); + CommandList.DrawIndexed(Mesh->IndexCount, 1, 0, 0, 0); } - vkCmdEndRendering(CommandBuffer); + CommandList.EndRendering(); #if !defined(NDEBUG) AccessFrameStats().DebugGraphicsMaterialDescriptorUpdates = @@ -886,7 +903,7 @@ void VulkanSceneRenderer::RecordOpaqueForwardPass( } void VulkanSceneRenderer::RecordTranslucentForwardPass( - VkCommandBuffer CommandBuffer, const MeshFrameResources &Frame) { + IRHICommandList &CommandList, const MeshFrameResources &Frame) { auto &GraphicsSubmissions = m_PreparedSceneState.VisibleSubmissions.TranslucentGraphics; if (GraphicsSubmissions.empty()) { @@ -916,18 +933,21 @@ void VulkanSceneRenderer::RecordTranslucentForwardPass( VkRenderingInfo RenderingInfo = VkInit::RenderingInfo(DrawExtent, &ColorAttachment, &DepthAttachment); - vkCmdBeginRendering(CommandBuffer, &RenderingInfo); - vkCmdBindPipeline( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_PreparedSceneState.ForceWireframe - ? m_Device->GetPipelineLibrary().GetMeshWireframePipeline() - : m_Device->GetPipelineLibrary().GetMeshGraphicsAlphaBlendPipeline()); - vkCmdSetViewport(CommandBuffer, 0, 1, &Viewport); - vkCmdSetScissor(CommandBuffer, 0, 1, &Scissor); - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), 0, 1, - &Frame.GraphicsFrameDescriptorSet, 0, VK_NULL_HANDLE); + CommandList.BeginRendering(&RenderingInfo); + CommandList.BindPipeline( + RHIBindPoint::Graphics, + RHIHandle(m_PreparedSceneState.ForceWireframe + ? m_Device->GetPipelineLibrary().GetMeshWireframePipeline() + : m_Device->GetPipelineLibrary() + .GetMeshGraphicsAlphaBlendPipeline())); + CommandList.SetViewport(&Viewport); + CommandList.SetScissor(&Scissor); + const auto GraphicsFrameSets = + RHIDescriptorSets(Frame.GraphicsFrameDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), + 0, GraphicsFrameSets); VkDescriptorSet BoundMaterialDescriptorSet = VK_NULL_HANDLE; #if !defined(NDEBUG) @@ -944,10 +964,11 @@ void VulkanSceneRenderer::RecordTranslucentForwardPass( m_Device->GetMaterialResources().ResolveMaterialDescriptorSet( m_Device->ResolveMaterialHandle(Submission.MaterialHandle)); if (MaterialDescriptorSet != BoundMaterialDescriptorSet) { - vkCmdBindDescriptorSets( - CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), 1, 1, - &MaterialDescriptorSet, 0, VK_NULL_HANDLE); + const auto MaterialSets = RHIDescriptorSets(MaterialDescriptorSet); + CommandList.BindDescriptorSet( + RHIBindPoint::Graphics, + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), + 1, MaterialSets); BoundMaterialDescriptorSet = MaterialDescriptorSet; #if !defined(NDEBUG) ++MaterialDescriptorBindCount; @@ -962,15 +983,15 @@ void VulkanSceneRenderer::RecordTranslucentForwardPass( PushConstants.Metallic = Material->Metallic; PushConstants.Roughness = Material->Roughness; } - vkCmdPushConstants( - CommandBuffer, m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout(), + CommandList.PushConstants( + RHIHandle(m_Device->GetPipelineLibrary().GetMeshGraphicsPipelineLayout()), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(MeshGraphicsPushConstants), &PushConstants); - BindMeshBuffers(CommandBuffer, *Mesh); - vkCmdDrawIndexed(CommandBuffer, Mesh->IndexCount, 1, 0, 0, 0); + BindMeshBuffers(CommandList, *Mesh); + CommandList.DrawIndexed(Mesh->IndexCount, 1, 0, 0, 0); } - vkCmdEndRendering(CommandBuffer); + CommandList.EndRendering(); #if !defined(NDEBUG) AccessFrameStats().DebugGraphicsMaterialDescriptorUpdates = @@ -981,36 +1002,68 @@ void VulkanSceneRenderer::RecordTranslucentForwardPass( } void VulkanSceneRenderer::EnsureDrawImageLayout( - VkCommandBuffer CommandBuffer, VkImageLayout DesiredLayout) { + IRHICommandList &CommandList, VkImageLayout DesiredLayout) { if (m_SceneDrawImageLayout == DesiredLayout) { return; } - VkUtil::TransitionImage(CommandBuffer, - m_Device->GetResourceManager().GetDrawImage().Image, - m_SceneDrawImageLayout, DesiredLayout); + VkImageMemoryBarrier2 ImageBarrier{ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + .pNext = VK_NULL_HANDLE, + .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT, + .dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .dstAccessMask = + VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT, + .oldLayout = m_SceneDrawImageLayout, + .newLayout = DesiredLayout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = m_Device->GetResourceManager().GetDrawImage().Image, + .subresourceRange = + VkInit::ImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT)}; + VkDependencyInfo DependencyInfo{.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .pNext = VK_NULL_HANDLE, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &ImageBarrier}; + CommandList.PipelineBarrier(&DependencyInfo); m_SceneDrawImageLayout = DesiredLayout; } void VulkanSceneRenderer::EnsureRasterDepthLayout( - VkCommandBuffer CommandBuffer, VkImageLayout DesiredLayout) { + IRHICommandList &CommandList, VkImageLayout DesiredLayout) { if (m_SceneRasterDepthLayout == DesiredLayout) { return; } - VkUtil::TransitionImage(CommandBuffer, - m_Device->GetResourceManager().GetRasterDepthImage().Image, - m_SceneRasterDepthLayout, DesiredLayout); + VkImageMemoryBarrier2 ImageBarrier{ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + .pNext = VK_NULL_HANDLE, + .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT, + .dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .dstAccessMask = + VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT, + .oldLayout = m_SceneRasterDepthLayout, + .newLayout = DesiredLayout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = m_Device->GetResourceManager().GetRasterDepthImage().Image, + .subresourceRange = + VkInit::ImageSubresourceRange(VK_IMAGE_ASPECT_DEPTH_BIT)}; + VkDependencyInfo DependencyInfo{.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .pNext = VK_NULL_HANDLE, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &ImageBarrier}; + CommandList.PipelineBarrier(&DependencyInfo); m_SceneRasterDepthLayout = DesiredLayout; } -void VulkanSceneRenderer::BindMeshBuffers(VkCommandBuffer CommandBuffer, +void VulkanSceneRenderer::BindMeshBuffers(IRHICommandList &CommandList, const VulkanMesh &Mesh) const { - VkDeviceSize VertexOffset = 0; - vkCmdBindVertexBuffers(CommandBuffer, 0, 1, &Mesh.VertexBuffer.Buffer, - &VertexOffset); - vkCmdBindIndexBuffer(CommandBuffer, Mesh.IndexBuffer.Buffer, 0, - VK_INDEX_TYPE_UINT32); + CommandList.BindVertexBuffer(0, RHIHandle(Mesh.VertexBuffer.Buffer), 0); + CommandList.BindIndexBuffer(RHIHandle(Mesh.IndexBuffer.Buffer), 0, + RHIIndexType::UInt32); } const RenderMeshSubmission & diff --git a/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.h b/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.h index 735aa1d..60c8c1a 100644 --- a/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.h +++ b/AxiomInternal/AxiomRHI/Vulkan/VulkanSceneRenderer.h @@ -29,7 +29,7 @@ class VulkanSceneRenderer final : public ISceneRendererBackend { std::optional ConsumeCapturedFrame() override; RendererFrameStats &AccessFrameStats() override; const RendererFrameStats &GetFrameStats() const override; - void RecordPreparedScenePasses(VkCommandBuffer CommandBuffer, RenderScene &Scene, + void RecordPreparedScenePasses(IRHICommandList &CommandList, RenderScene &Scene, uint64_t FrameNumber, RendererViewMode ViewMode); @@ -68,8 +68,8 @@ class VulkanSceneRenderer final : public ISceneRendererBackend { void RecordTranslucentForward(); void FinalizeSceneFrame(); void RenderFallbackBackground(RenderScene &Scene); - void DrawBackgroundPass(VkCommandBuffer CommandBuffer, RenderScene *Scene); - void BuildHzbPass(VkCommandBuffer CommandBuffer, MeshFrameResources &Frame); + void DrawBackgroundPass(IRHICommandList &CommandList, RenderScene *Scene); + void BuildHzbPass(IRHICommandList &CommandList, MeshFrameResources &Frame); void QueueScenePass(ScenePassPrimitive Pass); void ResetPreparedSceneState(); glm::vec3 ComputeWorldCenter(const RenderMeshSubmission &Submission, @@ -80,19 +80,19 @@ class VulkanSceneRenderer final : public ISceneRendererBackend { void UpdateDepthFrameDescriptors(const MeshFrameResources &Frame) const; void UpdateGraphicsFrameDescriptors(const MeshFrameResources &Frame) const; void PrepareGraphicsMaterialDescriptors(); - void RecordDepthPrepassPass(VkCommandBuffer CommandBuffer, + void RecordDepthPrepassPass(IRHICommandList &CommandList, const MeshFrameResources &Frame) const; - void RecordComputeMeshPathPass(VkCommandBuffer CommandBuffer, + void RecordComputeMeshPathPass(IRHICommandList &CommandList, const MeshFrameResources &Frame) const; - void RecordOpaqueForwardPass(VkCommandBuffer CommandBuffer, + void RecordOpaqueForwardPass(IRHICommandList &CommandList, const MeshFrameResources &Frame); - void RecordTranslucentForwardPass(VkCommandBuffer CommandBuffer, + void RecordTranslucentForwardPass(IRHICommandList &CommandList, const MeshFrameResources &Frame); - void EnsureDrawImageLayout(VkCommandBuffer CommandBuffer, + void EnsureDrawImageLayout(IRHICommandList &CommandList, VkImageLayout DesiredLayout); - void EnsureRasterDepthLayout(VkCommandBuffer CommandBuffer, + void EnsureRasterDepthLayout(IRHICommandList &CommandList, VkImageLayout DesiredLayout); - void BindMeshBuffers(VkCommandBuffer CommandBuffer, const VulkanMesh &Mesh) const; + void BindMeshBuffers(IRHICommandList &CommandList, const VulkanMesh &Mesh) const; const RenderMeshSubmission &GetSubmission(uint32_t SubmissionIndex) const; VulkanMesh *ResolveVisibleMesh(const VisibleSubmission &Visible) const; VkExtent2D GetDrawExtent2D() const;