libultraship
Reimplementations of libultra (N64 SDK) functions for modern hardware
Loading...
Searching...
No Matches
gfx_opengl.h
Go to the documentation of this file.
1#ifdef ENABLE_OPENGL
2#pragma once
3
4#include <memory>
5#include "gfx_rendering_api.h"
6#include "../interpreter.h"
7
8namespace Ship {
9class ConsoleVariable;
10class ResourceManager;
11} // namespace Ship
12
13#ifdef _MSC_VER
14#define FAST_GFX_OPENGL_USE_GLEW
15#include <SDL3/SDL.h>
16// #define GL_GLEXT_PROTOTYPES 1
17#include <GL/glew.h>
18#elif FOR_WINDOWS
19#define FAST_GFX_OPENGL_USE_GLEW
20#include <GL/glew.h>
21#include <SDL3/SDL.h>
22#define GL_GLEXT_PROTOTYPES 1
23#include <SDL3/SDL_opengl.h>
24#elif __APPLE__
25#define FAST_GFX_OPENGL_USE_GLEW
26#include <SDL3/SDL.h>
27#include <GL/glew.h>
28#elif USE_OPENGLES
29#include <SDL3/SDL.h>
30#include <GLES3/gl3.h>
31#else
32#include <SDL3/SDL.h>
33#define GL_GLEXT_PROTOTYPES 1
34#include <SDL3/SDL_opengl.h>
35#endif
36namespace Fast {
55
60 uint32_t width, height;
62 uint32_t msaa_level;
63 bool invertY;
64
66};
67
72 uint16_t width;
73 uint16_t height;
74 uint16_t filtering;
75};
76
80class GfxRenderingAPIOGL final : public GfxRenderingAPI {
81 public:
83 GfxRenderingAPIOGL(std::shared_ptr<Ship::ConsoleVariable> consoleVariable = nullptr,
84 std::shared_ptr<Ship::ResourceManager> resourceManager = nullptr);
85 ~GfxRenderingAPIOGL() override = default;
86
89 const char* GetName() override;
90 int GetMaxTextureSize() override;
92 void UnloadShader(ShaderProgram* oldPrg) override;
93 void LoadShader(ShaderProgram* newPrg) override;
94 ShaderProgram* CreateAndLoadNewShader(uint64_t shaderId0, uint64_t shaderId1) override;
95 ShaderProgram* LookupShader(uint64_t shaderId0, uint64_t shaderId1) override;
96 void ShaderGetInfo(ShaderProgram* prg, uint8_t* numInputs, bool usedTextures[2]) override;
97 void ClearShaderCache() override;
98 uint32_t NewTexture() override;
99 void SelectTexture(int tile, uint32_t textureId) override;
100 void UploadTexture(const uint8_t* rgba32Buf, uint32_t width, uint32_t height) override;
101 void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) override;
102 void SetDepthTestAndMask(bool depth_test, bool z_upd) override;
103 void SetCurrentPrimDepth(float depth) override;
104 void SetZmodeDecal(bool decal) override;
105 void SetViewport(int x, int y, int width, int height) override;
106 void SetScissor(int x, int y, int width, int height) override;
107 void SetUseAlpha(bool useAlpha) override;
108 void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) override;
109 void Init() override;
110 void OnResize() override;
111 void StartFrame() override;
112 void EndFrame() override;
113 void FinishRender() override;
114 int CreateFramebuffer() override;
115 void UpdateFramebufferParameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level,
116 bool opengl_invertY, bool render_target, bool has_depth_buffer,
117 bool can_extract_depth) override;
118 void StartDrawToFramebuffer(int fbId, float noiseScale) override;
119 void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0,
120 int dstX1, int dstY1) override;
121 void ClearFramebuffer(bool color, bool depth) override;
122 void ClearDepthRegion(int x, int y, int w, int h) override;
123 void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t* rgba16Buf) override;
124 void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) override;
125 std::unordered_map<std::pair<float, float>, uint16_t, hash_pair_ff>
126 GetPixelDepth(int fb_id, const std::set<std::pair<float, float>>& coordinates) override;
127 void* GetFramebufferTextureId(int fbId) override;
128 void SelectTextureFb(int fbId) override;
129 void DeleteTexture(uint32_t texId) override;
130 void SetTextureFilter(FilteringMode mode) override;
132 void SetSrgbMode() override;
133 ImTextureID GetTextureById(int id) override;
135 private:
136 void SetUniforms(ShaderProgram* prg) const;
137 std::string BuildFsShader(const CCFeatures& cc_features);
138 void SetPerDrawUniforms();
139
140 std::shared_ptr<Ship::ConsoleVariable> mConsoleVariable;
141 std::shared_ptr<Ship::ResourceManager> mResourceManager;
142
143 std::vector<TextureInfo> textures;
144 GLuint mCurrentTextureIds[SHADER_MAX_TEXTURES] = {};
145 GLuint mLastBoundTextures[SHADER_MAX_TEXTURES] = {};
146 uint8_t mCurrentTile;
147 int8_t mLastActiveTexture = -1;
148 int8_t mLastBlendEnabled = -1;
149 int8_t mLastScissorEnabled = -1;
150
151 std::map<std::pair<uint64_t, uint32_t>, ShaderProgram> mShaderProgramPool;
152 ShaderProgram* mCurrentShaderProgram;
153 ShaderProgram* mLastLoadedShader = nullptr;
154
155 GLuint mOpenglVbo = 0;
156#if defined(__APPLE__) || defined(USE_OPENGLES)
157 GLuint mOpenglVao;
158#endif
159
160 uint32_t mFrameCount = 0;
161
162 std::vector<FramebufferOGL> mFrameBuffers;
163 size_t mCurrentFrameBuffer = 0;
164 float mCurrentNoiseScale = 0.0f;
165 FilteringMode mCurrentFilterMode = FILTER_THREE_POINT;
166
167 GLint mMaxMsaaLevel = 1;
168 GLuint mPixelDepthRb = 0;
169 GLuint mPixelDepthFb = 0;
170 size_t mPixelDepthRbSize = 0;
171};
172
173} // namespace Fast
174#endif
OpenGL/OpenGLES implementation of the Fast3D rendering API.
Definition gfx_opengl.h:80
uint32_t NewTexture() override
int GetMaxTextureSize() override
void EndFrame() override
GfxClipParameters GetClipParameters() override
void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t *rgba16Buf) override
void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) override
ImTextureID GetTextureById(int id) override
int CreateFramebuffer() override
void SetSrgbMode() override
void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) override
void ClearFramebuffer(bool color, bool depth) override
const char * GetName() override
void Init() override
void ClearDepthRegion(int x, int y, int w, int h) override
ShaderProgram * CreateAndLoadNewShader(uint64_t shaderId0, uint64_t shaderId1) override
void ShaderGetInfo(ShaderProgram *prg, uint8_t *numInputs, bool usedTextures[2]) override
void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) override
void StartFrame() override
void UpdateFramebufferParameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invertY, bool render_target, bool has_depth_buffer, bool can_extract_depth) override
void UnloadShader(ShaderProgram *oldPrg) override
std::unordered_map< std::pair< float, float >, uint16_t, hash_pair_ff > GetPixelDepth(int fb_id, const std::set< std::pair< float, float > > &coordinates) override
FilteringMode GetTextureFilter() override
void * GetFramebufferTextureId(int fbId) override
void SetUseAlpha(bool useAlpha) override
void SetScissor(int x, int y, int width, int height) override
ShaderProgram * LookupShader(uint64_t shaderId0, uint64_t shaderId1) override
void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1) override
void SetCurrentPrimDepth(float depth) override
void SetTextureFilter(FilteringMode mode) override
void OnResize() override
void UploadTexture(const uint8_t *rgba32Buf, uint32_t width, uint32_t height) override
~GfxRenderingAPIOGL() override=default
void DeleteTexture(uint32_t texId) override
void ClearShaderCache() override
void StartDrawToFramebuffer(int fbId, float noiseScale) override
void SetViewport(int x, int y, int width, int height) override
GfxRenderingAPIOGL(std::shared_ptr< Ship::ConsoleVariable > consoleVariable=nullptr, std::shared_ptr< Ship::ResourceManager > resourceManager=nullptr)
Constructs the OpenGL renderer with optional shared dependencies.
void SetZmodeDecal(bool decal) override
void SelectTextureFb(int fbId) override
void LoadShader(ShaderProgram *newPrg) override
void SelectTexture(int tile, uint32_t textureId) override
void FinishRender() override
void SetDepthTestAndMask(bool depth_test, bool z_upd) override
Definition gfx_rendering_api.h:30
#define SHADER_MAX_TEXTURES
Definition interpreter.h:105
Definition gfx_direct3d_common.h:19
FilteringMode
Definition gfx_rendering_api.h:17
@ FILTER_THREE_POINT
Definition gfx_rendering_api.h:17
Core namespace for the libultraship engine framework.
Definition gfx_direct3d_common.h:14
OpenGL framebuffer object and associated attachments.
Definition gfx_opengl.h:59
GLuint clrbufMsaa
Definition gfx_opengl.h:65
uint32_t height
Definition gfx_opengl.h:60
uint32_t width
Definition gfx_opengl.h:60
uint32_t msaa_level
Definition gfx_opengl.h:62
GLuint fbo
Definition gfx_opengl.h:65
GLuint clrbuf
Definition gfx_opengl.h:65
bool invertY
Definition gfx_opengl.h:63
GLuint rbo
Definition gfx_opengl.h:65
bool has_depth_buffer
Definition gfx_opengl.h:61
Definition gfx_rendering_api.h:12
OpenGL shader program metadata cached by the Fast3D renderer.
Definition gfx_opengl.h:40
uint8_t numFloats
Definition gfx_opengl.h:44
GLint noiseScaleLocation
Definition gfx_opengl.h:49
GLint texture_width_location
Definition gfx_opengl.h:51
uint8_t numAttribs
Definition gfx_opengl.h:47
GLint texture_filtering_location
Definition gfx_opengl.h:53
bool usedTextures[SHADER_MAX_TEXTURES]
Definition gfx_opengl.h:43
GLint texture_height_location
Definition gfx_opengl.h:52
GLint attribLocations[16]
Definition gfx_opengl.h:45
GLint frameCountLocation
Definition gfx_opengl.h:48
uint8_t attribSizes[16]
Definition gfx_opengl.h:46
GLuint openglProgramId
Definition gfx_opengl.h:41
GLint prim_depth_location
Definition gfx_opengl.h:50
uint8_t numInputs
Definition gfx_opengl.h:42
Cached texture metadata tracked per texture id.
Definition gfx_opengl.h:71
uint16_t width
Definition gfx_opengl.h:72
uint16_t height
Definition gfx_opengl.h:73
uint16_t filtering
Definition gfx_opengl.h:74
Definition gfx_rendering_api.h:20