Golias Engine
A C++ 20 'game engine' built with SDL3 with wide platform support.
rendering_device_sdl_gpu.h
Go to the documentation of this file.
1 #pragma once
3 
15 public:
18 
19  bool initialize(SDL_Window* sdl_window) override;
20  void shutdown() override;
21 
22  RID shader_create_from_source(const String& vertex_src, const String& fragment_src) override;
23  RID shader_create_from_bytecode(const void* vertex_bytecode, size_t vertex_size,
24  const void* fragment_bytecode, size_t fragment_size,
25  uint32_t num_samplers = 0, uint32_t num_uniform_buffers = 1);
26  void shader_destroy(RID shader) override;
27 
28  RID buffer_create(size_t size, uint32_t usage_flags, const void* data = nullptr) override;
29  void buffer_update(RID buffer, size_t offset, size_t size, const void* data) override;
30  void buffer_destroy(RID buffer) override;
31 
32  RID texture_create(const TextureFormat& format, void* data = nullptr) override;
33  void texture_update(RID texture, uint32_t mip_level, uint32_t layer, const void* data, size_t size) override;
34  void texture_generate_mipmaps(RID texture) override;
35  void texture_destroy(RID texture) override;
36  void get_texture_size(RID texture, uint32_t& width, uint32_t& height) override;
37  uint32_t texture_get_native_handle(RID texture) override;
38  Texture get_texture(RID texture) override;
39 
40  RID sampler_create(const SamplerState& state) override;
41  void sampler_destroy(RID sampler) override;
42 
43  RID framebuffer_create(const Vector<RenderPassAttachment>& attachments) override;
44  void framebuffer_destroy(RID framebuffer) override;
45 
46  RID pipeline_create(const PipelineState& state) override;
47  void pipeline_destroy(RID pipeline) override;
48 
49  void begin_frame() override;
50  void end_frame() override;
51 
52  void render_pass_begin(RID framebuffer, const Viewport& viewport, const Scissor& scissor) override;
53  void render_pass_end() override;
54 
55  void bind_pipeline(RID pipeline) override;
56  void bind_vertex_buffers(const Vector<RID>& buffers, const Vector<size_t>& offsets = {}) override;
57  void bind_index_buffer(RID buffer, IndexType type, size_t offset = 0) override;
58  void bind_uniform_buffer(uint32_t binding, RID buffer, size_t offset = 0, size_t size = 0) override;
59  void bind_texture(uint32_t binding, RID texture, RID sampler) override;
60 
61  void push_constant(const String& name, const void* data, size_t size) override;
62 
63  void draw(uint32_t vertex_count, uint32_t instance_count = 1, uint32_t first_vertex = 0, uint32_t first_instance = 0) override;
64  void draw_indexed(uint32_t index_count, uint32_t instance_count = 1, uint32_t first_index = 0,
65  int32_t vertex_offset = 0, uint32_t first_instance = 0) override;
66 
67  void set_viewport(const Viewport& viewport) override;
68  void set_scissor(const Scissor& scissor) override;
69  void clear_color(const glm::vec4& color) override;
70  void clear_depth_stencil(float depth = 1.0f, uint32_t stencil = 0) override;
71 
72  void swap_buffers() override;
73 
74 private:
75  SDL_GPUDevice* _device = nullptr;
76  SDL_GPUCommandBuffer* _cmd_buffer = nullptr;
77  SDL_GPURenderPass* _render_pass = nullptr;
78 
79  struct GPUShader {
80  SDL_GPUShader* vertex = nullptr;
81  SDL_GPUShader* fragment = nullptr;
82  };
83 
84  struct GPUBuffer {
85  SDL_GPUBuffer* handle = nullptr;
86  size_t size = 0;
87  uint32_t usage = 0;
88  };
89 
90  struct GPUTexture {
91  SDL_GPUTexture* handle = nullptr;
92  TextureFormat format;
93  };
94 
95  HashMap<RID, GPUShader> _shaders;
96  HashMap<RID, GPUBuffer> _buffers;
97  HashMap<RID, GPUTexture> _textures;
101 
102  RID _current_pipeline = INVALID_RID;
103  Viewport _current_viewport;
104  glm::vec4 _clear_color = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
105 
106  struct BoundVertexBuffer {
107  SDL_GPUBuffer* buffer = nullptr;
108  Uint32 offset = 0;
109  };
110 
111  Vector<BoundVertexBuffer> _bound_vertex_buffers;
112 
113  SDL_GPUBuffer* _bound_index_buffer = nullptr;
114  SDL_GPUIndexElementSize _bound_index_type = SDL_GPU_INDEXELEMENTSIZE_16BIT;
115  Uint32 _bound_index_offset = 0;
116 
117  struct BoundTextureSampler {
118  SDL_GPUTexture* texture = nullptr;
119  SDL_GPUSampler* sampler = nullptr;
120  };
122 
123  SDL_GPUTextureFormat sdl_format(DataFormat fmt);
124  SDL_GPUVertexElementFormat sdl_vertex_format(DataFormat fmt);
125  SDL_GPUFilter sdl_filter(TextureFilter filter);
126  SDL_GPUSamplerMipmapMode sdl_mipmap_mode(TextureFilter filter);
127  SDL_GPUSamplerAddressMode sdl_wrap(TextureWrap wrap);
128  SDL_GPUCompareOp sdl_compare(CompareOp op);
129  SDL_GPUStencilOp sdl_stencil(StencilOp op);
130  SDL_GPUBlendFactor sdl_blend_factor(BlendFactor f);
131  SDL_GPUBlendOp sdl_blend_op(BlendOp op);
132  SDL_GPUCullMode sdl_cull(CullMode mode);
133  SDL_GPUFillMode sdl_fill(PolygonMode mode);
134  SDL_GPUPrimitiveType sdl_topology(PrimitiveTopology topo);
135  SDL_GPUIndexElementSize sdl_index_type(IndexType type);
136  SDL_GPUBufferUsageFlags sdl_buffer_usage(uint32_t flags);
137 };
Rendering device implementation using SDL_GPU.
Definition: rendering_device_sdl_gpu.h:14
void draw(uint32_t vertex_count, uint32_t instance_count=1, uint32_t first_vertex=0, uint32_t first_instance=0) override
Definition: rendering_device_sdl_gpu.cpp:848
RenderingDeviceSDL_GPU()=default
Texture get_texture(RID texture) override
Definition: rendering_device_sdl_gpu.cpp:440
void draw_indexed(uint32_t index_count, uint32_t instance_count=1, uint32_t first_index=0, int32_t vertex_offset=0, uint32_t first_instance=0) override
Definition: rendering_device_sdl_gpu.cpp:856
void swap_buffers() override
Definition: rendering_device_sdl_gpu.cpp:905
bool initialize(SDL_Window *sdl_window) override
Definition: rendering_device_sdl_gpu.cpp:9
void texture_update(RID texture, uint32_t mip_level, uint32_t layer, const void *data, size_t size) override
Definition: rendering_device_sdl_gpu.cpp:369
void bind_index_buffer(RID buffer, IndexType type, size_t offset=0) override
Definition: rendering_device_sdl_gpu.cpp:786
void get_texture_size(RID texture, uint32_t &width, uint32_t &height) override
Definition: rendering_device_sdl_gpu.cpp:426
void texture_generate_mipmaps(RID texture) override
Definition: rendering_device_sdl_gpu.cpp:411
RID buffer_create(size_t size, uint32_t usage_flags, const void *data=nullptr) override
Definition: rendering_device_sdl_gpu.cpp:189
uint32_t texture_get_native_handle(RID texture) override
Definition: rendering_device_sdl_gpu.cpp:435
void clear_depth_stencil(float depth=1.0f, uint32_t stencil=0) override
Definition: rendering_device_sdl_gpu.cpp:900
void render_pass_end() override
Definition: rendering_device_sdl_gpu.cpp:731
void set_scissor(const Scissor &scissor) override
Definition: rendering_device_sdl_gpu.cpp:882
void render_pass_begin(RID framebuffer, const Viewport &viewport, const Scissor &scissor) override
Definition: rendering_device_sdl_gpu.cpp:650
void buffer_destroy(RID buffer) override
Definition: rendering_device_sdl_gpu.cpp:291
void begin_frame() override
Definition: rendering_device_sdl_gpu.cpp:628
RID texture_create(const TextureFormat &format, void *data=nullptr) override
Definition: rendering_device_sdl_gpu.cpp:302
void bind_texture(uint32_t binding, RID texture, RID sampler) override
Definition: rendering_device_sdl_gpu.cpp:814
RID shader_create_from_source(const String &vertex_src, const String &fragment_src) override
Definition: rendering_device_sdl_gpu.cpp:93
~RenderingDeviceSDL_GPU() override
void framebuffer_destroy(RID framebuffer) override
Definition: rendering_device_sdl_gpu.cpp:497
void clear_color(const glm::vec4 &color) override
Definition: rendering_device_sdl_gpu.cpp:896
void set_viewport(const Viewport &viewport) override
Definition: rendering_device_sdl_gpu.cpp:865
void bind_uniform_buffer(uint32_t binding, RID buffer, size_t offset=0, size_t size=0) override
Definition: rendering_device_sdl_gpu.cpp:807
void bind_vertex_buffers(const Vector< RID > &buffers, const Vector< size_t > &offsets={}) override
Definition: rendering_device_sdl_gpu.cpp:753
void buffer_update(RID buffer, size_t offset, size_t size, const void *data) override
Definition: rendering_device_sdl_gpu.cpp:234
RID framebuffer_create(const Vector< RenderPassAttachment > &attachments) override
Definition: rendering_device_sdl_gpu.cpp:491
void shutdown() override
Definition: rendering_device_sdl_gpu.cpp:40
void end_frame() override
Definition: rendering_device_sdl_gpu.cpp:635
RID sampler_create(const SamplerState &state) override
Definition: rendering_device_sdl_gpu.cpp:453
RID shader_create_from_bytecode(const void *vertex_bytecode, size_t vertex_size, const void *fragment_bytecode, size_t fragment_size, uint32_t num_samplers=0, uint32_t num_uniform_buffers=1)
Definition: rendering_device_sdl_gpu.cpp:122
void push_constant(const String &name, const void *data, size_t size) override
Definition: rendering_device_sdl_gpu.cpp:838
RID pipeline_create(const PipelineState &state) override
Definition: rendering_device_sdl_gpu.cpp:501
void sampler_destroy(RID sampler) override
Definition: rendering_device_sdl_gpu.cpp:480
void bind_pipeline(RID pipeline) override
Definition: rendering_device_sdl_gpu.cpp:739
void pipeline_destroy(RID pipeline) override
Definition: rendering_device_sdl_gpu.cpp:617
void shader_destroy(RID shader) override
Definition: rendering_device_sdl_gpu.cpp:175
void texture_destroy(RID texture) override
Definition: rendering_device_sdl_gpu.cpp:415
Abstract base class for rendering devices.
Definition: rendering_device.h:326
Definition: str.h:8
Definition: vector.h:10
IndexType
Definition: rendering_device.h:151
BlendFactor
Definition: rendering_device.h:117
CompareOp
Definition: rendering_device.h:113
DataFormat
Definition: rendering_device.h:83
PrimitiveTopology
Definition: rendering_device.h:136
CullMode
Definition: rendering_device.h:132
PolygonMode
Definition: rendering_device.h:134
BlendOp
Definition: rendering_device.h:130
constexpr RID INVALID_RID
Definition: rendering_device.h:13
TextureFilter
Definition: rendering_device.h:109
TextureWrap
Definition: rendering_device.h:111
StencilOp
Definition: rendering_device.h:115
uint32_t RID
Definition: rendering_device.h:12
Definition: rendering_device.h:238
Definition: rendering_device.h:188
Definition: rendering_device.h:253
Definition: rendering_device.h:176
Definition: rendering_device.h:301
Definition: rendering_device.h:248
std::unordered_map< K, V > HashMap
Definition: type_alias.h:20