diff --git a/packages/genodelabs/depot-targets.nix b/packages/genodelabs/depot-targets.nix index 2162bdc..28499dd 100644 --- a/packages/genodelabs/depot-targets.nix +++ b/packages/genodelabs/depot-targets.nix @@ -88,7 +88,7 @@ in { gpt_write.portInputs = with ports; [ jitterentropy ]; grep = { }; gui_fader = { }; - gui_fb = { }; + gui_fb.patches = [ ./patches/gui_fb.patch ]; icu = { }; imx53_qsb_drivers = { }; imx8_fb_drv = { }; diff --git a/packages/genodelabs/patches/gui_fb.patch b/packages/genodelabs/patches/gui_fb.patch new file mode 100644 index 0000000..684466a --- /dev/null +++ b/packages/genodelabs/patches/gui_fb.patch @@ -0,0 +1,59 @@ +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 +