127 lines
4.1 KiB
Diff
127 lines
4.1 KiB
Diff
commit d2a28a33f6a2bda7000ce201d52ff99714895640
|
|
Author: Emery Hemingway <ehmry@posteo.net>
|
|
Date: Fri May 15 11:28:10 2020 +0530
|
|
|
|
vbox: use Nitpicker mode for initial resolution
|
|
|
|
diff --git a/repos/ports/src/virtualbox5/frontend/fb.h b/repos/ports/src/virtualbox5/frontend/fb.h
|
|
index 95a7db8602..bf2d65d7c1 100644
|
|
--- a/repos/ports/src/virtualbox5/frontend/fb.h
|
|
+++ b/repos/ports/src/virtualbox5/frontend/fb.h
|
|
@@ -40,7 +40,7 @@ class Genodefb :
|
|
Nitpicker::Connection &_nitpicker;
|
|
Fb_Genode::Session &_fb { *_nitpicker.framebuffer() };
|
|
View_handle _view;
|
|
- Fb_Genode::Mode _fb_mode { 1024, 768, Fb_Genode::Mode::RGB565 };
|
|
+ Fb_Genode::Mode _fb_mode { _nitpicker.mode() };
|
|
|
|
/*
|
|
* The mode currently used by the VM. Can be smaller than the
|
|
|
|
commit b6bf91067a4c1c6d5b3508aedd949c8e1a7fe4b3
|
|
Author: Emery Hemingway <ehmry@posteo.net>
|
|
Date: Fri May 15 11:20:47 2020 +0530
|
|
|
|
vbox: fail on invalid framebuffer dataspace
|
|
|
|
VirtualBox can hang during initialization if Nitpicker returns an
|
|
invalid dataspace due to insufficient server-side resources. Make
|
|
an invalid dataspace a critical rather than silent error.
|
|
|
|
diff --git a/repos/ports/src/virtualbox5/frontend/fb.h b/repos/ports/src/virtualbox5/frontend/fb.h
|
|
index dce00fe4eb..95a7db8602 100644
|
|
--- a/repos/ports/src/virtualbox5/frontend/fb.h
|
|
+++ b/repos/ports/src/virtualbox5/frontend/fb.h
|
|
@@ -21,6 +21,9 @@
|
|
#include <os/texture_rgb888.h>
|
|
#include <os/dither_painter.h>
|
|
|
|
+#include <base/attached_dataspace.h>
|
|
+#include <util/reconstructible.h>
|
|
+
|
|
/* VirtualBox includes */
|
|
|
|
#include "Global.h"
|
|
@@ -35,7 +38,7 @@ class Genodefb :
|
|
|
|
Genode::Env &_env;
|
|
Nitpicker::Connection &_nitpicker;
|
|
- Fb_Genode::Session &_fb;
|
|
+ Fb_Genode::Session &_fb { *_nitpicker.framebuffer() };
|
|
View_handle _view;
|
|
Fb_Genode::Mode _fb_mode { 1024, 768, Fb_Genode::Mode::RGB565 };
|
|
|
|
@@ -43,18 +46,18 @@ class Genodefb :
|
|
* The mode currently used by the VM. Can be smaller than the
|
|
* framebuffer mode.
|
|
*/
|
|
- Fb_Genode::Mode _virtual_fb_mode;
|
|
+ Fb_Genode::Mode _virtual_fb_mode { _initial_setup() };
|
|
+
|
|
+ Genode::Reconstructible<Genode::Attached_dataspace>
|
|
+ _fb_dataspace { _env.rm(), _fb.dataspace() };
|
|
|
|
- void *_fb_base;
|
|
RTCRITSECT _fb_lock;
|
|
|
|
void _clear_screen()
|
|
{
|
|
- if (!_fb_base) return;
|
|
-
|
|
size_t const max_h = Genode::min(_fb_mode.height(), _virtual_fb_mode.height());
|
|
size_t const num_pixels = _fb_mode.width() * max_h;
|
|
- memset(_fb_base, 0, num_pixels * _fb_mode.bytes_per_pixel());
|
|
+ memset(_fb_dataspace->local_addr<char>(), 0, num_pixels * _fb_mode.bytes_per_pixel());
|
|
_fb.refresh(0, 0, _virtual_fb_mode.width(), _virtual_fb_mode.height());
|
|
}
|
|
|
|
@@ -91,10 +94,7 @@ class Genodefb :
|
|
Genodefb (Genode::Env &env, Nitpicker::Connection &nitpicker)
|
|
:
|
|
_env(env),
|
|
- _nitpicker(nitpicker),
|
|
- _fb(*nitpicker.framebuffer()),
|
|
- _virtual_fb_mode(_initial_setup()),
|
|
- _fb_base(env.rm().attach(_fb.dataspace()))
|
|
+ _nitpicker(nitpicker)
|
|
{
|
|
int rc = RTCritSectInit(&_fb_lock);
|
|
Assert(rc == VINF_SUCCESS);
|
|
@@ -109,16 +109,11 @@ class Genodefb :
|
|
|
|
_fb_mode = mode;
|
|
|
|
- if (_fb_base)
|
|
- _env.rm().detach(_fb_base);
|
|
+ _fb_dataspace.destruct();
|
|
|
|
_adjust_buffer();
|
|
|
|
- try {
|
|
- _fb_base = _env.rm().attach(_fb.dataspace());
|
|
- } catch (...) {
|
|
- _fb_base = nullptr;
|
|
- }
|
|
+ _fb_dataspace.construct(_env.rm(), _fb.dataspace());
|
|
|
|
Unlock();
|
|
}
|
|
@@ -201,8 +196,6 @@ class Genodefb :
|
|
PRUint32 imageSize,
|
|
PRUint8 *image) override
|
|
{
|
|
- if (!_fb_base) return S_OK;
|
|
-
|
|
Lock();
|
|
|
|
Nitpicker::Area const area_fb = Nitpicker::Area(_fb_mode.width(),
|
|
@@ -215,7 +208,7 @@ class Genodefb :
|
|
typedef Pixel_rgb565 Pixel_dst;
|
|
|
|
Texture<Pixel_src> texture((Pixel_src *)image, nullptr, area_vm);
|
|
- Surface<Pixel_dst> surface((Pixel_dst *)_fb_base, area_fb);
|
|
+ Surface<Pixel_dst> surface(_fb_dataspace->local_addr<Pixel_dst>(), area_fb);
|
|
|
|
Dither_painter::paint(surface, texture, Surface_base::Point(o_x, o_y));
|
|
|