From 92f7d224725ef3952924e230d2b41b58c043b9e3 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 14 Apr 2021 11:51:38 +0200 Subject: [PATCH] gui_fb: always set a usable framebuffer mode Reduce the size of a requested mode until there is sufficient RAM to render that mode, rather than refuse to set a mode at all. --- repos/os/src/server/gui_fb/main.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/repos/os/src/server/gui_fb/main.cc b/repos/os/src/server/gui_fb/main.cc index 923208896e..8ce9710224 100644 --- a/repos/os/src/server/gui_fb/main.cc +++ b/repos/os/src/server/gui_fb/main.cc @@ -121,7 +121,7 @@ struct Framebuffer::Session_component : Genode::Rpc_object bool _dataspace_is_new = true; - bool _ram_suffices_for_mode(Framebuffer::Mode mode) const + bool ram_suffices_for_mode(Framebuffer::Mode mode) const { /* calculation in bytes */ size_t const used = _buffer_num_bytes, @@ -153,11 +153,6 @@ struct Framebuffer::Session_component : Genode::Rpc_object Framebuffer::Mode const mode { .area = size }; - if (!_ram_suffices_for_mode(mode)) { - Genode::warning("insufficient RAM for mode ", mode); - return; - } - _next_mode = mode; if (_mode_sigh.valid()) @@ -372,7 +367,18 @@ struct Nit_fb::Main : View_updater if (height < 0) height = gui_height + height; } - fb_session.size(Area(width, height)); + Framebuffer::Mode mode { .area = Area(width, height) }; + + if (!fb_session.ram_suffices_for_mode(mode)) + Genode::warning("insufficient RAM for mode ", mode); + + while (!fb_session.ram_suffices_for_mode(mode)) { + mode.area = Area( + (mode.area.w() / 4) * 3, + (mode.area.h() / 4) * 3); + } + + fb_session.size(mode.area); } void handle_config_update() -- 2.31.0