From 8dcca49f42627400773dcc707ebaa757cbeef37b Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Thu, 4 Dec 2025 22:23:45 +0800 Subject: Impl sdl opengl renderer. --- include/cru/platform/graphics/cairo/CairoPainter.h | 4 ++++ include/cru/platform/gui/sdl/OpenGLRenderer.h | 27 +++++++++++++++++++++- include/cru/platform/gui/sdl/Window.h | 7 ++++-- 3 files changed, 35 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/cru/platform/graphics/cairo/CairoPainter.h b/include/cru/platform/graphics/cairo/CairoPainter.h index 0833e42b..039cef60 100644 --- a/include/cru/platform/graphics/cairo/CairoPainter.h +++ b/include/cru/platform/graphics/cairo/CairoPainter.h @@ -4,6 +4,7 @@ #include #include +#include #include namespace cru::platform::graphics::cairo { @@ -48,6 +49,8 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoPainter : public CairoResource, void EndDraw() override; + void SetEndDrawCallback(std::function action); + private: void CheckValidation(); @@ -55,6 +58,7 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoPainter : public CairoResource, cairo_t* cairo_; bool auto_release_; + std::function end_draw_callback_; cairo_surface_t* cairo_surface_; diff --git a/include/cru/platform/gui/sdl/OpenGLRenderer.h b/include/cru/platform/gui/sdl/OpenGLRenderer.h index 2db9d68d..18de3d55 100644 --- a/include/cru/platform/gui/sdl/OpenGLRenderer.h +++ b/include/cru/platform/gui/sdl/OpenGLRenderer.h @@ -3,8 +3,13 @@ #include "gl.h" #include +#include +#include +#include +#include #include +#include namespace cru::platform::gui::sdl { class SdlWindow; @@ -12,14 +17,34 @@ class SdlWindow; class SdlOpenGLRenderer { CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::sdl::SdlOpenGLRenderer") public: - explicit SdlOpenGLRenderer(SdlWindow* window); + SdlOpenGLRenderer(SdlWindow* window, int width, int height); ~SdlOpenGLRenderer(); + void Resize(int width, int height); + std::unique_ptr BeginPaint(); + void Present(); + + private: + GLuint CreateGLProgram(); + Guard MakeContextCurrent(); + private: SdlWindow* window_; SDL_Window* sdl_window_; SDL_WindowID sdl_window_id_; + + int width_, height_; + SDL_GLContext sdl_gl_context_; GladGLContext glad_gl_context_; + + GLuint gl_shader_program_; + GLuint gl_vertex_array_; + GLuint gl_vertex_buffer_; + GLuint gl_element_buffer_; + GLuint gl_texture_; + + cairo_surface_t* cairo_surface_; + cairo_t* cairo_; }; } // namespace cru::platform::gui::sdl diff --git a/include/cru/platform/gui/sdl/Window.h b/include/cru/platform/gui/sdl/Window.h index 28837c71..41e5befb 100644 --- a/include/cru/platform/gui/sdl/Window.h +++ b/include/cru/platform/gui/sdl/Window.h @@ -2,6 +2,7 @@ #include "Base.h" #include +#include #include #include @@ -114,11 +115,13 @@ class SdlWindow : public SdlResource, public virtual INativeWindow { #ifdef __unix private: - void UnixOnCreateWindow(); - void UnixOnDestroyWindow(); + void UnixOnCreate(int width, int height); + void UnixOnDestroy(); + void UnixOnResize(int width, int height); private: std::unique_ptr renderer_; + TimerAutoCanceler repaint_timer_canceler_; #endif }; } // namespace cru::platform::gui::sdl -- cgit v1.2.3