Golias Engine
A C++ 20 'game engine' built with SDL3 with wide platform support.
rendering_device_gles3.h
Go to the documentation of this file.
1 #pragma once
2 
5 #include <glad.h>
6 
15 class RenderingDeviceGLES3 final : public RenderingDevice {
16 public:
17  RenderingDeviceGLES3() = default;
18  ~RenderingDeviceGLES3() override;
19 
20  bool initialize(SDL_Window* sdl_window) override;
21  void shutdown() override;
22 
23  RID shader_create_from_source(const String& vertex_src, const String& fragment_src) override;
24  void shader_destroy(RID shader) override;
25 
26  RID buffer_create(size_t size, uint32_t usage_flags, const void* data = nullptr) override;
27  void buffer_update(RID buffer, size_t offset, size_t size, const void* data) override;
28  void buffer_destroy(RID buffer) override;
29 
30  RID texture_create(const TextureFormat& format, void* data = nullptr) override;
31  void texture_update(RID texture_rid, uint32_t mip_level, uint32_t layer, const void* data, size_t size) override;
32  void texture_generate_mipmaps(RID texture_rid) override;
33  void texture_destroy(RID texture_rid) override;
34  void get_texture_size(RID texture_rid, uint32_t& width, uint32_t& height) override;
35  uint32_t texture_get_native_handle(RID texture_rid) override;
36  Texture get_texture(RID texture_rid) override;
37 
38  RID sampler_create(const SamplerState& state) override;
39  void sampler_destroy(RID sampler) override;
40 
41  RID framebuffer_create(const Vector<RenderPassAttachment>& attachments) override;
42  void framebuffer_destroy(RID framebuffer) override;
43 
44  RID pipeline_create(const PipelineState& state) override;
45  void pipeline_destroy(RID pipeline) override;
46 
47  void begin_frame() override;
48  void end_frame() override;
49 
50  void render_pass_begin(RID framebuffer, const Viewport& viewport, const Scissor& scissor) override;
51  void render_pass_end() override;
52 
53  void bind_pipeline(RID pipeline) override;
54  void bind_vertex_buffers(const Vector<RID>& buffers, const Vector<size_t>& offsets = {}) override;
55  void bind_index_buffer(RID buffer, IndexType type, size_t offset = 0) override;
56  void bind_uniform_buffer(uint32_t binding, RID buffer, size_t offset = 0, size_t size = 0) override;
57  void bind_texture(uint32_t binding, RID texture, RID sampler) override;
58 
59  void push_constant(const String& name, const void* data, size_t size) override;
60 
61  void draw(uint32_t vertex_count, uint32_t instance_count = 1, uint32_t first_vertex = 0, uint32_t first_instance = 0) override;
62  void draw_indexed(uint32_t index_count, uint32_t instance_count = 1, uint32_t first_index = 0, int32_t vertex_offset = 0,
63  uint32_t first_instance = 0) override;
64 
65  void set_viewport(const Viewport& viewport) override;
66  void set_scissor(const Scissor& scissor) override;
67  void clear_color(const glm::vec4& color) override;
68  void clear_depth_stencil(float depth = 1.0f, uint32_t stencil = 0) override;
69 
70  void swap_buffers() override;
71 private:
73  HashMap<RID, Buffer> buffers;
74  HashMap<RID, Texture> textures;
75  HashMap<RID, Sampler> samplers;
76  HashMap<RID, Framebuffer> framebuffers;
77  HashMap<RID, Pipeline> pipelines;
78 
79  RID current_pipeline = INVALID_RID;
80  RID current_framebuffer = INVALID_RID;
81  IndexType current_index_type = IndexType::UINT16;
82 
83  SDL_GLContext gl_context = nullptr;
84 
85  GLuint compile_shader(GLenum type, const String& source);
86  GLenum to_gl_format(DataFormat format, bool* is_int = nullptr);
87  GLenum to_gl_filter(TextureFilter filter);
88  GLenum to_gl_wrap(TextureWrap wrap);
89  GLenum to_gl_compare(CompareOp op);
90  GLenum to_gl_stencil_op(StencilOp op);
91  GLenum to_gl_blend_factor(BlendFactor factor);
92  GLenum to_gl_blend_op(BlendOp op);
93  GLenum to_gl_topology(PrimitiveTopology topology);
94  void apply_rasterization_state(const RasterizationState& state);
95  void apply_depth_stencil_state(const DepthStencilState& state);
96  void apply_blend_state(const Vector<BlendState>& states);
97 };
Rendering device implementation using OpenGL/ES 3.
Definition: rendering_device_gles3.h:15
RID texture_create(const TextureFormat &format, void *data=nullptr) override
Definition: rendering_device_gles3.cpp:234
void end_frame() override
Definition: rendering_device_gles3.cpp:920
void buffer_update(RID buffer, size_t offset, size_t size, const void *data) override
Definition: rendering_device_gles3.cpp:185
RID shader_create_from_source(const String &vertex_src, const String &fragment_src) override
Definition: rendering_device_gles3.cpp:126
bool initialize(SDL_Window *sdl_window) override
Definition: rendering_device_gles3.cpp:10
void shutdown() override
Definition: rendering_device_gles3.cpp:73
RID framebuffer_create(const Vector< RenderPassAttachment > &attachments) override
Definition: rendering_device_gles3.cpp:706
void get_texture_size(RID texture_rid, uint32_t &width, uint32_t &height) override
Definition: rendering_device_gles3.cpp:300
void texture_destroy(RID texture_rid) override
Definition: rendering_device_gles3.cpp:291
void set_viewport(const Viewport &viewport) override
Definition: rendering_device_gles3.cpp:800
void swap_buffers() override
Definition: rendering_device_gles3.cpp:822
void bind_index_buffer(RID buffer, IndexType type, size_t offset=0) override
Definition: rendering_device_gles3.cpp:559
void render_pass_end() override
Definition: rendering_device_gles3.cpp:796
RID sampler_create(const SamplerState &state) override
Definition: rendering_device_gles3.cpp:645
void bind_uniform_buffer(uint32_t binding, RID buffer, size_t offset=0, size_t size=0) override
Definition: rendering_device_gles3.cpp:615
RID buffer_create(size_t size, uint32_t usage_flags, const void *data=nullptr) override
Definition: rendering_device_gles3.cpp:167
void pipeline_destroy(RID pipeline) override
Definition: rendering_device_gles3.cpp:336
void sampler_destroy(RID sampler) override
Definition: rendering_device_gles3.cpp:665
void shader_destroy(RID shader) override
Definition: rendering_device_gles3.cpp:159
void bind_vertex_buffers(const Vector< RID > &buffers, const Vector< size_t > &offsets={}) override
Definition: rendering_device_gles3.cpp:463
void texture_generate_mipmaps(RID texture_rid) override
Definition: rendering_device_gles3.cpp:899
void framebuffer_destroy(RID framebuffer) override
Definition: rendering_device_gles3.cpp:753
void push_constant(const String &name, const void *data, size_t size) override
Definition: rendering_device_gles3.cpp:826
void clear_depth_stencil(float depth=1.0f, uint32_t stencil=0) override
Definition: rendering_device_gles3.cpp:816
void buffer_destroy(RID buffer) override
Definition: rendering_device_gles3.cpp:194
void begin_frame() override
Definition: rendering_device_gles3.cpp:916
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_gles3.cpp:567
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_gles3.cpp:580
void set_scissor(const Scissor &scissor) override
Definition: rendering_device_gles3.cpp:806
void clear_color(const glm::vec4 &color) override
Definition: rendering_device_gles3.cpp:811
~RenderingDeviceGLES3() override
Definition: rendering_device_gles3.cpp:6
uint32_t texture_get_native_handle(RID texture_rid) override
Definition: rendering_device_gles3.cpp:311
void render_pass_begin(RID framebuffer, const Viewport &viewport, const Scissor &scissor) override
Definition: rendering_device_gles3.cpp:762
RenderingDeviceGLES3()=default
void bind_pipeline(RID pipeline) override
Definition: rendering_device_gles3.cpp:345
void texture_update(RID texture_rid, uint32_t mip_level, uint32_t layer, const void *data, size_t size) override
Definition: rendering_device_gles3.cpp:865
void bind_texture(uint32_t binding, RID texture, RID sampler) override
Definition: rendering_device_gles3.cpp:625
RID pipeline_create(const PipelineState &state) override
Definition: rendering_device_gles3.cpp:327
Texture get_texture(RID texture_rid) override
Definition: rendering_device_gles3.cpp:319
Abstract base class for rendering devices.
Definition: rendering_device.h:326
Definition: str.h:8
Definition: vector.h:10
Definition: gles3.h:6
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
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:213
Definition: rendering_device.h:238
Definition: rendering_device.h:202
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