summaryrefslogtreecommitdiff
path: root/modules/window-opengl/gl_xcb.h
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2023-12-04 12:18:14 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2023-12-04 12:18:14 +0100
commita14896f9ed209dd3f9597722e5a5697bd7dbf531 (patch)
tree089ca5cbbd206d1921f8f6b53292f5bc1902ca5c /modules/window-opengl/gl_xcb.h
parent84ecdcbca9e55b1f57fbb832e12ff4fdbb86e7c9 (diff)
meta: Renamed folder containing source
Diffstat (limited to 'modules/window-opengl/gl_xcb.h')
-rw-r--r--modules/window-opengl/gl_xcb.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/modules/window-opengl/gl_xcb.h b/modules/window-opengl/gl_xcb.h
new file mode 100644
index 0000000..0d84662
--- /dev/null
+++ b/modules/window-opengl/gl_xcb.h
@@ -0,0 +1,68 @@
+#pragma once
+
+#include <forstio/window/xcb.h>
+
+#ifndef SAW_OGL
+#error "OpenGL is not supported"
+#endif
+
+#include "gl_backends.h"
+#include "gl_context.h"
+#include "gl_window.h"
+
+#include <GL/glx.h>
+
+namespace saw {
+namespace gfx {
+
+struct glx_library_extensions {
+public:
+ std::string_view raw_extension_string;
+ GLXContext (*glXCreateContextAttribsARB)(Display*, GLXFBConfig, GLXContext, Bool, const int*) = nullptr;
+};
+
+template<>
+class gpu_context<backend::gl_linux_xcb> final {
+private:
+ glx_library_extensions ext_lib_;
+ own<device<backend::linux_xcb>> device_;
+ int visual_id_;
+ GLXContext context_;
+ GLXFBConfig fb_config_;
+
+ friend class gpu_window<backend::gl_linux_xcb>;
+public:
+ gpu_context(const glx_library_extensions&, own<device<backend::linux_xcb>>, int, GLXContext, GLXFBConfig);
+ ~gpu_context();
+
+ own<gpu_window<backend::gl_linux_xcb>> create_window(const video_mode&, std::string_view);
+
+ void flush();
+};
+
+template<>
+class gpu_window<backend::gl_linux_xcb> final {
+private:
+ own<window<backend::linux_xcb>> window_;
+ gpu_context<backend::gl_linux_xcb>* context_;
+
+ ::GLXWindow glx_window_handle_;
+public:
+ gpu_window(own<window<backend::linux_xcb>> window, gpu_context<backend::gl_linux_xcb>& ctx,
+ ::GLXWindow);
+ ~gpu_window();
+
+ void bind();
+ void swap();
+ void show();
+ void hide();
+
+ const video_mode& get_video_mode() const;
+ const std::string_view get_title() const;
+
+ void resize(size_t height, size_t width);
+
+ conveyor<data<schema::WindowEvents>> on_event();
+};
+}
+}