Pyrogenesis  trunk
DeviceCommandContext.h
Go to the documentation of this file.
1 /* Copyright (C) 2023 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef INCLUDED_RENDERER_VULKAN_DEVICECOMMANDCONTEXT
19 #define INCLUDED_RENDERER_VULKAN_DEVICECOMMANDCONTEXT
20 
23 
24 #include <glad/vulkan.h>
25 #include <memory>
26 #include <vector>
27 
28 namespace Renderer
29 {
30 
31 namespace Backend
32 {
33 
34 namespace Vulkan
35 {
36 
37 class CBuffer;
38 class CDevice;
39 class CFramebuffer;
40 class CGraphicsPipelineState;
41 class CRingCommandContext;
42 class CShaderProgram;
43 class CVertexInputLayout;
44 
46 {
47 public:
48  ~CDeviceCommandContext() override;
49 
50  IDevice* GetDevice() override;
51 
52  void SetGraphicsPipelineState(IGraphicsPipelineState* pipelineState) override;
53 
54  void BlitFramebuffer(IFramebuffer* destinationFramebuffer, IFramebuffer* sourceFramebuffer) override;
55 
56  void ClearFramebuffer(const bool color, const bool depth, const bool stencil) override;
57  void BeginFramebufferPass(IFramebuffer* framebuffer) override;
58  void EndFramebufferPass() override;
60  const uint32_t x, const uint32_t y, const uint32_t width, const uint32_t height,
61  void* data) override;
62 
63  void UploadTexture(ITexture* texture, const Format dataFormat,
64  const void* data, const size_t dataSize,
65  const uint32_t level = 0, const uint32_t layer = 0) override;
66  void UploadTextureRegion(ITexture* texture, const Format dataFormat,
67  const void* data, const size_t dataSize,
68  const uint32_t xOffset, const uint32_t yOffset,
69  const uint32_t width, const uint32_t height,
70  const uint32_t level = 0, const uint32_t layer = 0) override;
71 
72  void UploadBuffer(IBuffer* buffer, const void* data, const uint32_t dataSize) override;
73  void UploadBuffer(IBuffer* buffer, const UploadBufferFunction& uploadFunction) override;
74  void UploadBufferRegion(
75  IBuffer* buffer, const void* data, const uint32_t dataOffset, const uint32_t dataSize) override;
76  void UploadBufferRegion(
77  IBuffer* buffer, const uint32_t dataOffset, const uint32_t dataSize,
78  const UploadBufferFunction& uploadFunction) override;
79 
80  void SetScissors(const uint32_t scissorCount, const Rect* scissors) override;
81  void SetViewports(const uint32_t viewportCount, const Rect* viewports) override;
82 
84  IVertexInputLayout* vertexInputLayout) override;
85 
86  void SetVertexBuffer(
87  const uint32_t bindingSlot, IBuffer* buffer, const uint32_t offset) override;
89  const uint32_t bindingSlot, const void* data, const uint32_t dataSize) override;
90 
91  void SetIndexBuffer(IBuffer* buffer) override;
92  void SetIndexBufferData(const void* data, const uint32_t dataSize) override;
93 
94  void BeginPass() override;
95  void EndPass() override;
96 
97  void Draw(const uint32_t firstVertex, const uint32_t vertexCount) override;
98  void DrawIndexed(
99  const uint32_t firstIndex, const uint32_t indexCount, const int32_t vertexOffset) override;
100  void DrawInstanced(
101  const uint32_t firstVertex, const uint32_t vertexCount,
102  const uint32_t firstInstance, const uint32_t instanceCount) override;
104  const uint32_t firstIndex, const uint32_t indexCount,
105  const uint32_t firstInstance, const uint32_t instanceCount,
106  const int32_t vertexOffset) override;
107  void DrawIndexedInRange(
108  const uint32_t firstIndex, const uint32_t indexCount,
109  const uint32_t start, const uint32_t end) override;
110 
111  void SetTexture(const int32_t bindingSlot, ITexture* texture) override;
112 
113  void SetUniform(
114  const int32_t bindingSlot,
115  const float value) override;
116  void SetUniform(
117  const int32_t bindingSlot,
118  const float valueX, const float valueY) override;
119  void SetUniform(
120  const int32_t bindingSlot,
121  const float valueX, const float valueY,
122  const float valueZ) override;
123  void SetUniform(
124  const int32_t bindingSlot,
125  const float valueX, const float valueY,
126  const float valueZ, const float valueW) override;
127  void SetUniform(
128  const int32_t bindingSlot, PS::span<const float> values) override;
129 
130  void BeginScopedLabel(const char* name) override;
131  void EndScopedLabel() override;
132 
133  void Flush() override;
134 
135 private:
136  friend class CDevice;
137 
138  static std::unique_ptr<IDeviceCommandContext> Create(CDevice* device);
139 
141 
142  void PreDraw();
144  void BindVertexBuffer(const uint32_t bindingSlot, CBuffer* buffer, uint32_t offset);
145  void BindIndexBuffer(CBuffer* buffer, uint32_t offset);
146 
147  CDevice* m_Device = nullptr;
148 
149  bool m_DebugScopedLabels = false;
150 
151  std::unique_ptr<CRingCommandContext> m_PrependCommandContext;
152  std::unique_ptr<CRingCommandContext> m_CommandContext;
153 
159  VkPipeline m_LastBoundPipeline = VK_NULL_HANDLE;
160 
162  bool m_InsidePass = false;
163 
164  // Currently bound buffers to skip the same buffer bind.
167 
168  // TODO: reduce code duplication.
169  std::unique_ptr<CBuffer> m_UniformBuffer;
170  std::unique_ptr<CBuffer> m_UniformStagingBuffer;
171  VkDescriptorPool m_UniformDescriptorPool = VK_NULL_HANDLE;
172  VkDescriptorSet m_UniformDescriptorSet = VK_NULL_HANDLE;
173  // TODO: combine buffers.
174  // Vertex buffer for in-place vertex data.
175  std::unique_ptr<CBuffer> m_InPlaceVertexBuffer;
176  std::unique_ptr<CBuffer> m_InPlaceIndexBuffer;
177  std::unique_ptr<CBuffer> m_InPlaceVertexStagingBuffer;
178  std::unique_ptr<CBuffer> m_InPlaceIndexStagingBuffer;
182  // TODO: add descriptions.
188 };
189 
190 } // namespace Vulkan
191 
192 } // namespace Backend
193 
194 } // namespace Renderer
195 
196 #endif // INCLUDED_RENDERER_VULKAN_DEVICECOMMANDCONTEXT
void SetVertexBuffer(const uint32_t bindingSlot, IBuffer *buffer, const uint32_t offset) override
Definition: DeviceCommandContext.cpp:643
CVertexInputLayout * m_VertexInputLayout
Definition: DeviceCommandContext.h:155
void SetIndexBuffer(IBuffer *buffer) override
Definition: DeviceCommandContext.cpp:664
Definition: DeviceCommandContext.h:45
Definition: IBuffer.h:31
void BeginFramebufferPass(IFramebuffer *framebuffer) override
Starts a framebuffer pass, performs attachment load operations.
Definition: DeviceCommandContext.cpp:400
void SetTexture(const int32_t bindingSlot, ITexture *texture) override
Definition: DeviceCommandContext.cpp:736
void BeginScopedLabel(const char *name) override
Definition: DeviceCommandContext.cpp:801
CDevice * m_Device
Definition: DeviceCommandContext.h:147
void SetViewports(const uint32_t viewportCount, const Rect *viewports) override
Definition: DeviceCommandContext.cpp:619
void Draw(const uint32_t firstVertex, const uint32_t vertexCount) override
Definition: DeviceCommandContext.cpp:696
std::function< void(u8 *)> UploadBufferFunction
Definition: IDeviceCommandContext.h:84
Definition: ITexture.h:33
void ClearFramebuffer(const bool color, const bool depth, const bool stencil) override
Clears all mentioned attachments.
Definition: DeviceCommandContext.cpp:348
static std::unique_ptr< IDeviceCommandContext > Create(CDevice *device)
Definition: DeviceCommandContext.cpp:134
std::unique_ptr< CBuffer > m_InPlaceIndexBuffer
Definition: DeviceCommandContext.h:176
void * m_InPlaceVertexStagingBufferMappedData
Definition: DeviceCommandContext.h:179
Definition: ShaderProgram.h:45
VkDescriptorPool m_UniformDescriptorPool
Definition: DeviceCommandContext.h:171
Definition: Buffer.h:38
CGraphicsPipelineState * m_GraphicsPipelineState
Definition: DeviceCommandContext.h:154
std::unique_ptr< CBuffer > m_UniformBuffer
Definition: DeviceCommandContext.h:169
uint32_t m_UniformOffset
Definition: DeviceCommandContext.h:186
void PreDraw()
Definition: DeviceCommandContext.cpp:887
IVertexInputLayout stores precompiled list of vertex attributes.
Definition: IShaderProgram.h:73
VkPipeline m_LastBoundPipeline
Definition: DeviceCommandContext.h:159
void SetVertexBufferData(const uint32_t bindingSlot, const void *data, const uint32_t dataSize) override
Definition: DeviceCommandContext.cpp:649
void UploadBufferRegion(IBuffer *buffer, const void *data, const uint32_t dataOffset, const uint32_t dataSize) override
Definition: DeviceCommandContext.cpp:567
void SetIndexBufferData(const void *data, const uint32_t dataSize) override
Definition: DeviceCommandContext.cpp:669
void EndFramebufferPass() override
Finishes a framebuffer pass, performs attachment store operations.
Definition: DeviceCommandContext.cpp:482
Definition: Device.h:59
void SetVertexInputLayout(IVertexInputLayout *vertexInputLayout) override
Binds the vertex input layout.
Definition: DeviceCommandContext.cpp:635
void UploadBuffer(IBuffer *buffer, const void *data, const uint32_t dataSize) override
Definition: DeviceCommandContext.cpp:553
CBuffer * m_BoundIndexBuffer
Definition: DeviceCommandContext.h:165
void SetUniform(const int32_t bindingSlot, const float value) override
Definition: DeviceCommandContext.cpp:760
bool m_InsideFramebufferPass
Definition: DeviceCommandContext.h:161
Format
Definition: Format.h:27
void ReadbackFramebufferSync(const uint32_t x, const uint32_t y, const uint32_t width, const uint32_t height, void *data) override
Definition: DeviceCommandContext.cpp:523
void SetGraphicsPipelineState(IGraphicsPipelineState *pipelineState) override
Binds the graphics pipeline state.
Definition: DeviceCommandContext.cpp:229
void Flush() override
Definition: DeviceCommandContext.cpp:818
bool m_IsPipelineStateDirty
Definition: DeviceCommandContext.h:158
uint32_t m_UniformIndexOffset
Definition: DeviceCommandContext.h:187
Definition: Framebuffer.h:39
void DrawIndexedInRange(const uint32_t firstIndex, const uint32_t indexCount, const uint32_t start, const uint32_t end) override
Definition: DeviceCommandContext.cpp:729
void DrawInstanced(const uint32_t firstVertex, const uint32_t vertexCount, const uint32_t firstInstance, const uint32_t instanceCount) override
Definition: DeviceCommandContext.cpp:710
bool m_InsidePass
Definition: DeviceCommandContext.h:162
void EndPass() override
Definition: DeviceCommandContext.cpp:690
Definition: IDevice.h:47
std::unique_ptr< CBuffer > m_UniformStagingBuffer
Definition: DeviceCommandContext.h:170
~CDeviceCommandContext() override
Definition: DeviceCommandContext.cpp:214
A holder for precompiled graphics pipeline description.
Definition: PipelineState.h:190
void SetScissors(const uint32_t scissorCount, const Rect *scissors) override
Definition: DeviceCommandContext.cpp:583
CFramebuffer * m_Framebuffer
Definition: DeviceCommandContext.h:156
std::unique_ptr< CBuffer > m_InPlaceVertexBuffer
Definition: DeviceCommandContext.h:175
IDevice * GetDevice() override
Definition: DeviceCommandContext.cpp:224
CShaderProgram * m_ShaderProgram
Definition: DeviceCommandContext.h:157
void BindIndexBuffer(CBuffer *buffer, uint32_t offset)
Definition: DeviceCommandContext.cpp:952
std::unique_ptr< CBuffer > m_InPlaceVertexStagingBuffer
Definition: DeviceCommandContext.h:177
Backend
Definition: Backend.h:27
std::unique_ptr< CRingCommandContext > m_CommandContext
Definition: DeviceCommandContext.h:152
void DrawIndexedInstanced(const uint32_t firstIndex, const uint32_t indexCount, const uint32_t firstInstance, const uint32_t instanceCount, const int32_t vertexOffset) override
Definition: DeviceCommandContext.cpp:719
uint32_t m_InPlaceBlockIndex
Definition: DeviceCommandContext.h:183
VkDescriptorSet m_UniformDescriptorSet
Definition: DeviceCommandContext.h:172
void ApplyPipelineStateIfDirty()
Definition: DeviceCommandContext.cpp:912
uint32_t m_BoundIndexBufferOffset
Definition: DeviceCommandContext.h:166
void EndScopedLabel() override
Definition: DeviceCommandContext.cpp:811
void DrawIndexed(const uint32_t firstIndex, const uint32_t indexCount, const int32_t vertexOffset) override
Definition: DeviceCommandContext.cpp:702
unsigned int uint32_t
Definition: wposix_types.h:53
void * m_UniformStagingBufferMappedData
Definition: DeviceCommandContext.h:181
Definition: VideoMode.h:28
std::unique_ptr< CBuffer > m_InPlaceIndexStagingBuffer
Definition: DeviceCommandContext.h:178
uint32_t m_InPlaceBlockIndexOffset
Definition: DeviceCommandContext.h:185
void * m_InPlaceIndexStagingBufferMappedData
Definition: DeviceCommandContext.h:180
void BeginPass() override
Definition: DeviceCommandContext.cpp:684
bool m_DebugScopedLabels
Definition: DeviceCommandContext.h:149
Definition: IDeviceCommandContext.h:94
void BlitFramebuffer(IFramebuffer *destinationFramebuffer, IFramebuffer *sourceFramebuffer) override
Definition: DeviceCommandContext.cpp:245
Definition: ShaderProgram.h:77
A wrapper for backend shader program to handle high-level operations like file reloading and handling...
Definition: ShaderProgram.h:33
Definition: IDeviceCommandContext.h:40
IFramebuffer stores attachments which should be used by backend as rendering destinations.
Definition: IFramebuffer.h:84
void UploadTexture(ITexture *texture, const Format dataFormat, const void *data, const size_t dataSize, const uint32_t level=0, const uint32_t layer=0) override
Definition: DeviceCommandContext.cpp:535
uint32_t m_InPlaceBlockVertexOffset
Definition: DeviceCommandContext.h:184
void UploadTextureRegion(ITexture *texture, const Format dataFormat, const void *data, const size_t dataSize, const uint32_t xOffset, const uint32_t yOffset, const uint32_t width, const uint32_t height, const uint32_t level=0, const uint32_t layer=0) override
Definition: DeviceCommandContext.cpp:543
std::unique_ptr< CRingCommandContext > m_PrependCommandContext
Definition: DeviceCommandContext.h:151
Simplifed version of std::span (C++20) as we don&#39;t support the original one yet.
Definition: Span.h:36
void BindVertexBuffer(const uint32_t bindingSlot, CBuffer *buffer, uint32_t offset)
Definition: DeviceCommandContext.cpp:943