OpenTTD Source 20250312-master-gcdcc6b491d
|
Platform-independent back-end class for OpenGL video drivers. More...
#include <opengl.h>
Public Member Functions | |
void | PrepareContext () |
std::string | GetDriverName () |
void | UpdatePalette (const Colour *pal, uint first, uint length) |
Update the stored palette. | |
bool | Resize (int w, int h, bool force=false) |
Change the size of the drawing window and allocate matching resources. | |
void | Paint () |
Render video buffer to the screen. | |
void | DrawMouseCursor () |
Draw mouse cursor on screen. | |
void | PopulateCursorCache () |
void | ClearCursorCache () |
Queue a request for cursor cache clear. | |
void * | GetVideoBuffer () |
Get a pointer to the memory for the video driver to draw to. | |
uint8_t * | GetAnimBuffer () |
Get a pointer to the memory for the separate animation buffer. | |
void | ReleaseVideoBuffer (const Rect &update_rect) |
Update video buffer texture after the video buffer was filled. | |
void | ReleaseAnimBuffer (const Rect &update_rect) |
Update animation buffer texture after the animation buffer was filled. | |
bool | Is32BppSupported () override |
Can the sprite encoder make use of RGBA sprites? | |
uint | GetSpriteAlignment () override |
Get the value which the height and width on a sprite have to be aligned by. | |
Sprite * | Encode (const SpriteLoader::SpriteCollection &sprite, SpriteAllocator &allocator) override |
Convert a sprite from the loader to our own format. | |
Static Public Member Functions | |
static OpenGLBackend * | Get () |
Get singleton instance of this class. | |
static std::optional< std::string_view > | Create (GetOGLProcAddressProc get_proc, const Dimension &screen_res) |
Create and initialize the singleton back-end class. | |
static void | Destroy () |
Free resources and destroy singleton back-end class. | |
Private Member Functions | |
OpenGLBackend () | |
Construct OpenGL back-end class. | |
~OpenGLBackend () | |
Free allocated resources. | |
std::optional< std::string_view > | Init (const Dimension &screen_res) |
Check for the needed OpenGL functionality and allocate all resources. | |
bool | InitShaders () |
Create all needed shader programs. | |
void | InternalClearCursorCache () |
Clear all cached cursor sprites. | |
void | RenderOglSprite (OpenGLSprite *gl_sprite, PaletteID pal, int x, int y, ZoomLevel zoom) |
Render a sprite to the back buffer. | |
Private Attributes | |
bool | persistent_mapping_supported = false |
Persistent pixel buffer mapping supported. | |
GLsync | sync_vid_mapping {} |
Sync object for the persistently mapped video buffer. | |
GLsync | sync_anim_mapping {} |
Sync object for the persistently mapped animation buffer. | |
void * | vid_buffer = nullptr |
Pointer to the mapped video buffer. | |
GLuint | vid_pbo = 0 |
Pixel buffer object storing the memory used for the video driver to draw to. | |
GLuint | vid_texture = 0 |
Texture handle for the video buffer texture. | |
GLuint | vid_program = 0 |
Shader program for rendering a RGBA video buffer. | |
GLuint | pal_program = 0 |
Shader program for rendering a paletted video buffer. | |
GLuint | vao_quad = 0 |
Vertex array object storing the rendering state for the fullscreen quad. | |
GLuint | vbo_quad = 0 |
Vertex buffer with a fullscreen quad. | |
GLuint | pal_texture = 0 |
Palette lookup texture. | |
void * | anim_buffer = nullptr |
Pointer to the mapped animation buffer. | |
GLuint | anim_pbo = 0 |
Pixel buffer object storing the memory used for the animation buffer. | |
GLuint | anim_texture = 0 |
Texture handle for the animation buffer texture. | |
GLuint | remap_program = 0 |
Shader program for blending and rendering a RGBA + remap texture. | |
GLint | remap_sprite_loc = 0 |
Uniform location for sprite parameters. | |
GLint | remap_screen_loc = 0 |
Uniform location for screen size. | |
GLint | remap_zoom_loc = 0 |
Uniform location for sprite zoom. | |
GLint | remap_rgb_loc = 0 |
Uniform location for RGB mode flag. | |
GLuint | sprite_program = 0 |
Shader program for blending and rendering a sprite to the video buffer. | |
GLint | sprite_sprite_loc = 0 |
Uniform location for sprite parameters. | |
GLint | sprite_screen_loc = 0 |
Uniform location for screen size. | |
GLint | sprite_zoom_loc = 0 |
Uniform location for sprite zoom. | |
GLint | sprite_rgb_loc = 0 |
Uniform location for RGB mode flag. | |
GLint | sprite_crash_loc = 0 |
Uniform location for crash remap mode flag. | |
LRUCache< SpriteID, OpenGLSprite > | cursor_cache |
Cache of encoded cursor sprites. | |
PaletteID | last_sprite_pal = (PaletteID)-1 |
Last uploaded remap palette. | |
bool | clear_cursor_cache = false |
A clear of the cursor cache is pending. | |
Point | cursor_pos {} |
Cursor position. | |
bool | cursor_in_window = false |
Cursor inside this window. | |
std::vector< CursorSprite > | cursor_sprites {} |
Sprites comprising cursor. | |
Static Private Attributes | |
static OpenGLBackend * | instance = nullptr |
Singleton instance pointer. | |
Platform-independent back-end class for OpenGL video drivers.
|
private |
|
private |
Free allocated resources.
Definition at line 496 of file opengl.cpp.
References anim_pbo, anim_texture, OpenGLSprite::Destroy(), InternalClearCursorCache(), pal_program, pal_texture, remap_program, sprite_program, vao_quad, vbo_quad, vid_pbo, vid_program, and vid_texture.
void OpenGLBackend::ClearCursorCache | ( | ) |
Queue a request for cursor cache clear.
Definition at line 1135 of file opengl.cpp.
References clear_cursor_cache.
Referenced by VideoDriver_SDL_OpenGL::ClearSystemSprites().
|
static |
Create and initialize the singleton back-end class.
get_proc | Callback to get an OpenGL function from the OS driver. |
screen_res | Current display resolution. |
Definition at line 467 of file opengl.cpp.
References Destroy(), Init(), instance, and OpenGLBackend().
|
static |
Free resources and destroy singleton back-end class.
Definition at line 480 of file opengl.cpp.
References instance.
Referenced by Create().
void OpenGLBackend::DrawMouseCursor | ( | ) |
Draw mouse cursor on screen.
Definition at line 1071 of file opengl.cpp.
References LRUCache< Tkey, Tdata >::Contains(), cursor_cache, cursor_in_window, cursor_sprites, LRUCache< Tkey, Tdata >::Get(), RenderOglSprite(), UnScaleByZoom(), OpenGLSprite::x_offs, and OpenGLSprite::y_offs.
Referenced by VideoDriver_SDL_OpenGL::Paint().
|
overridevirtual |
Convert a sprite from the loader to our own format.
Implements SpriteEncoder.
Definition at line 1261 of file opengl.cpp.
References LRUCache< Tkey, Tdata >::Insert().
|
inlinestatic |
Get singleton instance of this class.
Definition at line 82 of file opengl.h.
References instance.
Referenced by VideoDriver_SDL_OpenGL::AllocateBackingStore(), VideoDriver_SDL_OpenGL::ClearSystemSprites(), VideoDriver_SDL_OpenGL::GetVideoPointer(), VideoDriver_SDL_OpenGL::Paint(), VideoDriver_SDL_OpenGL::PopulateSystemSprites(), VideoDriver_SDL_OpenGL::ReleaseVideoPointer(), and VideoDriver_SDL_OpenGL::Start().
uint8_t * OpenGLBackend::GetAnimBuffer | ( | ) |
Get a pointer to the memory for the separate animation buffer.
Definition at line 1170 of file opengl.cpp.
References anim_buffer, anim_pbo, persistent_mapping_supported, and sync_anim_mapping.
Referenced by VideoDriver_SDL_OpenGL::GetVideoPointer().
std::string OpenGLBackend::GetDriverName | ( | ) |
Definition at line 744 of file opengl.cpp.
|
inlineoverridevirtual |
Get the value which the height and width on a sprite have to be aligned by.
Reimplemented from SpriteEncoder.
Definition at line 109 of file opengl.h.
References ZOOM_LVL_END.
void * OpenGLBackend::GetVideoBuffer | ( | ) |
Get a pointer to the memory for the video driver to draw to.
Definition at line 1148 of file opengl.cpp.
References BlitterFactory::GetCurrentBlitter(), Blitter::GetScreenDepth(), persistent_mapping_supported, sync_vid_mapping, vid_buffer, and vid_pbo.
Referenced by VideoDriver_SDL_OpenGL::GetVideoPointer().
|
private |
Check for the needed OpenGL functionality and allocate all resources.
screen_res | Current display resolution. |
Definition at line 525 of file opengl.cpp.
References anim_pbo, anim_texture, OpenGLSprite::Create(), Debug, InitShaders(), IsOpenGLVersionAtLeast(), pal_program, pal_texture, persistent_mapping_supported, remap_program, remap_rgb_loc, remap_screen_loc, remap_sprite_loc, remap_zoom_loc, sprite_crash_loc, sprite_program, sprite_rgb_loc, sprite_screen_loc, sprite_sprite_loc, sprite_zoom_loc, vao_quad, vbo_quad, vid_pbo, vid_program, and vid_texture.
Referenced by Create().
|
private |
Create all needed shader programs.
Definition at line 804 of file opengl.cpp.
References _frag_shader_direct, _frag_shader_direct_150, _frag_shader_palette, _frag_shader_palette_150, _frag_shader_rgb_mask_blend, _frag_shader_rgb_mask_blend_150, _frag_shader_sprite_blend, _frag_shader_sprite_blend_150, _vertex_shader_sprite, _vertex_shader_sprite_150, IsOpenGLVersionAtLeast(), lengthof, pal_program, remap_program, sprite_program, and vid_program.
Referenced by Init().
|
private |
Clear all cached cursor sprites.
Definition at line 1127 of file opengl.cpp.
References LRUCache< Tkey, Tdata >::Clear(), and cursor_cache.
Referenced by ~OpenGLBackend().
|
inlineoverridevirtual |
Can the sprite encoder make use of RGBA sprites?
Implements SpriteEncoder.
void OpenGLBackend::Paint | ( | ) |
Render video buffer to the screen.
Definition at line 1039 of file opengl.cpp.
References anim_texture, BlitterFactory::GetCurrentBlitter(), pal_program, pal_texture, remap_program, remap_rgb_loc, remap_screen_loc, remap_sprite_loc, remap_zoom_loc, vao_quad, vid_program, and vid_texture.
Referenced by VideoDriver_SDL_OpenGL::Paint().
void OpenGLBackend::PopulateCursorCache | ( | ) |
Definition at line 1100 of file opengl.cpp.
void OpenGLBackend::PrepareContext | ( | ) |
Definition at line 735 of file opengl.cpp.
void OpenGLBackend::ReleaseAnimBuffer | ( | const Rect & | update_rect | ) |
Update animation buffer texture after the animation buffer was filled.
update_rect | Rectangle encompassing the dirty region of the animation buffer. |
Definition at line 1231 of file opengl.cpp.
References anim_buffer, anim_pbo, anim_texture, persistent_mapping_supported, and sync_anim_mapping.
Referenced by VideoDriver_SDL_OpenGL::ReleaseVideoPointer().
void OpenGLBackend::ReleaseVideoBuffer | ( | const Rect & | update_rect | ) |
Update video buffer texture after the video buffer was filled.
update_rect | Rectangle encompassing the dirty region of the video buffer. |
Definition at line 1193 of file opengl.cpp.
References BlitterFactory::GetCurrentBlitter(), IsEmptyRect(), persistent_mapping_supported, sync_vid_mapping, vid_buffer, vid_pbo, and vid_texture.
Referenced by VideoDriver_SDL_OpenGL::ReleaseVideoPointer().
|
private |
Render a sprite to the back buffer.
gl_sprite | Sprite to render. |
x | X position of the sprite. |
y | Y position of the sprite. |
zoom | Zoom level to use. |
Definition at line 1277 of file opengl.cpp.
References OpenGLSprite::BindTextures(), GB(), OpenGLSprite::GetSize(), last_sprite_pal, OpenGLSprite::pal_identity, OpenGLSprite::pal_pbo, OpenGLSprite::pal_tex, pal_texture, PALETTE_CRASH, PALETTE_WIDTH, Recolour, sprite_crash_loc, sprite_program, sprite_rgb_loc, sprite_screen_loc, sprite_sprite_loc, sprite_zoom_loc, and vao_quad.
Referenced by DrawMouseCursor().
bool OpenGLBackend::Resize | ( | int | w, |
int | h, | ||
bool | force = false |
||
) |
Change the size of the drawing window and allocate matching resources.
w | New width of the window. |
h | New height of the window. |
force | Recreate resources even if size didn't change. |
False | if nothing had to be done, true otherwise. |
Definition at line 913 of file opengl.cpp.
References Align(), anim_buffer, anim_pbo, anim_texture, BlitterFactory::GetCurrentBlitter(), Blitter::GetScreenDepth(), persistent_mapping_supported, remap_program, remap_screen_loc, vid_buffer, vid_pbo, and vid_texture.
Referenced by VideoDriver_SDL_OpenGL::AllocateBackingStore().
void OpenGLBackend::UpdatePalette | ( | const Colour * | pal, |
uint | first, | ||
uint | length | ||
) |
Update the stored palette.
pal | Palette array with at least 256 elements. |
first | First entry to update. |
length | Number of entries to update. |
Definition at line 1025 of file opengl.cpp.
References pal_texture.
Referenced by VideoDriver_SDL_OpenGL::Paint().
|
private |
Pointer to the mapped animation buffer.
Definition at line 45 of file opengl.h.
Referenced by GetAnimBuffer(), ReleaseAnimBuffer(), and Resize().
|
private |
Pixel buffer object storing the memory used for the animation buffer.
Definition at line 46 of file opengl.h.
Referenced by GetAnimBuffer(), Init(), ReleaseAnimBuffer(), Resize(), and ~OpenGLBackend().
|
private |
Texture handle for the animation buffer texture.
Definition at line 47 of file opengl.h.
Referenced by Init(), Paint(), ReleaseAnimBuffer(), Resize(), and ~OpenGLBackend().
|
private |
A clear of the cursor cache is pending.
Definition at line 64 of file opengl.h.
Referenced by ClearCursorCache().
|
private |
Cache of encoded cursor sprites.
Definition at line 62 of file opengl.h.
Referenced by DrawMouseCursor(), and InternalClearCursorCache().
|
private |
|
private |
|
staticprivate |
Last uploaded remap palette.
Definition at line 63 of file opengl.h.
Referenced by RenderOglSprite().
|
private |
Shader program for rendering a paletted video buffer.
Definition at line 40 of file opengl.h.
Referenced by Init(), InitShaders(), Paint(), and ~OpenGLBackend().
|
private |
Palette lookup texture.
Definition at line 43 of file opengl.h.
Referenced by Init(), Paint(), RenderOglSprite(), UpdatePalette(), and ~OpenGLBackend().
|
private |
Persistent pixel buffer mapping supported.
Definition at line 32 of file opengl.h.
Referenced by GetAnimBuffer(), GetVideoBuffer(), Init(), ReleaseAnimBuffer(), ReleaseVideoBuffer(), and Resize().
|
private |
Shader program for blending and rendering a RGBA + remap texture.
Definition at line 49 of file opengl.h.
Referenced by Init(), InitShaders(), Paint(), Resize(), and ~OpenGLBackend().
|
private |
|
private |
|
private |
|
private |
|
private |
Uniform location for crash remap mode flag.
Definition at line 60 of file opengl.h.
Referenced by Init(), and RenderOglSprite().
|
private |
Shader program for blending and rendering a sprite to the video buffer.
Definition at line 55 of file opengl.h.
Referenced by Init(), InitShaders(), RenderOglSprite(), and ~OpenGLBackend().
|
private |
Uniform location for RGB mode flag.
Definition at line 59 of file opengl.h.
Referenced by Init(), and RenderOglSprite().
|
private |
Uniform location for screen size.
Definition at line 57 of file opengl.h.
Referenced by Init(), and RenderOglSprite().
|
private |
Uniform location for sprite parameters.
Definition at line 56 of file opengl.h.
Referenced by Init(), and RenderOglSprite().
|
private |
Uniform location for sprite zoom.
Definition at line 58 of file opengl.h.
Referenced by Init(), and RenderOglSprite().
|
private |
Sync object for the persistently mapped animation buffer.
Definition at line 34 of file opengl.h.
Referenced by GetAnimBuffer(), and ReleaseAnimBuffer().
|
private |
Sync object for the persistently mapped video buffer.
Definition at line 33 of file opengl.h.
Referenced by GetVideoBuffer(), and ReleaseVideoBuffer().
|
private |
Vertex array object storing the rendering state for the fullscreen quad.
Definition at line 41 of file opengl.h.
Referenced by Init(), Paint(), RenderOglSprite(), and ~OpenGLBackend().
|
private |
Vertex buffer with a fullscreen quad.
Definition at line 42 of file opengl.h.
Referenced by Init(), and ~OpenGLBackend().
|
private |
Pointer to the mapped video buffer.
Definition at line 36 of file opengl.h.
Referenced by GetVideoBuffer(), ReleaseVideoBuffer(), and Resize().
|
private |
Pixel buffer object storing the memory used for the video driver to draw to.
Definition at line 37 of file opengl.h.
Referenced by GetVideoBuffer(), Init(), ReleaseVideoBuffer(), Resize(), and ~OpenGLBackend().
|
private |
Shader program for rendering a RGBA video buffer.
Definition at line 39 of file opengl.h.
Referenced by Init(), InitShaders(), Paint(), and ~OpenGLBackend().
|
private |
Texture handle for the video buffer texture.
Definition at line 38 of file opengl.h.
Referenced by Init(), Paint(), ReleaseVideoBuffer(), Resize(), and ~OpenGLBackend().