Plasma Engine  2.0
Loading...
Searching...
No Matches
CommandEncoderImplVulkan.h
1
2#pragma once
3
4#include <RendererVulkan/RendererVulkanDLL.h>
5
6#include <Foundation/Types/Bitflags.h>
7#include <RendererFoundation/CommandEncoder/CommandEncoderPlatformInterface.h>
8#include <RendererFoundation/Resources/RenderTargetSetup.h>
9#include <RendererVulkan/Cache/ResourceCacheVulkan.h>
10
11#include <vulkan/vulkan.hpp>
12
25
26
28{
29public:
32
33 void Reset();
34
35 void SetCurrentCommandBuffer(vk::CommandBuffer* commandBuffer, plPipelineBarrierVulkan* pipelineBarrier);
36 void CommandBufferSubmitted(vk::Fence submitFence);
37
38 // plGALCommandEncoderCommonPlatformInterface
39 // State setting functions
40
41 virtual void SetShaderPlatform(const plGALShader* pShader) override;
42
43 virtual void SetConstantBufferPlatform(const plShaderResourceBinding& binding, const plGALBuffer* pBuffer) override;
44 virtual void SetSamplerStatePlatform(const plShaderResourceBinding& binding, const plGALSamplerState* pSamplerState) override;
45 virtual void SetResourceViewPlatform(const plShaderResourceBinding& binding, const plGALTextureResourceView* pResourceView) override;
46 virtual void SetResourceViewPlatform(const plShaderResourceBinding& binding, const plGALBufferResourceView* pResourceView) override;
47 virtual void SetUnorderedAccessViewPlatform(const plShaderResourceBinding& binding, const plGALTextureUnorderedAccessView* pUnorderedAccessView) override;
48 virtual void SetUnorderedAccessViewPlatform(const plShaderResourceBinding& binding, const plGALBufferUnorderedAccessView* pUnorderedAccessView) override;
49 virtual void SetPushConstantsPlatform(plArrayPtr<const plUInt8> data) override;
50
51 // GPU -> CPU query functions
52
53 virtual plGALTimestampHandle InsertTimestampPlatform() override;
54 virtual plGALOcclusionHandle BeginOcclusionQueryPlatform(plEnum<plGALQueryType> type) override;
55 virtual void EndOcclusionQueryPlatform(plGALOcclusionHandle hOcclusion) override;
56 virtual plGALFenceHandle InsertFencePlatform() override;
57
58
59 // Resource update functions
60
61 virtual void ClearUnorderedAccessViewPlatform(const plGALTextureUnorderedAccessView* pUnorderedAccessView, plVec4 clearValues) override;
62 virtual void ClearUnorderedAccessViewPlatform(const plGALBufferUnorderedAccessView* pUnorderedAccessView, plVec4 clearValues) override;
63
64 virtual void ClearUnorderedAccessViewPlatform(const plGALTextureUnorderedAccessView* pUnorderedAccessView, plVec4U32 clearValues) override;
65 virtual void ClearUnorderedAccessViewPlatform(const plGALBufferUnorderedAccessView* pUnorderedAccessView, plVec4U32 clearValues) override;
66
67 virtual void CopyBufferPlatform(const plGALBuffer* pDestination, const plGALBuffer* pSource) override;
68 virtual void CopyBufferRegionPlatform(const plGALBuffer* pDestination, plUInt32 uiDestOffset, const plGALBuffer* pSource, plUInt32 uiSourceOffset, plUInt32 uiByteCount) override;
69
70 virtual void UpdateBufferPlatform(const plGALBuffer* pDestination, plUInt32 uiDestOffset, plArrayPtr<const plUInt8> pSourceData, plGALUpdateMode::Enum updateMode) override;
71
72 virtual void CopyTexturePlatform(const plGALTexture* pDestination, const plGALTexture* pSource) override;
73 virtual void CopyTextureRegionPlatform(const plGALTexture* pDestination, const plGALTextureSubresource& DestinationSubResource, const plVec3U32& DestinationPoint, const plGALTexture* pSource, const plGALTextureSubresource& SourceSubResource, const plBoundingBoxu32& Box) override;
74
75 virtual void UpdateTexturePlatform(const plGALTexture* pDestination, const plGALTextureSubresource& DestinationSubResource, const plBoundingBoxu32& DestinationBox, const plGALSystemMemoryDescription& pSourceData) override;
76
77 virtual void ResolveTexturePlatform(const plGALTexture* pDestination, const plGALTextureSubresource& DestinationSubResource, const plGALTexture* pSource, const plGALTextureSubresource& SourceSubResource) override;
78
79 virtual void ReadbackTexturePlatform(const plGALTexture* pTexture) override;
80
81 virtual void CopyTextureReadbackResultPlatform(const plGALTexture* pTexture, plArrayPtr<plGALTextureSubresource> SourceSubResource, plArrayPtr<plGALSystemMemoryDescription> TargetData) override;
82
83 virtual void GenerateMipMapsPlatform(const plGALTextureResourceView* pResourceView) override;
84
85 void CopyImageToBuffer(const plGALTextureVulkan* pSource, const plGALBufferVulkan* pDestination);
86
87 // Misc
88
89 virtual void FlushPlatform() override;
90
91 // Debug helper functions
92
93 virtual void PushMarkerPlatform(const char* szMarker) override;
94 virtual void PopMarkerPlatform() override;
95 virtual void InsertEventMarkerPlatform(const char* szMarker) override;
96
97
98 // plGALCommandEncoderComputePlatformInterface
99 // Dispatch
100 virtual void BeginComputePlatform() override;
101 virtual void EndComputePlatform() override;
102
103 virtual plResult DispatchPlatform(plUInt32 uiThreadGroupCountX, plUInt32 uiThreadGroupCountY, plUInt32 uiThreadGroupCountZ) override;
104 virtual plResult DispatchIndirectPlatform(const plGALBuffer* pIndirectArgumentBuffer, plUInt32 uiArgumentOffsetInBytes) override;
105
106
107 // plGALCommandEncoderRenderPlatformInterface
108 virtual void BeginRenderingPlatform(const plGALRenderingSetup& renderingSetup) override;
109 virtual void EndRenderingPlatform() override;
110
111 // Draw functions
112
113 virtual void ClearPlatform(const plColor& ClearColor, plUInt32 uiRenderTargetClearMask, bool bClearDepth, bool bClearStencil, float fDepthClear, plUInt8 uiStencilClear) override;
114
115 virtual plResult DrawPlatform(plUInt32 uiVertexCount, plUInt32 uiStartVertex) override;
116 virtual plResult DrawIndexedPlatform(plUInt32 uiIndexCount, plUInt32 uiStartIndex) override;
117 virtual plResult DrawIndexedInstancedPlatform(plUInt32 uiIndexCountPerInstance, plUInt32 uiInstanceCount, plUInt32 uiStartIndex) override;
118 virtual plResult DrawIndexedInstancedIndirectPlatform(const plGALBuffer* pIndirectArgumentBuffer, plUInt32 uiArgumentOffsetInBytes) override;
119 virtual plResult DrawInstancedPlatform(plUInt32 uiVertexCountPerInstance, plUInt32 uiInstanceCount, plUInt32 uiStartVertex) override;
120 virtual plResult DrawInstancedIndirectPlatform(const plGALBuffer* pIndirectArgumentBuffer, plUInt32 uiArgumentOffsetInBytes) override;
121
122 // State functions
123
124 virtual void SetIndexBufferPlatform(const plGALBuffer* pIndexBuffer) override;
125 virtual void SetVertexBufferPlatform(plUInt32 uiSlot, const plGALBuffer* pVertexBuffer) override;
126 virtual void SetVertexDeclarationPlatform(const plGALVertexDeclaration* pVertexDeclaration) override;
127 virtual void SetPrimitiveTopologyPlatform(plGALPrimitiveTopology::Enum Topology) override;
128
129 virtual void SetBlendStatePlatform(const plGALBlendState* pBlendState, const plColor& BlendFactor, plUInt32 uiSampleMask) override;
130 virtual void SetDepthStencilStatePlatform(const plGALDepthStencilState* pDepthStencilState, plUInt8 uiStencilRefValue) override;
131 virtual void SetRasterizerStatePlatform(const plGALRasterizerState* pRasterizerState) override;
132
133 virtual void SetViewportPlatform(const plRectFloat& rect, float fMinDepth, float fMaxDepth) override;
134 virtual void SetScissorRectPlatform(const plRectU32& rect) override;
135
136
137
138private:
139 // Map resources from sets then slots to pointer.
140 struct SetResources
141 {
142 plDynamicArray<const plGALBufferVulkan*> m_pBoundConstantBuffers;
145 plDynamicArray<const plGALTextureUnorderedAccessViewVulkan*> m_pBoundTextureUnorderedAccessViews;
146 plDynamicArray<const plGALBufferUnorderedAccessViewVulkan*> m_pBoundBufferUnorderedAccessViews;
148 };
149
150private:
151 plResult FlushDeferredStateChanges();
152 const plGALTextureResourceViewVulkan* GetTextureResourceView(const SetResources& resources, const plShaderResourceBinding& mapping);
153 const plGALBufferResourceViewVulkan* GetBufferResourceView(const SetResources& resources, const plShaderResourceBinding& mapping);
154 const plGALTextureUnorderedAccessViewVulkan* GetTextureUAV(const SetResources& resources, const plShaderResourceBinding& mapping);
155 const plGALBufferUnorderedAccessViewVulkan* GetBufferUAV(const SetResources& resources, const plShaderResourceBinding& mapping);
156
157private:
158 plGALDeviceVulkan& m_GALDeviceVulkan;
159 vk::Device m_vkDevice;
160
161 vk::CommandBuffer* m_pCommandBuffer = nullptr;
162 plPipelineBarrierVulkan* m_pPipelineBarrier = nullptr;
163
164 // Cache flags.
165 bool m_bPipelineStateDirty = true;
166 bool m_bViewportDirty = true;
167 bool m_bIndexBufferDirty = false;
168 bool m_bDescriptorsDirty = false;
169 plGAL::ModifiedRange m_BoundVertexBuffersRange;
170 bool m_bRenderPassActive = false;
171 bool m_bClearSubmitted = false;
172 bool m_bInsideCompute = false;
173 bool m_bPushConstantsDirty = false;
174
175 // Bound objects for deferred state flushes
179 vk::Framebuffer m_frameBuffer;
180 vk::RenderPassBeginInfo m_renderPass;
182 vk::ImageAspectFlags m_depthMask = {};
183 plUInt32 m_uiLayers = 0;
184
185 vk::Viewport m_viewport;
186 vk::Rect2D m_scissor;
187 bool m_bScissorEnabled = false;
188
189 const plGALRenderTargetView* m_pBoundRenderTargets[PL_GAL_MAX_RENDERTARGET_COUNT] = {};
190 const plGALRenderTargetView* m_pBoundDepthStencilTarget = nullptr;
191 plUInt32 m_uiBoundRenderTargetCount;
192
193 const plGALBufferVulkan* m_pIndexBuffer = nullptr;
194 vk::Buffer m_pBoundVertexBuffers[PL_GAL_MAX_VERTEX_BUFFER_COUNT];
195 vk::DeviceSize m_VertexBufferOffsets[PL_GAL_MAX_VERTEX_BUFFER_COUNT] = {};
196
198
199 plDeque<vk::DescriptorImageInfo> m_TextureAndSampler;
202
203 plDynamicArray<plUInt8> m_PushConstants;
204};
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
An axis-aligned bounding box implementation.
Definition BoundingBox.h:12
plColor represents an RGBA color in linear color space. Values are stored as float,...
Definition Color.h:44
Definition Deque.h:270
Definition DynamicArray.h:81
Definition FencePoolVulkan.h:36
Definition State.h:7
Definition StateVulkan.h:9
Definition Buffer.h:8
Definition ResourceView.h:30
Definition ResourceViewVulkan.h:33
Definition UnorderedAccesView.h:28
Definition UnorderedAccessViewVulkan.h:34
Definition BufferVulkan.h:11
Definition CommandEncoderPlatformInterface.h:13
Definition CommandEncoderImplVulkan.h:28
Definition State.h:20
Definition StateVulkan.h:30
The Vulkan device implementation of the graphics abstraction layer.
Definition DeviceVulkan.h:58
Definition State.h:33
Definition StateVulkan.h:50
Definition RenderTargetView.h:8
Definition State.h:46
Definition StateVulkan.h:70
Definition Shader.h:7
Definition ShaderVulkan.h:13
Definition Texture.h:8
Definition ResourceView.h:11
Definition ResourceViewVulkan.h:12
Definition UnorderedAccesView.h:11
Definition UnorderedAccessViewVulkan.h:11
Definition TextureVulkan.h:11
Definition VertexDeclaration.h:8
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition PipelineBarrierVulkan.h:19
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Definition RendererFoundationDLL.h:502
Definition RenderTargetSetup.h:44
Definition RendererFoundationDLL.h:365
Definition RendererFoundationDLL.h:359
Enum
Definition RendererFoundationDLL.h:336
A generic id class that holds an id combined of an instance index and a generation counter.
Definition Id.h:52
Definition ResourceCacheVulkan.h:56
Definition ResourceCacheVulkan.h:40
Definition ResourceCacheVulkan.h:34
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
Shader reflection of a single shader resource (texture, constant buffer, etc.).
Definition ShaderByteCode.h:77