#pragma once #include #ifndef SAW_OGL #error "OpenGL is not supported" #endif #include "gl_backends.hpp" #include "gl_context.hpp" #include "gl_window.hpp" #include 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 final { private: glx_library_extensions ext_lib_; own> device_; int visual_id_; GLXContext context_; GLXFBConfig fb_config_; friend class gpu_window; public: gpu_context(const glx_library_extensions&, own>, int, GLXContext, GLXFBConfig); ~gpu_context(); own> create_window(const video_mode&, std::string_view); void flush(); }; template<> class gpu_window final { private: own> window_; gpu_context* context_; ::GLXWindow glx_window_handle_; public: gpu_window(own> window, gpu_context& 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> on_event(); }; } }