Pyrogenesis  trunk
IDeviceCommandContext.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_BACKEND_IDEVICECOMMANDCONTEXT
19 #define INCLUDED_RENDERER_BACKEND_IDEVICECOMMANDCONTEXT
20 
21 #include "ps/containers/Span.h"
25 
26 #include <cstdint>
27 #include <functional>
28 
29 namespace Renderer
30 {
31 
32 namespace Backend
33 {
34 
35 class IBuffer;
36 class IDevice;
37 class IFramebuffer;
38 class ITexture;
39 
40 class IDeviceCommandContext : public IDeviceObject<IDeviceCommandContext>
41 {
42 public:
43  /**
44  * Binds the graphics pipeline state. It should be called only inside a
45  * framebuffer pass and as rarely as possible.
46  */
47  virtual void SetGraphicsPipelineState(IGraphicsPipelineState* pipelineState) = 0;
48 
49  virtual void BlitFramebuffer(
50  IFramebuffer* destinationFramebuffer, IFramebuffer* sourceFramebuffer) = 0;
51 
52  /**
53  * Starts a framebuffer pass, performs attachment load operations.
54  * It should be called as rarely as possible.
55  *
56  * @see IFramebuffer
57  */
58  virtual void BeginFramebufferPass(IFramebuffer* framebuffer) = 0;
59 
60  /**
61  * Finishes a framebuffer pass, performs attachment store operations.
62  */
63  virtual void EndFramebufferPass() = 0;
64 
65  /**
66  * Clears all mentioned attachments. Prefer to use attachment load operations over
67  * this function. It should be called only inside a framebuffer pass.
68  */
69  virtual void ClearFramebuffer(const bool color, const bool depth, const bool stencil) = 0;
70 
71  virtual void ReadbackFramebufferSync(
72  const uint32_t x, const uint32_t y, const uint32_t width, const uint32_t height,
73  void* data) = 0;
74 
75  virtual void UploadTexture(ITexture* texture, const Format dataFormat,
76  const void* data, const size_t dataSize,
77  const uint32_t level = 0, const uint32_t layer = 0) = 0;
78  virtual void UploadTextureRegion(ITexture* texture, const Format dataFormat,
79  const void* data, const size_t dataSize,
80  const uint32_t xOffset, const uint32_t yOffset,
81  const uint32_t width, const uint32_t height,
82  const uint32_t level = 0, const uint32_t layer = 0) = 0;
83 
84  using UploadBufferFunction = std::function<void(u8*)>;
85  virtual void UploadBuffer(IBuffer* buffer, const void* data, const uint32_t dataSize) = 0;
86  virtual void UploadBuffer(IBuffer* buffer, const UploadBufferFunction& uploadFunction) = 0;
87  virtual void UploadBufferRegion(
88  IBuffer* buffer, const void* data, const uint32_t dataOffset, const uint32_t dataSize) = 0;
89  virtual void UploadBufferRegion(
90  IBuffer* buffer, const uint32_t dataOffset, const uint32_t dataSize,
91  const UploadBufferFunction& uploadFunction) = 0;
92 
93  // TODO: maybe we should add a more common type, like CRectI.
94  struct Rect
95  {
96  int32_t x, y;
97  int32_t width, height;
98  };
99  virtual void SetScissors(const uint32_t scissorCount, const Rect* scissors) = 0;
100  virtual void SetViewports(const uint32_t viewportCount, const Rect* viewports) = 0;
101 
102  /**
103  * Binds the vertex input layout. It should be compatible with the shader
104  * program's one. It should be called only inside a framebuffer pass and as
105  * rarely as possible.
106  */
107  virtual void SetVertexInputLayout(
108  IVertexInputLayout* vertexInputLayout) = 0;
109 
110  virtual void SetVertexBuffer(
111  const uint32_t bindingSlot, IBuffer* buffer, const uint32_t offset) = 0;
112  virtual void SetVertexBufferData(
113  const uint32_t bindingSlot, const void* data, const uint32_t dataSize) = 0;
114 
115  virtual void SetIndexBuffer(IBuffer* buffer) = 0;
116  virtual void SetIndexBufferData(const void* data, const uint32_t dataSize) = 0;
117 
118  virtual void BeginPass() = 0;
119  virtual void EndPass() = 0;
120 
121  virtual void Draw(const uint32_t firstVertex, const uint32_t vertexCount) = 0;
122  virtual void DrawIndexed(
123  const uint32_t firstIndex, const uint32_t indexCount, const int32_t vertexOffset) = 0;
124  virtual void DrawInstanced(
125  const uint32_t firstVertex, const uint32_t vertexCount,
126  const uint32_t firstInstance, const uint32_t instanceCount) = 0;
127  virtual void DrawIndexedInstanced(
128  const uint32_t firstIndex, const uint32_t indexCount,
129  const uint32_t firstInstance, const uint32_t instanceCount,
130  const int32_t vertexOffset) = 0;
131  // TODO: should be removed when performance impact is minimal on slow hardware.
132  virtual void DrawIndexedInRange(
133  const uint32_t firstIndex, const uint32_t indexCount,
134  const uint32_t start, const uint32_t end) = 0;
135 
136  virtual void SetTexture(const int32_t bindingSlot, ITexture* texture) = 0;
137 
138  virtual void SetUniform(
139  const int32_t bindingSlot,
140  const float value) = 0;
141  virtual void SetUniform(
142  const int32_t bindingSlot,
143  const float valueX, const float valueY) = 0;
144  virtual void SetUniform(
145  const int32_t bindingSlot,
146  const float valueX, const float valueY,
147  const float valueZ) = 0;
148  virtual void SetUniform(
149  const int32_t bindingSlot,
150  const float valueX, const float valueY,
151  const float valueZ, const float valueW) = 0;
152  virtual void SetUniform(
153  const int32_t bindingSlot, PS::span<const float> values) = 0;
154 
155  virtual void BeginScopedLabel(const char* name) = 0;
156  virtual void EndScopedLabel() = 0;
157 
158  virtual void Flush() = 0;
159 };
160 
161 } // namespace Backend
162 
163 } // namespace Renderer
164 
165 #define GPU_SCOPED_LABEL(deviceCommandContext, name) \
166  GPUScopedLabel scopedLabel((deviceCommandContext), (name));
167 
169 {
170 public:
172  Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
173  const char* name)
174  : m_DeviceCommandContext(deviceCommandContext)
175  {
176  m_DeviceCommandContext->BeginScopedLabel(name);
177  }
178 
180  {
181  m_DeviceCommandContext->EndScopedLabel();
182  }
183 
184 private:
185  Renderer::Backend::IDeviceCommandContext* m_DeviceCommandContext = nullptr;
186 };
187 
188 #endif // INCLUDED_RENDERER_BACKEND_IDEVICECOMMANDCONTEXT
virtual void ClearFramebuffer(const bool color, const bool depth, const bool stencil)=0
Clears all mentioned attachments.
virtual void SetVertexInputLayout(IVertexInputLayout *vertexInputLayout)=0
Binds the vertex input layout.
int32_t x
Definition: IDeviceCommandContext.h:96
Definition: IBuffer.h:31
virtual 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)=0
virtual void DrawIndexedInstanced(const uint32_t firstIndex, const uint32_t indexCount, const uint32_t firstInstance, const uint32_t instanceCount, const int32_t vertexOffset)=0
std::function< void(u8 *)> UploadBufferFunction
Definition: IDeviceCommandContext.h:84
Definition: ITexture.h:33
virtual void Draw(const uint32_t firstVertex, const uint32_t vertexCount)=0
IVertexInputLayout stores precompiled list of vertex attributes.
Definition: IShaderProgram.h:73
virtual void BeginFramebufferPass(IFramebuffer *framebuffer)=0
Starts a framebuffer pass, performs attachment load operations.
virtual void SetScissors(const uint32_t scissorCount, const Rect *scissors)=0
virtual void DrawIndexed(const uint32_t firstIndex, const uint32_t indexCount, const int32_t vertexOffset)=0
Format
Definition: Format.h:27
virtual void SetIndexBufferData(const void *data, const uint32_t dataSize)=0
int32_t width
Definition: IDeviceCommandContext.h:97
Definition: IDeviceCommandContext.h:168
virtual void SetViewports(const uint32_t viewportCount, const Rect *viewports)=0
GPUScopedLabel(Renderer::Backend::IDeviceCommandContext *deviceCommandContext, const char *name)
Definition: IDeviceCommandContext.h:171
A holder for precompiled graphics pipeline description.
Definition: PipelineState.h:190
virtual void UploadTexture(ITexture *texture, const Format dataFormat, const void *data, const size_t dataSize, const uint32_t level=0, const uint32_t layer=0)=0
Backend
Definition: Backend.h:27
virtual void BlitFramebuffer(IFramebuffer *destinationFramebuffer, IFramebuffer *sourceFramebuffer)=0
virtual void SetVertexBufferData(const uint32_t bindingSlot, const void *data, const uint32_t dataSize)=0
virtual void SetIndexBuffer(IBuffer *buffer)=0
~GPUScopedLabel()
Definition: IDeviceCommandContext.h:179
virtual void UploadBufferRegion(IBuffer *buffer, const void *data, const uint32_t dataOffset, const uint32_t dataSize)=0
unsigned int uint32_t
Definition: wposix_types.h:53
Definition: VideoMode.h:28
virtual void ReadbackFramebufferSync(const uint32_t x, const uint32_t y, const uint32_t width, const uint32_t height, void *data)=0
virtual void BeginScopedLabel(const char *name)=0
virtual void SetTexture(const int32_t bindingSlot, ITexture *texture)=0
virtual void SetGraphicsPipelineState(IGraphicsPipelineState *pipelineState)=0
Binds the graphics pipeline state.
virtual void DrawInstanced(const uint32_t firstVertex, const uint32_t vertexCount, const uint32_t firstInstance, const uint32_t instanceCount)=0
Definition: IDeviceObject.h:32
virtual void DrawIndexedInRange(const uint32_t firstIndex, const uint32_t indexCount, const uint32_t start, const uint32_t end)=0
Definition: IDeviceCommandContext.h:94
virtual void EndFramebufferPass()=0
Finishes a framebuffer pass, performs attachment store operations.
virtual void SetUniform(const int32_t bindingSlot, const float value)=0
int32_t height
Definition: IDeviceCommandContext.h:97
Definition: IDeviceCommandContext.h:40
IFramebuffer stores attachments which should be used by backend as rendering destinations.
Definition: IFramebuffer.h:84
virtual void UploadBuffer(IBuffer *buffer, const void *data, const uint32_t dataSize)=0
Simplifed version of std::span (C++20) as we don&#39;t support the original one yet.
Definition: Span.h:36
int32_t y
Definition: IDeviceCommandContext.h:96
virtual void SetVertexBuffer(const uint32_t bindingSlot, IBuffer *buffer, const uint32_t offset)=0