aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-12-01 21:25:37 +0800
committerYuqian Yang <crupest@crupest.life>2025-12-01 21:25:37 +0800
commitd5d65b703244dfcc31228439e91ad0cfebb76456 (patch)
tree9550fdf372dc36fc512ba8af73168e1e9aae93bf
parentd54732324827bcfdc75e684b6636c53c109757c4 (diff)
downloadcru-d5d65b703244dfcc31228439e91ad0cfebb76456.tar.gz
cru-d5d65b703244dfcc31228439e91ad0cfebb76456.tar.bz2
cru-d5d65b703244dfcc31228439e91ad0cfebb76456.zip
Move out OpengGLRenderer.
-rw-r--r--include/cru/platform/gui/sdl/OpenGLRenderer.h25
-rw-r--r--include/cru/platform/gui/sdl/Window.h5
-rw-r--r--src/platform/gui/sdl/CMakeLists.txt5
-rw-r--r--src/platform/gui/sdl/OpenGLRenderer.cpp31
-rw-r--r--src/platform/gui/sdl/Window.cpp24
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