summaryrefslogtreecommitdiffstats
path: root/tools/gfx/vulkan/vk-command-buffer.h
diff options
context:
space:
mode:
authorlucy96chen <47800040+lucy96chen@users.noreply.github.com>2022-05-26 10:54:35 -0700
committerGitHub <noreply@github.com>2022-05-26 10:54:35 -0700
commit43e1b7cdc70b2fcac8a3e8ee72f5bc91726f4ec5 (patch)
tree1e4701b4ab324a199b81e1f6c671f6660f1050c5 /tools/gfx/vulkan/vk-command-buffer.h
parent5ff4f42c636a67724523e4fe60697cfac64908cd (diff)
Split render-vk.h/.cpp into a set of smaller files (#2244)
* Some preliminary work on splitting render-vk * render-vk split, tests currently crash on null reference * fixed circular include
Diffstat (limited to 'tools/gfx/vulkan/vk-command-buffer.h')
-rw-r--r--tools/gfx/vulkan/vk-command-buffer.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/tools/gfx/vulkan/vk-command-buffer.h b/tools/gfx/vulkan/vk-command-buffer.h
new file mode 100644
index 000000000..3d6c86a95
--- /dev/null
+++ b/tools/gfx/vulkan/vk-command-buffer.h
@@ -0,0 +1,71 @@
+// vk-command-buffer.h
+#pragma once
+
+#include "vk-base.h"
+#include "vk-command-encoder.h"
+#include "vk-shader-object.h"
+#include "vk-transient-heap.h"
+
+namespace gfx
+{
+
+using namespace Slang;
+
+namespace vk
+{
+
+class CommandBufferImpl
+ : public ICommandBuffer
+ , public ComObject
+{
+public:
+ // There are a pair of cyclic references between a `TransientResourceHeap` and
+ // a `CommandBuffer` created from the heap. We need to break the cycle when
+ // the public reference count of a command buffer drops to 0.
+ SLANG_COM_OBJECT_IUNKNOWN_ALL
+ ICommandBuffer* getInterface(const Guid& guid);
+ virtual void comFree() override;
+
+public:
+ VkCommandBuffer m_commandBuffer;
+ VkCommandBuffer m_preCommandBuffer = VK_NULL_HANDLE;
+ VkCommandPool m_pool;
+ DeviceImpl* m_renderer;
+ BreakableReference<TransientResourceHeapImpl> m_transientHeap;
+ bool m_isPreCommandBufferEmpty = true;
+ RootShaderObjectImpl m_rootObject;
+
+ RefPtr<ResourceCommandEncoder> m_resourceCommandEncoder;
+ RefPtr<ComputeCommandEncoder> m_computeCommandEncoder;
+ RefPtr<RenderCommandEncoder> m_renderCommandEncoder;
+ RefPtr<RayTracingCommandEncoder> m_rayTracingCommandEncoder;
+
+ // Command buffers are deallocated by its command pool,
+ // so no need to free individually.
+ ~CommandBufferImpl() = default;
+
+ Result init(DeviceImpl* renderer, VkCommandPool pool, TransientResourceHeapImpl* transientHeap);
+
+ void beginCommandBuffer();
+
+ Result createPreCommandBuffer();
+
+ VkCommandBuffer getPreCommandBuffer();
+
+public:
+ virtual SLANG_NO_THROW void SLANG_MCALL encodeRenderCommands(
+ IRenderPassLayout* renderPass,
+ IFramebuffer* framebuffer,
+ IRenderCommandEncoder** outEncoder) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ encodeComputeCommands(IComputeCommandEncoder** outEncoder) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ encodeResourceCommands(IResourceCommandEncoder** outEncoder) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL
+ encodeRayTracingCommands(IRayTracingCommandEncoder** outEncoder) override;
+ virtual SLANG_NO_THROW void SLANG_MCALL close() override;
+ virtual SLANG_NO_THROW Result SLANG_MCALL getNativeHandle(InteropHandle* outHandle) override;
+};
+
+} // namespace vk
+} // namespace gfx