diff --git a/examples/gl-shadertoy/shadertoy.cc b/examples/gl-shadertoy/shadertoy.cc index 9159ad8..e6ac7f5 100644 --- a/examples/gl-shadertoy/shadertoy.cc +++ b/examples/gl-shadertoy/shadertoy.cc @@ -394,13 +394,19 @@ int main(int argc, char **argv) { } } + Egl::config egl_config{}; + egl_config.context_attribs_size = kEglContextAttribs.size(); + egl_config.context_attribs = kEglContextAttribs.data(); + egl_config.config_attribs_size = kEglConfigAttribs.size(); + egl_config.config_attribs = kEglConfigAttribs.data(); + egl_config.buffer_bpp = 32; + egl_config.swap_interval = config.interval; + egl_config.type = Egl::OPENGL_API; + auto top_level = wm.create_top_level( "simple-egl", "org.freedesktop.gitlab.jwinarske.waypp.simple_egl", config.width, config.height, 0, 0, config.fullscreen, config.maximized, - config.fullscreen_ratio, config.tearing, draw_frame, - kEglContextAttribs.data(), kEglContextAttribs.size(), - kEglConfigAttribs.data(), kEglConfigAttribs.size(), Egl::OPENGL_API, 32, - config.interval); + config.fullscreen_ratio, config.tearing, draw_frame, &egl_config); top_level->start_frame_callbacks(); diff --git a/examples/simple-egl.cc b/examples/simple-egl.cc index a370a0b..93f7bca 100644 --- a/examples/simple-egl.cc +++ b/examples/simple-egl.cc @@ -530,13 +530,19 @@ int main(int argc, char **argv) { } } + Egl::config egl_config{}; + egl_config.context_attribs_size = kEglContextAttribs.size(); + egl_config.context_attribs = kEglContextAttribs.data(); + egl_config.config_attribs_size = kEglConfigAttribs.size(); + egl_config.config_attribs = kEglConfigAttribs.data(); + egl_config.buffer_bpp = config.buffer_bpp; + egl_config.swap_interval = config.interval; + egl_config.type = Egl::OPENGL_ES_API; + auto top_level = wm.create_top_level( "simple-egl", "org.freedesktop.gitlab.jwinarske.waypp.simple_egl", config.width, config.height, 0, 0, config.fullscreen, config.maximized, - config.fullscreen_ratio, config.tearing, draw_frame, - kEglContextAttribs.data(), kEglContextAttribs.size(), - kEglConfigAttribs.data(), kEglConfigAttribs.size(), Egl::OPENGL_ES_API, - config.buffer_bpp, config.interval); + config.fullscreen_ratio, config.tearing, draw_frame, &egl_config); top_level->start_frame_callbacks(); diff --git a/src/window/egl.cc b/src/window/egl.cc index 401fa44..3f95f05 100644 --- a/src/window/egl.cc +++ b/src/window/egl.cc @@ -31,16 +31,11 @@ Egl::Egl(struct wl_display *display, struct wl_surface *wl_surface, int width, int height, - const int32_t *context_attribs, - size_t context_attribs_size, - const int32_t *config_attribs, - size_t config_attribs_size, - int buffer_bpp, - enum api type) + struct config *config) : dpy_(eglGetDisplay(display)), - context_attribs_(context_attribs, context_attribs + context_attribs_size), - config_attribs_(config_attribs, config_attribs + config_attribs_size), - buffer_bpp_(buffer_bpp), + context_attribs_(config->context_attribs, config->context_attribs + config->context_attribs_size), + config_attribs_(config->config_attribs, config->config_attribs + config->config_attribs_size), + buffer_bpp_(config->buffer_bpp), wl_surface_(wl_surface), width_(width), height_(height) { @@ -50,7 +45,7 @@ Egl::Egl(struct wl_display *display, throw std::runtime_error("eglInitialize failed."); } - ret = eglBindAPI(type); + ret = eglBindAPI(config->type); if (ret != EGL_TRUE) { throw std::runtime_error("eglBindAPI failed."); } @@ -71,11 +66,11 @@ Egl::Egl(struct wl_display *display, EGLint red_size; for (EGLint i = 0; i < n; i++) { - eglGetConfigAttrib(dpy_, configs[i], EGL_BUFFER_SIZE, &buffer_bpp); + eglGetConfigAttrib(dpy_, configs[i], EGL_BUFFER_SIZE, &config->buffer_bpp); eglGetConfigAttrib(dpy_, configs[i], EGL_RED_SIZE, &red_size); - SPDLOG_DEBUG("EGL_BUFFER_SIZE: {}", buffer_bpp); + SPDLOG_DEBUG("EGL_BUFFER_SIZE: {}", config->buffer_bpp); SPDLOG_DEBUG("EGL_RED_SIZE: {}", red_size); - if ((buffer_bpp_ == 0 || buffer_bpp_ == buffer_bpp) && red_size < 10) { + if ((buffer_bpp_ == 0 || buffer_bpp_ == config->buffer_bpp) && red_size < 10) { config_ = configs[i]; break; } diff --git a/src/window/egl.h b/src/window/egl.h index 722bcdf..33bf861 100644 --- a/src/window/egl.h +++ b/src/window/egl.h @@ -29,16 +29,21 @@ class Egl { OPENGL_API = 0x30A2, }; + struct config { + int buffer_bpp; + int swap_interval; + const int32_t *context_attribs; + size_t context_attribs_size; + const int32_t *config_attribs; + size_t config_attribs_size; + enum Egl::api type; + }; + explicit Egl(struct wl_display *display, struct wl_surface *wl_surface, int width, int height, - const int32_t *context_attribs, - size_t context_attribs_size, - const int32_t *config_attribs, - size_t config_attribs_size, - int buffer_bpp, - enum api type = OPENGL_ES_API); + struct config *config); ~Egl(); @@ -50,14 +55,14 @@ class Egl { void swap_buffers(); - void get_buffer_age(EGLint &age); - - bool have_swap_buffers_width_damage() const { + [[nodiscard]] bool have_swap_buffers_with_damage() const { return pfSwapBufferWithDamage_ != nullptr; } void swap_buffers_with_damage(const EGLint *rects, EGLint n_rects); + void get_buffer_age(EGLint &age); + void resize(int width, int height, int dx, int dy); // Disallow copy and assign. diff --git a/src/window/window.cc b/src/window/window.cc index c92c2bc..513e4ba 100644 --- a/src/window/window.cc +++ b/src/window/window.cc @@ -31,13 +31,7 @@ Window::Window(WindowManager *wm, bool maximized, bool fullscreen_ratio, bool tearing, - int buffer_bpp, - int swap_interval, - const int32_t *context_attribs, - size_t context_attribs_size, - const int32_t *config_attribs, - size_t config_attribs_size, - enum Egl::api type) + Egl::config *egl_config) : wm_(wm), buffer_transform_(WL_OUTPUT_TRANSFORM_NORMAL), frame_callback_(frame_callback), @@ -49,8 +43,6 @@ Window::Window(WindowManager *wm, outputs_(wm->get_outputs()), valid_(true), logical_size_{.width = width, .height = height}, - buffer_bpp_(buffer_bpp), - swap_interval_(swap_interval), buffer_size_{.width = width, .height = height}, window_size_{.width = buffer_size_.width, .height = buffer_size_.height}, needs_buffer_geometry_update_(false), @@ -81,12 +73,9 @@ Window::Window(WindowManager *wm, } #if ENABLE_EGL - if (context_attribs_size && config_attribs_size) { - egl_ = std::make_unique(wm->get_display(), wl_surface_, width, height, - context_attribs, context_attribs_size, - config_attribs, config_attribs_size, - buffer_bpp, type); - egl_->set_swap_interval(swap_interval); + if (egl_config && egl_config->context_attribs_size && egl_config->config_attribs_size) { + egl_ = std::make_unique(wm->get_display(), wl_surface_, width, height, egl_config); + egl_->set_swap_interval(egl_config->swap_interval); } #endif @@ -428,7 +417,7 @@ void Window::swap_buffers() { bool Window::have_swap_buffers_width_damage() { #if ENABLE_EGL if (egl_) { - return egl_->have_swap_buffers_width_damage(); + return egl_->have_swap_buffers_with_damage(); } #endif return false; diff --git a/src/window/window.h b/src/window/window.h index 35f488f..fc9b6b9 100644 --- a/src/window/window.h +++ b/src/window/window.h @@ -70,13 +70,7 @@ class Window { bool maximized, bool fullscreen_ratio, bool tearing, - int buffer_bpp = 0, - int swap_interval = 0, - const int32_t *context_attribs = nullptr, - size_t context_attribs_size = 0, - const int32_t *config_attribs = nullptr, - size_t config_attribs_size = 0, - enum Egl::api type = Egl::OPENGL_ES_API); + Egl::config *egl_config); ~Window(); @@ -220,8 +214,6 @@ class Window { bool resize_{}; bool activated_{}; - int buffer_bpp_ = 0; - int swap_interval_ = 1; int delay_ = 0; int32_t buffer_scale_ = 1; diff --git a/src/window/xdg_toplevel.cc b/src/window/xdg_toplevel.cc index bba956d..052416a 100644 --- a/src/window/xdg_toplevel.cc +++ b/src/window/xdg_toplevel.cc @@ -37,13 +37,7 @@ XdgTopLevel::XdgTopLevel( bool fullscreen_ratio, bool tearing, const std::function &frame_callback, - int buffer_bpp, - int swap_interval, - const int32_t *context_attribs, - size_t context_attribs_size, - const int32_t *config_attribs, - size_t config_attribs_size, - enum Egl::api type) + Egl::config *egl_config) : Window(wm, title, buffer_count, @@ -55,13 +49,7 @@ XdgTopLevel::XdgTopLevel( maximized, fullscreen_ratio, tearing, - buffer_bpp, - swap_interval, - context_attribs, - context_attribs_size, - config_attribs, - config_attribs_size, - type), + egl_config), wm_(wm), title_(title), app_id_(app_id) { diff --git a/src/window/xdg_toplevel.h b/src/window/xdg_toplevel.h index 736a5b7..f66aa7a 100644 --- a/src/window/xdg_toplevel.h +++ b/src/window/xdg_toplevel.h @@ -47,13 +47,7 @@ class XdgTopLevel : public Window { bool fullscreen_ratio, bool tearing, const std::function &frame_callback, - int buffer_bpp = 0, - int swap_interval = 0, - const int32_t *context_attribs = nullptr, - size_t context_attribs_size = 0, - const int32_t *config_attribs = nullptr, - size_t config_attribs_size = 0, - enum Egl::api type = Egl::OPENGL_ES_API); + Egl::config *egl_config); ~XdgTopLevel(); diff --git a/src/window_manager/xdg_window_manager.cc b/src/window_manager/xdg_window_manager.cc index 5eb45a8..7a0cca5 100644 --- a/src/window_manager/xdg_window_manager.cc +++ b/src/window_manager/xdg_window_manager.cc @@ -94,19 +94,11 @@ XdgTopLevel *XdgWindowManager::create_top_level( bool fullscreen_ratio, bool tearing, const std::function &frame_callback, - const int32_t *context_attribs, - size_t context_attribs_size, - const int32_t *config_attribs, - size_t config_attribs_size, - enum Egl::api type, - int buffer_bpp, - int swap_interval) { + Egl::config *egl_config) { auto wm = reinterpret_cast(this); xdg_top_level_ = std::make_unique( wm, title, app_id, width, height, buffer_count, buffer_format, fullscreen, - maximized, fullscreen_ratio, tearing, frame_callback, buffer_bpp, - swap_interval, context_attribs, context_attribs_size, config_attribs, - config_attribs_size, type); + maximized, fullscreen_ratio, tearing, frame_callback, egl_config); return xdg_top_level_.get(); } diff --git a/src/window_manager/xdg_window_manager.h b/src/window_manager/xdg_window_manager.h index d12758c..e682330 100644 --- a/src/window_manager/xdg_window_manager.h +++ b/src/window_manager/xdg_window_manager.h @@ -54,13 +54,7 @@ class XdgWindowManager : public WindowManager { bool fullscreen_ratio, bool tearing, const std::function &frame_callback, - const int32_t *context_attribs = nullptr, - size_t context_attribs_size = 0, - const int32_t *config_attribs = nullptr, - size_t config_attribs_size = 0, - enum Egl::api type = Egl::OPENGL_ES_API, - int buffer_bpp = 0, - int swap_interval = 0); + Egl::config *egl_config = nullptr); // Disallow copy and assign. XdgWindowManager(const XdgWindowManager &) = delete;