diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-12-01 21:25:37 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-12-01 21:25:37 +0800 |
| commit | d5d65b703244dfcc31228439e91ad0cfebb76456 (patch) | |
| tree | 9550fdf372dc36fc512ba8af73168e1e9aae93bf | |
| parent | d54732324827bcfdc75e684b6636c53c109757c4 (diff) | |
| download | cru-d5d65b703244dfcc31228439e91ad0cfebb76456.tar.gz cru-d5d65b703244dfcc31228439e91ad0cfebb76456.tar.bz2 cru-d5d65b703244dfcc31228439e91ad0cfebb76456.zip | |
Move out OpengGLRenderer.
| -rw-r--r-- | include/cru/platform/gui/sdl/OpenGLRenderer.h | 25 | ||||
| -rw-r--r-- | include/cru/platform/gui/sdl/Window.h | 5 | ||||
| -rw-r--r-- | src/platform/gui/sdl/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | src/platform/gui/sdl/OpenGLRenderer.cpp | 31 | ||||
| -rw-r--r-- | src/platform/gui/sdl/Window.cpp | 24 |
5 files changed, 65 insertions, 25 deletions
diff --git a/include/cru/platform/gui/sdl/OpenGLRenderer.h b/include/cru/platform/gui/sdl/OpenGLRenderer.h new file mode 100644 index 00000000..2db9d68d --- /dev/null +++ b/include/cru/platform/gui/sdl/OpenGLRenderer.h @@ -0,0 +1,25 @@ +#pragma once + +#include "gl.h" + +#include <cru/base/Base.h> + +#include <SDL3/SDL_video.h> + +namespace cru::platform::gui::sdl { +class SdlWindow; + +class SdlOpenGLRenderer { + CRU_DEFINE_CLASS_LOG_TAG("cru::platform::gui::sdl::SdlOpenGLRenderer") + public: + explicit SdlOpenGLRenderer(SdlWindow* window); + ~SdlOpenGLRenderer(); + + private: + SdlWindow* window_; + SDL_Window* sdl_window_; + SDL_WindowID sdl_window_id_; + SDL_GLContext sdl_gl_context_; + GladGLContext glad_gl_context_; +}; +} // namespace cru::platform::gui::sdl diff --git a/include/cru/platform/gui/sdl/Window.h b/include/cru/platform/gui/sdl/Window.h index 080575f3..28837c71 100644 --- a/include/cru/platform/gui/sdl/Window.h +++ b/include/cru/platform/gui/sdl/Window.h @@ -8,7 +8,7 @@ #include <SDL3/SDL_video.h> #ifdef __unix -#include "gl.h" +#include "OpenGLRenderer.h" #endif namespace cru::platform::gui::sdl { @@ -118,8 +118,7 @@ class SdlWindow : public SdlResource, public virtual INativeWindow { void UnixOnDestroyWindow(); private: - SDL_GLContext sdl_gl_context_; - std::unique_ptr<GladGLContext> glad_gl_context_; + std::unique_ptr<SdlOpenGLRenderer> renderer_; #endif }; } // namespace cru::platform::gui::sdl diff --git a/src/platform/gui/sdl/CMakeLists.txt b/src/platform/gui/sdl/CMakeLists.txt index bd8e2e70..f4de57c3 100644 --- a/src/platform/gui/sdl/CMakeLists.txt +++ b/src/platform/gui/sdl/CMakeLists.txt @@ -13,5 +13,8 @@ target_link_libraries(CruPlatformGuiSdl PUBLIC ) if(UNIX AND NOT APPLE) - target_sources(CruPlatformGuiSdl PRIVATE gl.c) + target_sources(CruPlatformGuiSdl PRIVATE + gl.c + OpenGLRenderer.cpp + ) endif() diff --git a/src/platform/gui/sdl/OpenGLRenderer.cpp b/src/platform/gui/sdl/OpenGLRenderer.cpp new file mode 100644 index 00000000..7f732cb3 --- /dev/null +++ b/src/platform/gui/sdl/OpenGLRenderer.cpp @@ -0,0 +1,31 @@ +#include "cru/platform/gui/sdl/OpenGLRenderer.h" +#include "cru/base/log/Logger.h" +#include "cru/platform/gui/sdl/Window.h" + +namespace cru::platform::gui::sdl { +SdlOpenGLRenderer::SdlOpenGLRenderer(SdlWindow* window) { + assert(window); + assert(window->GetSdlWindow()); + + window_ = window; + sdl_window_ = window->GetSdlWindow(); + sdl_window_id_ = window->GetSdlWindowId(); + + sdl_gl_context_ = SDL_GL_CreateContext(sdl_window_); + + if (!sdl_gl_context_) { + throw SdlException("Failed to create sdl gl context."); + } + + CheckSdlReturn(SDL_GL_MakeCurrent(sdl_window_, sdl_gl_context_)); + + auto version = gladLoadGLContext(&glad_gl_context_, SDL_GL_GetProcAddress); + CRU_LOG_TAG_DEBUG("SDL window id {}, openGL version: {}.", sdl_window_id_, + version); +} + +SdlOpenGLRenderer::~SdlOpenGLRenderer() { + CheckSdlReturn(SDL_GL_DestroyContext(sdl_gl_context_)); +} + +} // namespace cru::platform::gui::sdl diff --git a/src/platform/gui/sdl/Window.cpp b/src/platform/gui/sdl/Window.cpp index 9bb94398..c3772fbe 100644 --- a/src/platform/gui/sdl/Window.cpp +++ b/src/platform/gui/sdl/Window.cpp @@ -1,6 +1,5 @@ #include "cru/platform/gui/sdl/Window.h" #include "cru/base/Base.h" -#include "cru/base/log/Logger.h" #include "cru/platform/Base.h" #include "cru/platform/GraphicsBase.h" #include "cru/platform/graphics/NullPainter.h" @@ -10,6 +9,7 @@ #include "cru/platform/gui/sdl/Cursor.h" #include "cru/platform/gui/sdl/Input.h" #include "cru/platform/gui/sdl/InputMethod.h" +#include "cru/platform/gui/sdl/OpenGLRenderer.h" #include "cru/platform/gui/sdl/UiApplication.h" #include <SDL3/SDL_events.h> @@ -419,28 +419,10 @@ bool SdlWindow::HandleEvent(const SDL_Event* event) { #ifdef __unix void SdlWindow::UnixOnCreateWindow() { assert(sdl_window_); - sdl_gl_context_ = SDL_GL_CreateContext(sdl_window_); - - if (!sdl_gl_context_) { - throw SdlException("Failed to create sdl gl context."); - } - - CheckSdlReturn(SDL_GL_MakeCurrent(sdl_window_, sdl_gl_context_)); - - glad_gl_context_ = std::make_unique<GladGLContext>(); - auto version = - gladLoadGLContext(glad_gl_context_.get(), SDL_GL_GetProcAddress); - CRU_LOG_TAG_DEBUG("SDL window id {}, openGL version: {}.", sdl_window_id_, - version); + renderer_ = std::make_unique<SdlOpenGLRenderer>(this); } -void SdlWindow::UnixOnDestroyWindow() { - assert(sdl_window_); - assert(sdl_gl_context_); - assert(glad_gl_context_); - CheckSdlReturn(SDL_GL_DestroyContext(sdl_gl_context_)); - glad_gl_context_ = nullptr; -} +void SdlWindow::UnixOnDestroyWindow() { renderer_ = nullptr; } #endif } // namespace cru::platform::gui::sdl |
