Change pixel format to 32 bits per pixel

Until now, Genode's framebuffer session interface was based on the
RGB565 pixel format. This patch changes the pixel format to 32-bit
XRGB where the X part is ignored. It adapts all graphical applications
and device drivers accordingly.

The patch also adjusts the users of the drivers_interactive packages,
assigning 64 MiB RAM and 1500 caps to the drivers subsystem, which is
sufficient for covering high resolutions at 32 bits per pixel and to
accommodate multi-component USB HID input stacks.

Fixes #3784
This commit is contained in:
Norman Feske 2020-06-16 15:46:59 +02:00
parent 6119e03081
commit ef741ef80d
112 changed files with 500 additions and 696 deletions

View File

@ -1,5 +1,6 @@
base base
os os
blit
platform_session platform_session
timer_session timer_session
report_session report_session

View File

@ -27,9 +27,8 @@
#include <base/attached_ram_dataspace.h> #include <base/attached_ram_dataspace.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <os/reporter.h> #include <os/reporter.h>
#include <os/pixel_rgb565.h>
#include <os/pixel_rgb888.h> #include <os/pixel_rgb888.h>
#include <os/dither_painter.h> #include <blit/blit.h>
#include <lx_emul_c.h> #include <lx_emul_c.h>
@ -158,13 +157,13 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
Genode::Dataspace_capability dataspace() override Genode::Dataspace_capability dataspace() override
{ {
_ds.realloc(&_ram, _driver.width() * _driver.height() * _ds.realloc(&_ram, _driver.width() * _driver.height() *
Mode::bytes_per_pixel(Mode::RGB565)); mode().bytes_per_pixel());
_in_mode_change = false; _in_mode_change = false;
return _ds.cap(); return _ds.cap();
} }
Mode mode() const override { Mode mode() const override {
return Mode(_driver.width(), _driver.height(), Mode::RGB565); } return Mode { .area = { _driver.width(), _driver.height() } }; }
void mode_sigh(Genode::Signal_context_capability sigh) override { void mode_sigh(Genode::Signal_context_capability sigh) override {
_mode_sigh = sigh; } _mode_sigh = sigh; }
@ -179,12 +178,13 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
{ {
using namespace Genode; using namespace Genode;
if (!_driver.fb_addr() || if (!_driver.fb_addr() || !_ds.local_addr<void>() || _in_mode_change)
!_ds.local_addr<void>() || return;
_in_mode_change) return;
int width = _driver.width(); int width = _driver.width();
int height = _driver.height(); int height = _driver.height();
unsigned bpp = 4;
unsigned pitch = _driver.width();
/* clip specified coordinates against screen boundaries */ /* clip specified coordinates against screen boundaries */
int x2 = min(x + w - 1, width - 1), int x2 = min(x + w - 1, width - 1),
@ -194,18 +194,11 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
if (x1 > x2 || y1 > y2) return; if (x1 > x2 || y1 > y2) return;
/* copy pixels from back buffer to physical frame buffer */ /* copy pixels from back buffer to physical frame buffer */
Genode::Pixel_rgb565 * src = _ds.local_addr<Genode::Pixel_rgb565>(); char *src = _ds.local_addr<char>() + bpp*(width*y1 + x1),
Genode::Pixel_rgb888 * dst = (Genode::Pixel_rgb888*)_driver.fb_addr(); *dst = (char*)_driver.fb_addr() + bpp*(pitch*y1 + x1);
for (int row = y1; row <= y2; row++) { blit(src, bpp*width, dst, bpp*pitch,
int line_offset = width * row; bpp*(x2 - x1 + 1), y2 - y1 + 1);
Genode::Pixel_rgb565 const * s = src + line_offset + x1;
Genode::Pixel_rgb888 * d = dst + line_offset + x1;
for (int col = x1; col <= x2; col++) {
Genode::Pixel_rgb565 const px = *s++;
*d++ = Genode::Pixel_rgb888(px.r(), px.g(), px.b(), px.a());
}
}
} }
}; };

View File

@ -1,7 +1,7 @@
REQUIRES = arm_v8a REQUIRES = arm_v8a
TARGET = imx8_fb_drv TARGET = imx8_fb_drv
LIBS = base imx8_fb_include lx_kit_setjmp imx8_fb_drv LIBS = base imx8_fb_include lx_kit_setjmp imx8_fb_drv blit
SRC_CC = main.cc platform.cc lx_emul.cc SRC_CC = main.cc platform.cc lx_emul.cc
SRC_C = dummies.c lx_emul_c.c SRC_C = dummies.c lx_emul_c.c

View File

@ -43,8 +43,13 @@ class Framebuffer::Driver
struct Configuration struct Configuration
{ {
struct lx_c_fb_config _lx = { 16, 64, 64, 2, struct lx_c_fb_config _lx = { .height = 16,
nullptr, 0, nullptr }; .width = 64,
.pitch = 64,
.bpp = 4,
.addr = nullptr,
.size = 0,
.lx_fb = nullptr };
} _config; } _config;
Session_component &_session; Session_component &_session;
@ -168,8 +173,10 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
return _ds.cap(); return _ds.cap();
} }
Mode mode() const override { Mode mode() const override
return Mode(_driver.width(), _driver.height(), Mode::RGB565); } {
return Mode { .area { _driver.width(), _driver.height() } };
}
void mode_sigh(Genode::Signal_context_capability sigh) override { void mode_sigh(Genode::Signal_context_capability sigh) override {
_mode_sigh = sigh; } _mode_sigh = sigh; }

View File

@ -47,7 +47,7 @@ void lx_c_allocate_framebuffer(struct drm_device * dev,
if (!r) goto err2; if (!r) goto err2;
r->width = c->width; r->width = c->width;
r->height = c->height; r->height = c->height;
r->pixel_format = DRM_FORMAT_RGB565; r->pixel_format = DRM_FORMAT_XRGB8888;
r->pitches[0] = c->pitch; r->pitches[0] = c->pitch;
c->lx_fb = intel_framebuffer_create(obj, r); c->lx_fb = intel_framebuffer_create(obj, r);
if (IS_ERR(c->lx_fb)) goto err2; if (IS_ERR(c->lx_fb)) goto err2;

View File

@ -71,7 +71,7 @@ struct Scout::Canvas_base : Texture_allocator
}; };
#include <os/texture_rgb565.h> #include <os/texture_rgb888.h>
#include <base/env.h> #include <base/env.h>

View File

@ -16,7 +16,7 @@
/* Genode includes */ /* Genode includes */
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <base/attached_dataspace.h> #include <base/attached_dataspace.h>
/* Scout includes */ /* Scout includes */
@ -24,7 +24,7 @@
namespace Scout { namespace Scout {
using Genode::Pixel_rgb565; using Genode::Pixel_rgb888;
class Graphics_backend_impl; class Graphics_backend_impl;
} }
@ -45,8 +45,10 @@ class Scout::Graphics_backend_impl : public Graphics_backend
Genode::Dataspace_capability _init_fb_ds(Area max_size) Genode::Dataspace_capability _init_fb_ds(Area max_size)
{ {
_gui.buffer(Framebuffer::Mode(max_size.w(), max_size.h()*2, Framebuffer::Mode const mode { .area = { max_size.w(), max_size.h()*2 }};
Framebuffer::Mode::RGB565), false);
_gui.buffer(mode, false);
return _gui.framebuffer()->dataspace(); return _gui.framebuffer()->dataspace();
} }
@ -111,7 +113,7 @@ class Scout::Graphics_backend_impl : public Graphics_backend
{ {
bring_to_front(); bring_to_front();
typedef Genode::Pixel_rgb565 PT; typedef Genode::Pixel_rgb888 PT;
static Canvas<PT> canvas_0(_base<PT>(0), max_size, alloc); static Canvas<PT> canvas_0(_base<PT>(0), max_size, alloc);
static Canvas<PT> canvas_1(_base<PT>(1), max_size, alloc); static Canvas<PT> canvas_1(_base<PT>(1), max_size, alloc);
@ -130,7 +132,7 @@ class Scout::Graphics_backend_impl : public Graphics_backend
void copy_back_to_front(Rect rect) override void copy_back_to_front(Rect rect) override
{ {
typedef Genode::Pixel_rgb565 PT; typedef Genode::Pixel_rgb888 PT;
PT const *src = _base<PT>( _back_idx()); PT const *src = _base<PT>( _back_idx());
PT *dst = _base<PT>(_front_idx()); PT *dst = _base<PT>(_front_idx());

View File

@ -175,4 +175,4 @@ void Launchpad_window<PT>::handle_scroll(int view_pos)
ypos_sb(-view_pos, 0); ypos_sb(-view_pos, 0);
} }
template class Launchpad_window<Genode::Pixel_rgb565>; template class Launchpad_window<Genode::Pixel_rgb888>;

View File

@ -105,7 +105,7 @@ struct Main : Scout::Event_handler
_graphics_backend { _env.rm(), _gui, _heap, _max_size, _graphics_backend { _env.rm(), _gui, _heap, _max_size,
_initial_position, _initial_size }; _initial_position, _initial_size };
Launchpad_window<Pixel_rgb565> Launchpad_window<Pixel_rgb888>
_launchpad { _env, _graphics_backend, _initial_position, _initial_size, _launchpad { _env, _graphics_backend, _initial_position, _initial_size,
_max_size, _env.pd().avail_ram().value }; _max_size, _env.pd().avail_ram().value };

View File

@ -477,4 +477,4 @@ void Browser_window<PT>::handle_scroll(int view_pos)
ypos_sb(-view_pos, 0); ypos_sb(-view_pos, 0);
} }
template class Browser_window<Genode::Pixel_rgb565>; template class Browser_window<Genode::Pixel_rgb888>;

View File

@ -149,7 +149,7 @@ Document *create_document()
b0->append_plaintext("that can be started by clicking on the application's name. Before starting an", &plain_style); b0->append_plaintext("that can be started by clicking on the application's name. Before starting an", &plain_style);
b0->append_plaintext("application, the user can define the amount of memory quota to donate to the", &plain_style); b0->append_plaintext("application, the user can define the amount of memory quota to donate to the", &plain_style);
b0->append_plaintext("new application by adjusting the red bar using the mouse.", &plain_style); b0->append_plaintext("new application by adjusting the red bar using the mouse.", &plain_style);
Launcher *l0 = new Launcher("launchpad", 1, 100000, 22*1024*1024); Launcher *l0 = new Launcher("launchpad", 1, 100000, 36*1024*1024);
b0->append_launchertext("Start the launchpad by clicking on this link...", &link_style, l0); b0->append_launchertext("Start the launchpad by clicking on this link...", &link_style, l0);
chapter->append(b0); chapter->append(b0);

View File

@ -82,7 +82,7 @@ struct Scout::Main : Scout::Event_handler
void _init_navicons() void _init_navicons()
{ {
for (unsigned int i = 0; i < sizeof(navicons)/sizeof(void *); i++) { for (unsigned int i = 0; i < sizeof(navicons)/sizeof(void *); i++) {
Fade_icon<Pixel_rgb565, 64, 64> *icon = new Fade_icon<Pixel_rgb565, 64, 64>; Fade_icon<Pixel_rgb888, 64, 64> *icon = new Fade_icon<Pixel_rgb888, 64, 64>;
icon->rgba(navicons_rgba[i]); icon->rgba(navicons_rgba[i]);
icon->alpha(100); icon->alpha(100);
*navicons[i] = icon; *navicons[i] = icon;
@ -94,12 +94,12 @@ struct Scout::Main : Scout::Event_handler
Document &_doc = *create_document(); Document &_doc = *create_document();
/* create instance of browser window */ /* create instance of browser window */
Browser_window<Pixel_rgb565> _browser { &_doc, _graphics_backend, Browser_window<Pixel_rgb888> _browser { &_doc, _graphics_backend,
_initial_position, _initial_size, _initial_position, _initial_size,
_max_size, _config }; _max_size, _config };
/* initialize mouse cursor */ /* initialize mouse cursor */
Icon<Pixel_rgb565, 32, 32> _mcursor { }; Icon<Pixel_rgb888, 32, 32> _mcursor { };
void _init_mouse_cursor() void _init_mouse_cursor()
{ {

View File

@ -131,6 +131,7 @@ void Png_image::fill_cache(Canvas_base &canvas)
row_ptr = (png_byte *)alloc().alloc(needed_row_size); row_ptr = (png_byte *)alloc().alloc(needed_row_size);
curr_row_size = needed_row_size; curr_row_size = needed_row_size;
} }
memset(row_ptr, 0, curr_row_size);
/* fill texture */ /* fill texture */
for (unsigned j = 0; j < _min_size.h(); j++) { for (unsigned j = 0; j < _min_size.h(); j++) {

View File

@ -327,4 +327,4 @@ Element *Scrollbar<PT>::find(Point position)
} }
template class Scrollbar<Genode::Pixel_rgb565>; template class Scrollbar<Genode::Pixel_rgb888>;

View File

@ -198,8 +198,8 @@ Element *Icon<PT, W, H>::find(Point position)
return 0; return 0;
} }
template class Horizontal_shadow<Genode::Pixel_rgb565, 40>; template class Horizontal_shadow<Genode::Pixel_rgb888, 40>;
template class Horizontal_shadow<Genode::Pixel_rgb565, 160>; template class Horizontal_shadow<Genode::Pixel_rgb888, 160>;
template class Icon<Genode::Pixel_rgb565, 16, 16>; template class Icon<Genode::Pixel_rgb888, 16, 16>;
template class Icon<Genode::Pixel_rgb565, 32, 32>; template class Icon<Genode::Pixel_rgb888, 32, 32>;
template class Icon<Genode::Pixel_rgb565, 64, 64>; template class Icon<Genode::Pixel_rgb888, 64, 64>;

View File

@ -35,7 +35,7 @@ class Background_animator : public Scout::Tick
{ {
private: private:
Framebuffer_window<Scout::Pixel_rgb565> &_fb_win; Framebuffer_window<Scout::Pixel_rgb888> &_fb_win;
int _bg_offset = 0; int _bg_offset = 0;
@ -44,7 +44,7 @@ class Background_animator : public Scout::Tick
/** /**
* Constructor * Constructor
*/ */
Background_animator(Framebuffer_window<Scout::Pixel_rgb565> &fb_win) Background_animator(Framebuffer_window<Scout::Pixel_rgb888> &fb_win)
: _fb_win(fb_win) { schedule(20); } : _fb_win(fb_win) { schedule(20); }
/** /**
@ -169,7 +169,7 @@ class Liquid_fb::Main : public Scout::Event_handler
(init_window_content(_env.ram(), _env.rm(), _heap, _input_session_component, (init_window_content(_env.ram(), _env.rm(), _heap, _input_session_component,
config_fb_width, config_fb_height, config_alpha), true); config_fb_width, config_fb_height, config_alpha), true);
Framebuffer_window<Pixel_rgb565> Framebuffer_window<Pixel_rgb888>
_fb_win { _graphics_backend, window_content(), _fb_win { _graphics_backend, window_content(),
_initial_position, _initial_size, _max_size, _initial_position, _initial_size, _max_size,
config_title.string(), config_alpha, config_title.string(), config_alpha,

View File

@ -18,7 +18,7 @@
#include <framebuffer_session/framebuffer_session.h> #include <framebuffer_session/framebuffer_session.h>
#include <input/root.h> #include <input/root.h>
#include <nitpicker_gfx/texture_painter.h> #include <nitpicker_gfx/texture_painter.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/static_root.h> #include <os/static_root.h>
#include <timer_session/connection.h> #include <timer_session/connection.h>
@ -26,7 +26,7 @@
#include "services.h" #include "services.h"
typedef Genode::Texture<Genode::Pixel_rgb565> Texture_rgb565; typedef Genode::Texture<Genode::Pixel_rgb888> Texture_rgb888;
class Window_content : public Scout::Element class Window_content : public Scout::Element
@ -81,17 +81,17 @@ class Window_content : public Scout::Element
Genode::Allocator &alloc; Genode::Allocator &alloc;
unsigned w, h; unsigned w, h;
Genode::Attached_ram_dataspace ds; Genode::Attached_ram_dataspace ds;
Genode::Pixel_rgb565 *pixel; Genode::Pixel_rgb888 *pixel;
unsigned char *alpha; unsigned char *alpha;
Genode::Texture<Genode::Pixel_rgb565> texture; Genode::Texture<Genode::Pixel_rgb888> texture;
Fb_texture(Genode::Ram_allocator &ram, Genode::Region_map &local_rm, Fb_texture(Genode::Ram_allocator &ram, Genode::Region_map &local_rm,
Genode::Allocator &alloc, Genode::Allocator &alloc,
unsigned w, unsigned h, bool config_alpha) unsigned w, unsigned h, bool config_alpha)
: :
alloc(alloc), w(w), h(h), alloc(alloc), w(w), h(h),
ds(ram, local_rm, w*h*sizeof(Genode::Pixel_rgb565)), ds(ram, local_rm, w*h*sizeof(Genode::Pixel_rgb888)),
pixel(ds.local_addr<Genode::Pixel_rgb565>()), pixel(ds.local_addr<Genode::Pixel_rgb888>()),
alpha((unsigned char *)alloc.alloc(w*h)), alpha((unsigned char *)alloc.alloc(w*h)),
texture(pixel, alpha, Scout::Area(w, h)) texture(pixel, alpha, Scout::Area(w, h))
{ {
@ -250,8 +250,7 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
Mode mode() const override Mode mode() const override
{ {
return Mode(_window_content.mode_size().w(), return Mode { .area = _window_content.mode_size() };
_window_content.mode_size().h(), Mode::RGB565);
} }
void mode_sigh(Genode::Signal_context_capability sigh) override { void mode_sigh(Genode::Signal_context_capability sigh) override {

View File

@ -21,7 +21,7 @@
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <timer_session/connection.h> #include <timer_session/connection.h>
#include <input/event.h> #include <input/event.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
/* /*
* Nitpicker's graphics backend * Nitpicker's graphics backend
@ -409,8 +409,7 @@ struct Nitlog::Main
void _init_gui_buffer() void _init_gui_buffer()
{ {
_gui.buffer(Framebuffer::Mode(_win_w, _win_h, _gui.buffer(Framebuffer::Mode { .area = { _win_w, _win_h } }, false);
Framebuffer::Mode::RGB565), false);
} }
bool const _gui_buffer_initialized = (_init_gui_buffer(), true); bool const _gui_buffer_initialized = (_init_gui_buffer(), true);
@ -420,7 +419,7 @@ struct Nitlog::Main
/* create log window */ /* create log window */
Attached_dataspace _fb_ds { _env.rm(), _gui.framebuffer()->dataspace() }; Attached_dataspace _fb_ds { _env.rm(), _gui.framebuffer()->dataspace() };
Canvas<Pixel_rgb565> _canvas { _fb_ds.local_addr<Pixel_rgb565>(), Canvas<Pixel_rgb888> _canvas { _fb_ds.local_addr<Pixel_rgb888>(),
::Area(_win_w, _win_h) }; ::Area(_win_w, _win_h) };
Log_window _log_window { _canvas, _font }; Log_window _log_window { _canvas, _font };

View File

@ -20,7 +20,6 @@
#include <base/attached_dataspace.h> #include <base/attached_dataspace.h>
#include <base/attached_ram_dataspace.h> #include <base/attached_ram_dataspace.h>
#include <os/surface.h> #include <os/surface.h>
#include <os/pixel_rgb565.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <os/pixel_rgb888.h> #include <os/pixel_rgb888.h>
@ -31,7 +30,6 @@
struct Gui_buffer struct Gui_buffer
{ {
typedef Genode::Pixel_rgb888 Pixel_rgb888; typedef Genode::Pixel_rgb888 Pixel_rgb888;
typedef Genode::Pixel_rgb565 Pixel_rgb565;
typedef Genode::Pixel_alpha8 Pixel_alpha8; typedef Genode::Pixel_alpha8 Pixel_alpha8;
typedef Genode::Surface<Pixel_rgb888> Pixel_surface; typedef Genode::Surface<Pixel_rgb888> Pixel_surface;
@ -58,11 +56,6 @@ struct Gui_buffer
/* setup virtual framebuffer mode */ /* setup virtual framebuffer mode */
gui.buffer(mode, true); gui.buffer(mode, true);
if (mode.format() != Framebuffer::Mode::RGB565) {
Genode::warning("color mode ", mode, " not supported");
return Genode::Dataspace_capability();
}
return gui.framebuffer()->dataspace(); return gui.framebuffer()->dataspace();
} }
@ -88,8 +81,8 @@ struct Gui_buffer
Genode::Ram_allocator &ram, Genode::Region_map &rm) Genode::Ram_allocator &ram, Genode::Region_map &rm)
: :
ram(ram), rm(rm), gui(gui), ram(ram), rm(rm), gui(gui),
mode(Genode::max(1UL, size.w()), Genode::max(1UL, size.h()), mode({ .area = { Genode::max(1U, size.w()),
gui.mode().format()) Genode::max(1U, size.h()) } })
{ {
reset_surface(); reset_surface();
} }
@ -97,7 +90,7 @@ struct Gui_buffer
/** /**
* Return size of virtual framebuffer * Return size of virtual framebuffer
*/ */
Area size() const { return Area(mode.width(), mode.height()); } Area size() const { return mode.area; }
template <typename FN> template <typename FN>
void apply_to_surface(FN const &fn) void apply_to_surface(FN const &fn)
@ -175,7 +168,7 @@ struct Gui_buffer
// XXX track dirty rectangles // XXX track dirty rectangles
Rect const clip_rect(Genode::Surface_base::Point(0, 0), size()); Rect const clip_rect(Genode::Surface_base::Point(0, 0), size());
Pixel_rgb565 *pixel_base = fb_ds.local_addr<Pixel_rgb565>(); Pixel_rgb888 *pixel_base = fb_ds.local_addr<Pixel_rgb888>();
Pixel_alpha8 *alpha_base = fb_ds.local_addr<Pixel_alpha8>() Pixel_alpha8 *alpha_base = fb_ds.local_addr<Pixel_alpha8>()
+ mode.bytes_per_pixel()*size().count(); + mode.bytes_per_pixel()*size().count();

View File

@ -81,12 +81,6 @@ class Nano3d::Scene
_init_framebuffer(Gui::Connection &gui, _init_framebuffer(Gui::Connection &gui,
Gui::Area const size) Gui::Area const size)
{ {
Framebuffer::Mode::Format const format = gui.mode().format();
if (format != Framebuffer::Mode::RGB565) {
Genode::error("framebuffer mode ", (int)format, " is not supported");
throw Unsupported_color_depth();
}
/* /*
* Dimension the virtual framebuffer 3 times as high as the * Dimension the virtual framebuffer 3 times as high as the
* visible view because it contains the visible buffer, the * visible view because it contains the visible buffer, the
@ -94,7 +88,7 @@ class Nano3d::Scene
*/ */
bool const use_alpha = true; bool const use_alpha = true;
unsigned const height = size.h()*NUM_BUFFERS; unsigned const height = size.h()*NUM_BUFFERS;
gui.buffer(Framebuffer::Mode(size.w(), height, format), gui.buffer(Framebuffer::Mode { .area = { size.w(), height } },
use_alpha); use_alpha);
return *gui.framebuffer(); return *gui.framebuffer();
@ -109,7 +103,7 @@ class Nano3d::Scene
*/ */
Gui::Area size() const Gui::Area size() const
{ {
return Gui::Area(mode.width(), mode.height()/NUM_BUFFERS); return Gui::Area(mode.area.w(), mode.area.h()/NUM_BUFFERS);
} }
Genode::Attached_dataspace ds { rm, framebuffer.dataspace() }; Genode::Attached_dataspace ds { rm, framebuffer.dataspace() };

View File

@ -32,8 +32,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -34,8 +34,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -36,8 +36,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -45,8 +45,8 @@ install_config {
<provides> <service name="Timer"/> </provides> <provides> <service name="Timer"/> </provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -31,8 +31,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="2000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>
@ -91,7 +91,7 @@ install_config {
</start> </start>
<start name="gui_fader"> <start name="gui_fader">
<resource name="RAM" quantum="5M"/> <resource name="RAM" quantum="8M"/>
<provides><service name="Gui"/></provides> <provides><service name="Gui"/></provides>
<route> <route>
<service name="ROM" label="config"> <service name="ROM" label="config">
@ -103,7 +103,7 @@ install_config {
</start> </start>
<start name="scout"> <start name="scout">
<resource name="RAM" quantum="10M"/> <resource name="RAM" quantum="16M"/>
<route> <route>
<service name="Gui"> <child name="gui_fader" /> </service> <service name="Gui"> <child name="gui_fader" /> </service>
<any-service> <parent/> <any-child/> </any-service> <any-service> <parent/> <any-child/> </any-service>
@ -112,7 +112,7 @@ install_config {
<start name="scout2"> <start name="scout2">
<binary name="scout" /> <binary name="scout" />
<resource name="RAM" quantum="10M"/> <resource name="RAM" quantum="16M"/>
<route> <route>
<service name="Gui"> <child name="nitpicker" /> </service> <service name="Gui"> <child name="nitpicker" /> </service>
<any-service> <parent/> <any-child/> </any-service> <any-service> <parent/> <any-child/> </any-service>

View File

@ -65,8 +65,8 @@ install_config {
<provides> <service name="Timer"/> </provides> <provides> <service name="Timer"/> </provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -35,8 +35,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -26,8 +26,8 @@ append config {
</default-route> </default-route>
<default caps="100"/> <default caps="100"/>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -29,8 +29,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -35,8 +35,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -35,8 +35,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -31,8 +31,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -38,8 +38,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -22,7 +22,6 @@
#include <nitpicker_gfx/texture_painter.h> #include <nitpicker_gfx/texture_painter.h>
#include <base/attached_dataspace.h> #include <base/attached_dataspace.h>
#include <util/reconstructible.h> #include <util/reconstructible.h>
#include <os/texture_rgb565.h>
#include <os/texture_rgb888.h> #include <os/texture_rgb888.h>
/* gems includes */ /* gems includes */
@ -63,11 +62,6 @@ struct Backdrop::Main
/* setup virtual framebuffer mode */ /* setup virtual framebuffer mode */
gui.buffer(mode, false); gui.buffer(mode, false);
if (mode.format() != Framebuffer::Mode::RGB565) {
Genode::warning("Color mode %d not supported\n", (int)mode.format());
return Dataspace_capability();
}
return gui.framebuffer()->dataspace(); return gui.framebuffer()->dataspace();
} }
@ -92,10 +86,7 @@ struct Backdrop::Main
/** /**
* Return size of virtual framebuffer * Return size of virtual framebuffer
*/ */
Surface_base::Area size() const Surface_base::Area size() const { return mode.area; }
{
return Surface_base::Area(mode.width(), mode.height());
}
/** /**
* Return back buffer as painting surface * Return back buffer as painting surface
@ -251,13 +242,12 @@ void Backdrop::Main::_apply_image(Xml_node operation)
Png_image png_image(_env.ram(), _env.rm(), _heap, file.data<void>()); Png_image png_image(_env.ram(), _env.rm(), _heap, file.data<void>());
Area const scaled_size = calc_scaled_size(operation, png_image.size(), Area const scaled_size = calc_scaled_size(operation, png_image.size(),
Area(_buffer->mode.width(), _buffer->mode.area);
_buffer->mode.height()));
/* /*
* Determine parameters of graphics operation * Determine parameters of graphics operation
*/ */
int const h_gap = (int)_buffer->mode.width() - scaled_size.w(), int const h_gap = (int)_buffer->mode.area.w() - scaled_size.w(),
v_gap = (int)_buffer->mode.height() - scaled_size.h(); v_gap = (int)_buffer->mode.area.h() - scaled_size.h();
int const anchored_xpos = anchor.horizontal == Anchor::LOW ? 0 int const anchored_xpos = anchor.horizontal == Anchor::LOW ? 0
: anchor.horizontal == Anchor::CENTER ? h_gap/2 : anchor.horizontal == Anchor::CENTER ? h_gap/2
@ -291,7 +281,7 @@ void Backdrop::Main::_apply_image(Xml_node operation)
*/ */
/* create texture with down-sampled scaled image */ /* create texture with down-sampled scaled image */
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Chunky_texture<PT> texture(_env.ram(), _env.rm(), scaled_size); Chunky_texture<PT> texture(_env.ram(), _env.rm(), scaled_size);
convert_pixel_format(scaled_texture, texture, alpha, _heap); convert_pixel_format(scaled_texture, texture, alpha, _heap);
@ -309,7 +299,7 @@ void Backdrop::Main::_apply_fill(Xml_node operation)
*/ */
/* create texture with down-sampled scaled image */ /* create texture with down-sampled scaled image */
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Color const color = operation.attribute_value("color", Color(0, 0, 0)); Color const color = operation.attribute_value("color", Color(0, 0, 0));
@ -326,9 +316,8 @@ void Backdrop::Main::_handle_config()
Framebuffer::Mode const phys_mode = _gui.mode(); Framebuffer::Mode const phys_mode = _gui.mode();
Framebuffer::Mode const Framebuffer::Mode const
mode(_config.xml().attribute_value("width", (unsigned)phys_mode.width()), mode { .area = { _config.xml().attribute_value("width", phys_mode.area.w()),
_config.xml().attribute_value("height", (unsigned)phys_mode.height()), _config.xml().attribute_value("height", phys_mode.area.h()) } };
phys_mode.format());
_buffer.construct(_env, _gui, mode); _buffer.construct(_env, _gui, mode);

View File

@ -16,7 +16,7 @@
#include <base/heap.h> #include <base/heap.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <polygon_gfx/shaded_polygon_painter.h> #include <polygon_gfx/shaded_polygon_painter.h>
#include <polygon_gfx/interpolate_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <nano3d/scene.h> #include <nano3d/scene.h>
#include <nano3d/sincos_frac16.h> #include <nano3d/sincos_frac16.h>
@ -469,7 +469,7 @@ void Component::construct(Genode::Env &env)
{ {
enum { UPDATE_RATE_MS = 250 }; enum { UPDATE_RATE_MS = 250 };
static Cpu_load_display::Scene<Genode::Pixel_rgb565> static Cpu_load_display::Scene<Genode::Pixel_rgb888>
scene(env, UPDATE_RATE_MS, scene(env, UPDATE_RATE_MS,
Gui::Point(0, 0), Gui::Area(400, 400)); Gui::Point(0, 0), Gui::Area(400, 400));
} }

View File

@ -17,7 +17,7 @@
#include <base/heap.h> #include <base/heap.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/reporter.h> #include <os/reporter.h>
/* decorator includes */ /* decorator includes */
@ -45,16 +45,14 @@ struct Decorator::Main : Window_factory_base
{ {
Framebuffer::Mode const mode; Framebuffer::Mode const mode;
Attached_dataspace fb_ds; Attached_dataspace fb_ds;
Decorator::Canvas<Pixel_rgb565> canvas; Decorator::Canvas<Pixel_rgb888> canvas;
Canvas(Env &env, Gui::Connection &nitpicker) Canvas(Env &env, Gui::Connection &nitpicker)
: :
mode(nitpicker.mode()), mode(nitpicker.mode()),
fb_ds(env.rm(), fb_ds(env.rm(),
(nitpicker.buffer(mode, false), nitpicker.framebuffer()->dataspace())), (nitpicker.buffer(mode, false), nitpicker.framebuffer()->dataspace())),
canvas(fb_ds.local_addr<Pixel_rgb565>(), canvas(fb_ds.local_addr<Pixel_rgb888>(), mode.area, env.ram(), env.rm())
Area(mode.width(), mode.height()),
env.ram(), env.rm())
{ } { }
}; };
@ -66,9 +64,7 @@ struct Decorator::Main : Window_factory_base
{ {
_canvas.construct(_env, _nitpicker); _canvas.construct(_env, _nitpicker);
_window_stack.mark_as_dirty(Rect(Point(0, 0), _window_stack.mark_as_dirty(Rect(Point(0, 0), _canvas->mode.area));
Area(_canvas->mode.width(),
_canvas->mode.height())));
Dirty_rect dirty = _window_stack.draw(_canvas->canvas); Dirty_rect dirty = _window_stack.draw(_canvas->canvas);

View File

@ -14,8 +14,8 @@
/* Genode includes */ /* Genode includes */
#include <gems/chunky_texture.h> #include <gems/chunky_texture.h>
#include <base/env.h> #include <base/env.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/texture_rgb565.h> #include <os/texture_rgb888.h>
/* local includes */ /* local includes */
#include "canvas.h" #include "canvas.h"
@ -62,7 +62,7 @@ extern unsigned char _binary_windowed_rgba_start[];
Texture_base const & Texture_base const &
Decorator::texture_by_id(Texture_id id, Ram_allocator &ram, Region_map &rm) Decorator::texture_by_id(Texture_id id, Ram_allocator &ram, Region_map &rm)
{ {
static Icon_texture<Pixel_rgb565> const icons[4] { static Icon_texture<Pixel_rgb888> const icons[4] {
{ ram, rm, _binary_closer_rgba_start }, { ram, rm, _binary_closer_rgba_start },
{ ram, rm, _binary_minimize_rgba_start }, { ram, rm, _binary_minimize_rgba_start },
{ ram, rm, _binary_maximize_rgba_start }, { ram, rm, _binary_maximize_rgba_start },

View File

@ -22,7 +22,6 @@
#include <nitpicker_gfx/texture_painter.h> #include <nitpicker_gfx/texture_painter.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <base/heap.h> #include <base/heap.h>
#include <os/pixel_rgb565.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <os/texture_rgb888.h> #include <os/texture_rgb888.h>
#include <util/reconstructible.h> #include <util/reconstructible.h>

View File

@ -16,8 +16,8 @@
#include <base/component.h> #include <base/component.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <polygon_gfx/shaded_polygon_painter.h> #include <polygon_gfx/shaded_polygon_painter.h>
#include <polygon_gfx/interpolate_rgb565.h>
#include <polygon_gfx/textured_polygon_painter.h> #include <polygon_gfx/textured_polygon_painter.h>
#include <os/pixel_rgb888.h>
#include <nano3d/dodecahedron_shape.h> #include <nano3d/dodecahedron_shape.h>
#include <nano3d/cube_shape.h> #include <nano3d/cube_shape.h>
#include <nano3d/scene.h> #include <nano3d/scene.h>
@ -229,7 +229,7 @@ void Component::construct(Genode::Env &env)
{ {
enum { UPDATE_RATE_MS = 20 }; enum { UPDATE_RATE_MS = 20 };
static Scene<Genode::Pixel_rgb565> static Scene<Genode::Pixel_rgb888>
scene(env, UPDATE_RATE_MS, scene(env, UPDATE_RATE_MS,
Gui::Point(-200, -200), Gui::Area(400, 400)); Gui::Point(-200, -200), Gui::Area(400, 400));
} }

View File

@ -1162,11 +1162,11 @@ void Sculpt::Main::_handle_window_layout()
Framebuffer::Mode const mode = _gui->mode(); Framebuffer::Mode const mode = _gui->mode();
/* area reserved for the panel */ /* area reserved for the panel */
Rect const panel(Point(0, 0), Area(mode.width(), panel_height)); Rect const panel(Point(0, 0), Area(mode.area.w(), panel_height));
/* available space on the right of the menu */ /* available space on the right of the menu */
Rect avail(Point(0, panel.h()), Rect avail(Point(0, panel.h()),
Point(mode.width() - 1, mode.height() - 1)); Point(mode.area.w() - 1, mode.area.h() - 1));
Point const log_offset = _log_visible Point const log_offset = _log_visible
? Point(0, 0) ? Point(0, 0)
@ -1174,8 +1174,8 @@ void Sculpt::Main::_handle_window_layout()
Point const log_p1(avail.x2() - log_min_w - margins.right + 1 + log_offset.x(), Point const log_p1(avail.x2() - log_min_w - margins.right + 1 + log_offset.x(),
avail.y1() + margins.top); avail.y1() + margins.top);
Point const log_p2(mode.width() - margins.right - 1 + log_offset.x(), Point const log_p2(mode.area.w() - margins.right - 1 + log_offset.x(),
mode.height() - margins.bottom - 1); mode.area.h() - margins.bottom - 1);
/* position of the inspect window */ /* position of the inspect window */
Point const inspect_p1(avail.x1() + margins.left, avail.y1() + margins.top); Point const inspect_p1(avail.x1() + margins.left, avail.y1() + margins.top);
@ -1225,7 +1225,7 @@ void Sculpt::Main::_handle_window_layout()
Area const size = win_size(win); Area const size = win_size(win);
Point const pos = _network_visible Point const pos = _network_visible
? Point(log_p1.x() - size.w(), avail.y1()) ? Point(log_p1.x() - size.w(), avail.y1())
: Point(mode.width(), avail.y1()); : Point(mode.area.w(), avail.y1());
gen_window(win, Rect(pos, size)); gen_window(win, Rect(pos, size));
}); });
@ -1301,7 +1301,7 @@ void Sculpt::Main::_handle_window_layout()
_with_window(window_list, logo_label, [&] (Xml_node win) { _with_window(window_list, logo_label, [&] (Xml_node win) {
Area const size = win_size(win); Area const size = win_size(win);
Point const pos(mode.width() - size.w(), mode.height() - size.h()); Point const pos(mode.area.w() - size.w(), mode.area.h() - size.h());
gen_window(win, Rect(pos, size)); gen_window(win, Rect(pos, size));
}); });
}); });
@ -1334,12 +1334,12 @@ void Sculpt::Main::_handle_gui_mode()
if (!_fonts_config.try_generate_manually_managed()) { if (!_fonts_config.try_generate_manually_managed()) {
_font_size_px = (float)mode.height() / 60.0; _font_size_px = (float)mode.area.h() / 60.0;
if (_font_size == Font_size::SMALL) _font_size_px *= 0.85; if (_font_size == Font_size::SMALL) _font_size_px *= 0.85;
if (_font_size == Font_size::LARGE) _font_size_px *= 1.35; if (_font_size == Font_size::LARGE) _font_size_px *= 1.35;
Area const size(mode.width(), mode.height()); Area const size(mode.area.w(), mode.area.h());
_screen_size = size; _screen_size = size;
_panel_menu_view.min_width = size.w(); _panel_menu_view.min_width = size.w();
unsigned const menu_width = max(_font_size_px*21, 320.0); unsigned const menu_width = max(_font_size_px*21, 320.0);

View File

@ -16,7 +16,6 @@
/* Genode includes */ /* Genode includes */
#include <os/texture.h> #include <os/texture.h>
#include <os/pixel_rgb565.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <os/pixel_rgb888.h> #include <os/pixel_rgb888.h>
@ -25,7 +24,6 @@ namespace Decorator {
class Theme; class Theme;
typedef Genode::Pixel_rgb888 Pixel_rgb888; typedef Genode::Pixel_rgb888 Pixel_rgb888;
typedef Genode::Pixel_rgb565 Pixel_rgb565;
typedef Genode::Pixel_alpha8 Pixel_alpha8; typedef Genode::Pixel_alpha8 Pixel_alpha8;
typedef Genode::Surface<Pixel_rgb888> Pixel_surface; typedef Genode::Surface<Pixel_rgb888> Pixel_surface;

View File

@ -324,9 +324,8 @@ class Decorator::Window : public Window_base, public Animator::Item
|| size_top_bottom.h() > _size_top_bottom.h() || size_top_bottom.h() > _size_top_bottom.h()
|| !_buffer_top_bottom.constructed()) { || !_buffer_top_bottom.constructed()) {
_gui_top_bottom.buffer(Framebuffer::Mode(size_top_bottom.w(), _gui_top_bottom.buffer(Framebuffer::Mode { .area = { size_top_bottom.w(),
size_top_bottom.h(), size_top_bottom.h() } },
Framebuffer::Mode::RGB565),
use_alpha); use_alpha);
_buffer_top_bottom.construct(_gui_top_bottom, size_top_bottom, _buffer_top_bottom.construct(_gui_top_bottom, size_top_bottom,
@ -341,9 +340,8 @@ class Decorator::Window : public Window_base, public Animator::Item
|| size_left_right.h() > _size_left_right.h() || size_left_right.h() > _size_left_right.h()
|| !_buffer_left_right.constructed()) { || !_buffer_left_right.constructed()) {
_gui_left_right.buffer(Framebuffer::Mode(size_left_right.w(), _gui_left_right.buffer(Framebuffer::Mode { .area = { size_left_right.w(),
size_left_right.h(), size_left_right.h() } },
Framebuffer::Mode::RGB565),
use_alpha); use_alpha);
_buffer_left_right.construct(_gui_left_right, size_left_right, _buffer_left_right.construct(_gui_left_right, size_left_right,

View File

@ -329,7 +329,7 @@ struct Window_layouter::Main : Operations,
/* determine maximized window geometry */ /* determine maximized window geometry */
Framebuffer::Mode const mode = _gui.mode(); Framebuffer::Mode const mode = _gui.mode();
_screen_size = Area(mode.width(), mode.height()); _screen_size = mode.area;
_update_window_layout(); _update_window_layout();
} }

View File

@ -18,7 +18,7 @@
#include <base/attached_ram_dataspace.h> #include <base/attached_ram_dataspace.h>
#include <os/texture.h> #include <os/texture.h>
#include <os/surface.h> #include <os/surface.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <os/static_root.h> #include <os/static_root.h>
#include <util/reconstructible.h> #include <util/reconstructible.h>
@ -50,7 +50,7 @@ namespace Gui_fader {
using Genode::Reconstructible; using Genode::Reconstructible;
using Genode::Constructible; using Genode::Constructible;
typedef Genode::Pixel_rgb565 Pixel_rgb565; typedef Genode::Pixel_rgb888 Pixel_rgb888;
typedef Genode::Pixel_alpha8 Pixel_alpha8; typedef Genode::Pixel_alpha8 Pixel_alpha8;
} }
@ -62,7 +62,7 @@ class Gui_fader::Src_buffer
{ {
private: private:
typedef Pixel_rgb565 Pixel; typedef Pixel_rgb888 Pixel;
bool const _use_alpha; bool const _use_alpha;
Attached_ram_dataspace _ds; Attached_ram_dataspace _ds;
@ -103,11 +103,11 @@ class Gui_fader::Dst_buffer
Genode::Attached_dataspace _ds; Genode::Attached_dataspace _ds;
Area _size; Area _size;
Surface<Pixel_rgb565> _pixel_surface { _ds.local_addr<Pixel_rgb565>(), _size }; Surface<Pixel_rgb888> _pixel_surface { _ds.local_addr<Pixel_rgb888>(), _size };
Surface<Pixel_alpha8> _alpha_surface Surface<Pixel_alpha8> _alpha_surface
{ {
_ds.local_addr<Pixel_alpha8>() + _size.count()*sizeof(Pixel_rgb565), _ds.local_addr<Pixel_alpha8>() + _size.count()*sizeof(Pixel_rgb888),
_size _size
}; };
@ -119,12 +119,12 @@ class Gui_fader::Dst_buffer
{ {
/* initialize input-mask buffer */ /* initialize input-mask buffer */
unsigned char *input_mask_buffer = _ds.local_addr<unsigned char>() unsigned char *input_mask_buffer = _ds.local_addr<unsigned char>()
+ _size.count()*(1 + sizeof(Pixel_rgb565)); + _size.count()*(1 + sizeof(Pixel_rgb888));
Genode::memset(input_mask_buffer, 0xff, _size.count()); Genode::memset(input_mask_buffer, 0xff, _size.count());
} }
Surface<Pixel_rgb565> &pixel_surface() { return _pixel_surface; } Surface<Pixel_rgb888> &pixel_surface() { return _pixel_surface; }
Surface<Pixel_alpha8> &alpha_surface() { return _alpha_surface; } Surface<Pixel_alpha8> &alpha_surface() { return _alpha_surface; }
}; };
@ -415,7 +415,7 @@ class Gui_fader::Gui_session_component
void buffer(Framebuffer::Mode mode, bool use_alpha) override void buffer(Framebuffer::Mode mode, bool use_alpha) override
{ {
Area const size(mode.width(), mode.height()); Area const size = mode.area;
_src_buffer.construct(_env, size, use_alpha); _src_buffer.construct(_env, size, use_alpha);

View File

@ -28,7 +28,7 @@ class Terminal::Framebuffer
Env &_env; Env &_env;
::Framebuffer::Connection _fb { _env, ::Framebuffer::Mode() }; ::Framebuffer::Connection _fb { _env, ::Framebuffer::Mode { } };
Constructible<Attached_dataspace> _ds { }; Constructible<Attached_dataspace> _ds { };
@ -47,8 +47,8 @@ class Terminal::Framebuffer
_fb.mode_sigh(mode_sigh); _fb.mode_sigh(mode_sigh);
} }
unsigned w() const { return _mode.width(); } unsigned w() const { return _mode.area.w(); }
unsigned h() const { return _mode.height(); } unsigned h() const { return _mode.area.h(); }
template <typename PT> template <typename PT>
PT *pixel() { return _ds->local_addr<PT>(); } PT *pixel() { return _ds->local_addr<PT>(); }
@ -64,10 +64,7 @@ class Terminal::Framebuffer
*/ */
bool mode_changed() const bool mode_changed() const
{ {
::Framebuffer::Mode _new_mode = _fb.mode(); return _fb.mode().area != _mode.area;
return _new_mode.width() != _mode.width()
|| _new_mode.height() != _mode.height();
} }
void switch_to_new_mode() void switch_to_new_mode()
@ -83,7 +80,7 @@ class Terminal::Framebuffer
* the old (possibly too small) dataspace. * the old (possibly too small) dataspace.
*/ */
_mode = _fb.mode(); _mode = _fb.mode();
if (_mode.width() && _mode.height()) if (_mode.area.count() > 0)
_ds.construct(_env.rm(), _fb.dataspace()); _ds.construct(_env.rm(), _fb.dataspace());
} }
}; };

View File

@ -96,7 +96,7 @@ struct Terminal::Main : Character_consumer
struct Paste_buffer { char buffer[READ_BUFFER_SIZE]; } _paste_buffer { }; struct Paste_buffer { char buffer[READ_BUFFER_SIZE]; } _paste_buffer { };
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Constructible<Text_screen_surface<PT>> _text_screen_surface { }; Constructible<Text_screen_surface<PT>> _text_screen_surface { };

View File

@ -16,7 +16,7 @@
#define _TEXT_SCREEN_SURFACE_H_ #define _TEXT_SCREEN_SURFACE_H_
/* Genode includes */ /* Genode includes */
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
/* terminal includes */ /* terminal includes */
#include <terminal/char_cell_array_character_screen.h> #include <terminal/char_cell_array_character_screen.h>

View File

@ -980,9 +980,7 @@ class Wm::Gui::Session_component : public Rpc_object<Gui::Session>,
* mode * mode
*/ */
if (_resize_requested) if (_resize_requested)
return Framebuffer::Mode(_requested_size.w(), return Framebuffer::Mode { .area = _requested_size };
_requested_size.h(),
real_mode.format());
/* /*
* If the first top-level view has a defined size, use it * If the first top-level view has a defined size, use it
@ -990,9 +988,7 @@ class Wm::Gui::Session_component : public Rpc_object<Gui::Session>,
*/ */
if (Top_level_view const *v = _top_level_views.first()) if (Top_level_view const *v = _top_level_views.first())
if (v->size().valid()) if (v->size().valid())
return Framebuffer::Mode(v->size().w(), return Framebuffer::Mode { .area = v->size() };
v->size().h(),
real_mode.format());
/* /*
* If top-level view has yet been defined, return the real mode. * If top-level view has yet been defined, return the real mode.

View File

@ -123,7 +123,7 @@ struct Test::Main
{ {
if (_config.xml().has_sub_node("check_framebuffer")) { if (_config.xml().has_sub_node("check_framebuffer")) {
log("connect to framebuffer driver"); log("connect to framebuffer driver");
Framebuffer::Mode mode(640, 480, Framebuffer::Mode::RGB565); Framebuffer::Mode mode { .area = { 640, 480 } };
Framebuffer::Connection fb(_env, mode); Framebuffer::Connection fb(_env, mode);
} }

View File

@ -17,7 +17,7 @@
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <base/log.h> #include <base/log.h>
#include <base/heap.h> #include <base/heap.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <os/surface.h> #include <os/surface.h>
#include <nitpicker_gfx/tff_font.h> #include <nitpicker_gfx/tff_font.h>
#include <nitpicker_gfx/box_painter.h> #include <nitpicker_gfx/box_painter.h>
@ -51,14 +51,13 @@ struct Test::Main
{ {
Env &_env; Env &_env;
Framebuffer::Connection _fb { _env, Framebuffer::Mode() }; Framebuffer::Connection _fb { _env, Framebuffer::Mode { } };
Attached_dataspace _fb_ds { _env.rm(), _fb.dataspace() }; Attached_dataspace _fb_ds { _env.rm(), _fb.dataspace() };
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Surface_base::Area const _size { (unsigned)_fb.mode().width(), Surface_base::Area const _size = _fb.mode().area;
(unsigned)_fb.mode().height() };
Surface<PT> _surface { _fb_ds.local_addr<PT>(), _size }; Surface<PT> _surface { _fb_ds.local_addr<PT>(), _size };

View File

@ -48,8 +48,8 @@ set config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -34,8 +34,8 @@ set config {
<resource name="RAM" quantum="1M"/> <resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -224,7 +224,7 @@ proc qt5_start_nodes { feature_arg } {
<start name="decorator" caps="300"> <start name="decorator" caps="300">
<binary name="} [qt5_decorator_binary] {"/> <binary name="} [qt5_decorator_binary] {"/>
<resource name="RAM" quantum="16M"/>} [qt5_decorator_config] { <resource name="RAM" quantum="32M"/>} [qt5_decorator_config] {
<route> <route>
<service name="ROM" label="window_layout"> <child name="wm_report_rom"/> </service> <service name="ROM" label="window_layout"> <child name="wm_report_rom"/> </service>
<service name="ROM" label="pointer"> <child name="wm_report_rom"/> </service> <service name="ROM" label="pointer"> <child name="wm_report_rom"/> </service>

View File

@ -178,7 +178,7 @@ proc drivers_start_nodes { feature_arg } {
append_if [use_fb_drv feature] start_nodes { append_if [use_fb_drv feature] start_nodes {
<start name="fb_drv"> <start name="fb_drv">
<binary name="} [fb_drv_binary] {"/> <binary name="} [fb_drv_binary] {"/>
<resource name="RAM" quantum="4M"/> <resource name="RAM" quantum="18M"/>
<provides><service name="Framebuffer"/></provides> <provides><service name="Framebuffer"/></provides>
</start> </start>
} }

View File

@ -23,6 +23,7 @@
#include <input/event.h> #include <input/event.h>
#include <input/keycodes.h> #include <input/keycodes.h>
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <os/pixel_rgb888.h>
/* MuPDF includes */ /* MuPDF includes */
extern "C" { extern "C" {
@ -37,71 +38,19 @@ extern "C" {
#include <unistd.h> #include <unistd.h>
/*************** typedef Genode::Pixel_rgb888 pixel_t;
** Dithering **
***************/
/*
* XXX blatantly copied from 'demo/src/app/backdrop/main.cc'
*
* We should factor-out the dithering support into a separate header file.
* But where is a good place to put it?
*/
enum { DITHER_SIZE = 16, DITHER_MASK = DITHER_SIZE - 1 };
static const int dither_matrix[DITHER_SIZE][DITHER_SIZE] = {
{ 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 },
{ 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 },
{ 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 },
{ 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 },
{ 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 },
{ 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 },
{ 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 },
{ 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 },
{ 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 },
{ 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 },
{ 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 },
{ 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 },
{ 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 },
{ 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 },
{ 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 },
{ 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 }
};
static inline uint16_t rgb565(int r, int g, int b) static void copy_line_rgba(const unsigned char *rgba_src,
pixel_t *dst, int num_pixels)
{ {
enum {
R_MASK = 0xf800, R_LSHIFT = 8,
G_MASK = 0x07e0, G_LSHIFT = 3,
B_MASK = 0x001f, B_RSHIFT = 3
};
return ((r << R_LSHIFT) & R_MASK)
| ((g << G_LSHIFT) & G_MASK)
| ((b >> B_RSHIFT) & B_MASK);
}
static void convert_line_rgba_to_rgb565(const unsigned char *rgba_src,
uint16_t *dst, int num_pixels, int line)
{
using namespace Genode;
enum { CHANNEL_MAX = 255 };
int const *dm = dither_matrix[line & DITHER_MASK];
for (int i = 0; i < num_pixels; i++) { for (int i = 0; i < num_pixels; i++) {
int v = dm[i & DITHER_MASK] >> 5; unsigned const r = *rgba_src++;
unsigned const g = *rgba_src++;
unsigned const b = *rgba_src++;
rgba_src++; /* ignore alpha */
*dst++ = rgb565(min(v + (int)rgba_src[0], (int)CHANNEL_MAX), *dst++ = pixel_t(r, g, b);
min(v + (int)rgba_src[1], (int)CHANNEL_MAX),
min(v + (int)rgba_src[2], (int)CHANNEL_MAX));
/* we ignore the alpha channel */
rgba_src += 4; /* next pixel */
} }
} }
@ -130,7 +79,6 @@ class Pdf_view
class Non_supported_framebuffer_mode { }; class Non_supported_framebuffer_mode { };
class Unexpected_document_color_depth { }; class Unexpected_document_color_depth { };
typedef uint16_t pixel_t;
typedef Framebuffer::Mode Mode; typedef Framebuffer::Mode Mode;
private: private:
@ -167,19 +115,19 @@ class Pdf_view
_nit_mode = _gui.mode(); _nit_mode = _gui.mode();
int max_x = Genode::max(_nit_mode.width(), _fb_mode.width()); unsigned max_x = Genode::max(_nit_mode.area.w(), _fb_mode.area.w());
int max_y = Genode::max(_nit_mode.height(), _fb_mode.height()); unsigned max_y = Genode::max(_nit_mode.area.h(), _fb_mode.area.h());
if (max_x > _fb_mode.width() || max_y > _fb_mode.height()) { if (max_x > _fb_mode.area.w() || max_y > _fb_mode.area.h()) {
_fb_mode = Mode(max_x, max_y, _nit_mode.format()); _fb_mode = Mode { .area = { max_x, max_y } };
_gui.buffer(_fb_mode, NO_ALPHA); _gui.buffer(_fb_mode, NO_ALPHA);
if (_fb_ds.constructed()) if (_fb_ds.constructed())
_fb_ds.destruct(); _fb_ds.destruct();
_fb_ds.construct(_env.rm(), _framebuffer.dataspace()); _fb_ds.construct(_env.rm(), _framebuffer.dataspace());
} }
_pdfapp.scrw = _nit_mode.width(); _pdfapp.scrw = _nit_mode.area.w();
_pdfapp.scrh = _nit_mode.height(); _pdfapp.scrh = _nit_mode.area.h();
/* /*
* XXX replace heuristics with a meaningful computation * XXX replace heuristics with a meaningful computation
@ -187,12 +135,11 @@ class Pdf_view
* The magic values are hand-tweaked manually to accommodating the * The magic values are hand-tweaked manually to accommodating the
* use case of showing slides. * use case of showing slides.
*/ */
_pdfapp.resolution = Genode::min(_nit_mode.width()/5, _pdfapp.resolution = Genode::min(_nit_mode.area.w()/5,
_nit_mode.height()/3.8); _nit_mode.area.h()/3.8);
typedef Gui::Session::Command Command; typedef Gui::Session::Command Command;
_gui.enqueue<Command::Geometry>( _gui.enqueue<Command::Geometry>(_view, Rect(Point(), _nit_mode.area));
_view, Rect(Point(), Area(_nit_mode.width(), _nit_mode.height())));
_gui.enqueue<Command::To_front>(_view, Gui::Session::View_handle()); _gui.enqueue<Command::To_front>(_view, Gui::Session::View_handle());
_gui.execute(); _gui.execute();
} }
@ -200,7 +147,7 @@ class Pdf_view
void _handle_nit_mode() void _handle_nit_mode()
{ {
_rebuffer(); _rebuffer();
pdfapp_onresize(&_pdfapp, _nit_mode.width(), _nit_mode.height()); pdfapp_onresize(&_pdfapp, _nit_mode.area.w(), _nit_mode.area.h());
} }
pdfapp_t _pdfapp { }; pdfapp_t _pdfapp { };
@ -268,7 +215,7 @@ class Pdf_view
void _refresh() void _refresh()
{ {
_framebuffer.refresh(0, 0, _nit_mode.width(), _nit_mode.height()); _framebuffer.refresh(0, 0, _nit_mode.area.w(), _nit_mode.area.h());
/* handle one sync signal only */ /* handle one sync signal only */
_framebuffer.sync_sigh(Genode::Signal_context_capability()); _framebuffer.sync_sigh(Genode::Signal_context_capability());
@ -335,12 +282,12 @@ class Pdf_view
void Pdf_view::show() void Pdf_view::show()
{ {
Genode::Area<> const fb_size(_fb_mode.width(), _fb_mode.height()); Framebuffer::Area const fb_size = _fb_mode.area;
int const x_max = Genode::min((int)fb_size.w(), _pdfapp.image->w); int const x_max = Genode::min((int)fb_size.w(), _pdfapp.image->w);
int const y_max = Genode::min((int)fb_size.h(), _pdfapp.image->h); int const y_max = Genode::min((int)fb_size.h(), _pdfapp.image->h);
/* clear framebuffer */ /* clear framebuffer */
memset(_fb_base(), 0, _fb_ds->size()); ::memset((void *)_fb_base(), 0, _fb_ds->size());
Genode::size_t src_line_bytes = _pdfapp.image->n * _pdfapp.image->w; Genode::size_t src_line_bytes = _pdfapp.image->n * _pdfapp.image->w;
unsigned char *src_line = _pdfapp.image->samples; unsigned char *src_line = _pdfapp.image->samples;
@ -354,15 +301,15 @@ void Pdf_view::show()
int const tweaked_y_max = y_max - 2; int const tweaked_y_max = y_max - 2;
/* center vertically if the dst buffer is higher than the image */ /* center vertically if the dst buffer is higher than the image */
if (_pdfapp.image->h < _nit_mode.height()) if ((unsigned)_pdfapp.image->h < _nit_mode.area.h())
dst_line += dst_line_width*((_nit_mode.height() - _pdfapp.image->h)/2); dst_line += dst_line_width*((_nit_mode.area.h() - _pdfapp.image->h)/2);
/* center horizontally if the dst buffer is wider than the image */ /* center horizontally if the dst buffer is wider than the image */
if (_pdfapp.image->w < _nit_mode.width()) if ((unsigned)_pdfapp.image->w < _nit_mode.area.w())
dst_line += (_nit_mode.width() - _pdfapp.image->w)/2; dst_line += (_nit_mode.area.w() - _pdfapp.image->w)/2;
for (int y = 0; y < tweaked_y_max; y++) { for (int y = 0; y < tweaked_y_max; y++) {
convert_line_rgba_to_rgb565(src_line, dst_line, x_max, y); copy_line_rgba(src_line, dst_line, x_max);
src_line += src_line_bytes; src_line += src_line_bytes;
dst_line += dst_line_width; dst_line += dst_line_width;
} }

View File

@ -35,35 +35,7 @@ be set to '"yes"' to prevent the driver from changing the mode. This way,
the driver will just query the current mode and make the already the driver will just query the current mode and make the already
initialized framebuffer available to its client. initialized framebuffer available to its client.
Options and usage from clients
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Example:
! #include <framebuffer_session/connection.h>
!
! ...
!
! /* create session to frame-buffer service */
! Framebuffer::Connection framebuffer(1024, 768, Framebuffer::Session::RGB565);
!
! /* retrieve frame buffer dataspace */
! Dataspace_capability fb_ds_cap = framebuffer.dataspace();
!
! /* map dataspace to local address space */
! void *local_addr = env()->rm_session()->attach(fb_ds_cap);
:Session-creation arguments:
:'fb_width': resolution width in pixel
:'fb_height': resolution height in pixel
:'fb_mode ': bits per pixel
:Supported modes: :Supported modes:
'640x480', '800x600', '1024x786', '1280x1024' at 15, 16, 24, 32 bits per pixel '640x480', '800x600', '1024x786', '1280x1024' at 32 bits per pixel.
Buffered output is only supported for modes using 16 bits per pixel.

View File

@ -71,7 +71,7 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
/* determine bytes per pixel */ /* determine bytes per pixel */
int bypp = 0; int bypp = 0;
if (_scr_depth == 16) bypp = 2; if (_scr_depth == 32) bypp = 4;
if (!bypp) return; if (!bypp) return;
/* copy pixels from back buffer to physical frame buffer */ /* copy pixels from back buffer to physical frame buffer */
@ -99,11 +99,6 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
{ {
if (!buffered) return; if (!buffered) return;
if (_scr_depth != 16) {
Genode::warning("buffered mode not supported for depth ", _scr_depth);
return;
}
size_t const bb_size = _scr_width*_scr_height*_scr_depth/8; size_t const bb_size = _scr_width*_scr_height*_scr_depth/8;
try { _bb.construct(env.ram(), env.rm(), bb_size); } try { _bb.construct(env.ram(), env.rm(), bb_size); }
catch (...) { catch (...) {
@ -140,8 +135,7 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Session>
Mode mode() const override Mode mode() const override
{ {
return Mode(_scr_width, _scr_height, return Mode { .area = { _scr_width, _scr_height } };
_scr_depth == 16 ? Mode::RGB565 : Mode::INVALID);
} }
void mode_sigh(Genode::Signal_context_capability) override { } void mode_sigh(Genode::Signal_context_capability) override { }
@ -191,9 +185,9 @@ class Framebuffer::Root : public Root_component
{ {
unsigned scr_width = _session_arg("width", args, "fb_width", 0); unsigned scr_width = _session_arg("width", args, "fb_width", 0);
unsigned scr_height = _session_arg("height", args, "fb_height", 0); unsigned scr_height = _session_arg("height", args, "fb_height", 0);
unsigned const scr_depth = _session_arg("depth", args, "fb_mode", 16); unsigned const scr_depth = 32;
bool const buffered = _config.xml().attribute_value("buffered", false); bool const buffered = _config.xml().attribute_value("buffered", true);
if (Framebuffer::set_mode(scr_width, scr_height, scr_depth) != 0) { if (Framebuffer::set_mode(scr_width, scr_height, scr_depth) != 0) {
Genode::warning("Could not set vesa mode ", Genode::warning("Could not set vesa mode ",
@ -233,6 +227,7 @@ struct Framebuffer::Main
Main(Genode::Env &env) : env(env) Main(Genode::Env &env) : env(env)
{ {
Genode::log("modified");
try { Framebuffer::init(env, heap); } catch (...) { try { Framebuffer::init(env, heap); } catch (...) {
Genode::error("H/W driver init failed"); Genode::error("H/W driver init failed");
throw; throw;

View File

@ -32,8 +32,8 @@
static int stride(int value) static int stride(int value)
{ {
/* RGB556 */ /* 32-bit RGB888 */
return value * 2; return value * 4;
} }
typedef void *(*mem_copy_fn)(void *dest, const void *src, size_t n); typedef void *(*mem_copy_fn)(void *dest, const void *src, size_t n);
@ -189,7 +189,7 @@ EGLBoolean
dri2_initialize_genode_backend(_EGLDriver *drv, _EGLDisplay *disp) dri2_initialize_genode_backend(_EGLDriver *drv, _EGLDisplay *disp)
{ {
struct dri2_egl_display *dri2_dpy; struct dri2_egl_display *dri2_dpy;
static unsigned rgb565_masks[4] = { 0xf800, 0x07e0, 0x001f, 0 }; static unsigned rgb888_masks[4] = { 0xff0000, 0xff00, 0xff, 0 };
int i; int i;
/* initialize DRM back end */ /* initialize DRM back end */
@ -227,21 +227,19 @@ dri2_initialize_genode_backend(_EGLDriver *drv, _EGLDisplay *disp)
if (!dri2_create_screen(disp)) if (!dri2_create_screen(disp))
goto close_screen; goto close_screen;
/* add RGB565 only */
EGLint attrs[] = { EGLint attrs[] = {
EGL_DEPTH_SIZE, 0, /* set in loop below (from DRI config) */ EGL_DEPTH_SIZE, 0, /* set in loop below (from DRI config) */
EGL_NATIVE_VISUAL_TYPE, 0, EGL_NATIVE_VISUAL_TYPE, 0,
EGL_NATIVE_VISUAL_ID, 0, EGL_NATIVE_VISUAL_ID, 0,
EGL_RED_SIZE, 5, EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 6, EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 5, EGL_BLUE_SIZE, 8,
EGL_NONE }; EGL_NONE };
for (i = 1; dri2_dpy->driver_configs[i]; i++) { for (i = 1; dri2_dpy->driver_configs[i]; i++) {
/* set depth size in attrs */ /* set depth size in attrs */
attrs[1] = dri2_dpy->driver_configs[i]->modes.depthBits; attrs[1] = dri2_dpy->driver_configs[i]->modes.depthBits;
dri2_add_config(disp, dri2_dpy->driver_configs[i], i, EGL_WINDOW_BIT, attrs, rgb565_masks); dri2_add_config(disp, dri2_dpy->driver_configs[i], i, EGL_WINDOW_BIT, attrs, rgb888_masks);
} }
return EGL_TRUE; return EGL_TRUE;

View File

@ -30,8 +30,8 @@
static int stride(int value) static int stride(int value)
{ {
/* RGB556 */ /* 32-bit RGB888 */
return value * 2; return value * 4;
} }
@ -152,7 +152,7 @@ static EGLBoolean
dri2_initialize_genode_swrast(_EGLDriver *drv, _EGLDisplay *disp) dri2_initialize_genode_swrast(_EGLDriver *drv, _EGLDisplay *disp)
{ {
struct dri2_egl_display *dri2_dpy; struct dri2_egl_display *dri2_dpy;
static unsigned rgb565_masks[4] = { 0xf800, 0x07e0, 0x001f, 0 }; static unsigned rgb888_masks[4] = { 0xff0000, 0xff00, 0xff, 0 };
int i; int i;
dri2_dpy = calloc(1, sizeof *dri2_dpy); dri2_dpy = calloc(1, sizeof *dri2_dpy);
@ -180,14 +180,13 @@ dri2_initialize_genode_swrast(_EGLDriver *drv, _EGLDisplay *disp)
if (!dri2_create_screen(disp)) if (!dri2_create_screen(disp))
goto close_screen; goto close_screen;
/* add RGB565 only */
EGLint attrs[] = { EGLint attrs[] = {
EGL_DEPTH_SIZE, 0, /* set in loop below (from DRI config) */ EGL_DEPTH_SIZE, 0, /* set in loop below (from DRI config) */
EGL_NATIVE_VISUAL_TYPE, 0, EGL_NATIVE_VISUAL_TYPE, 0,
EGL_NATIVE_VISUAL_ID, 0, EGL_NATIVE_VISUAL_ID, 0,
EGL_RED_SIZE, 5, EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 6, EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 5, EGL_BLUE_SIZE, 8,
EGL_NONE }; EGL_NONE };
for (i = 1; dri2_dpy->driver_configs[i]; i++) { for (i = 1; dri2_dpy->driver_configs[i]; i++) {
@ -195,7 +194,7 @@ dri2_initialize_genode_swrast(_EGLDriver *drv, _EGLDisplay *disp)
attrs[1] = dri2_dpy->driver_configs[i]->modes.depthBits; attrs[1] = dri2_dpy->driver_configs[i]->modes.depthBits;
dri2_add_config(disp, dri2_dpy->driver_configs[i], i, dri2_add_config(disp, dri2_dpy->driver_configs[i], i,
EGL_WINDOW_BIT | EGL_PBUFFER_BIT, attrs, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, attrs,
rgb565_masks); rgb888_masks);
} }
return EGL_TRUE; return EGL_TRUE;

View File

@ -381,20 +381,18 @@ void QGenodePlatformWindow::_handle_mode_changed()
{ {
Framebuffer::Mode mode(_gui_session.mode()); Framebuffer::Mode mode(_gui_session.mode());
if ((mode.width() == 0) && (mode.height() == 0)) { if ((mode.area.w() == 0) && (mode.area.h() == 0)) {
/* interpret a size of 0x0 as indication to close the window */ /* interpret a size of 0x0 as indication to close the window */
QWindowSystemInterface::handleCloseEvent(window(), 0); QWindowSystemInterface::handleCloseEvent(window(), 0);
/* don't actually set geometry to 0x0; either close or remain open */ /* don't actually set geometry to 0x0; either close or remain open */
return; return;
} }
if ((mode.width() != _current_mode.width()) || if (mode.area != _current_mode.area) {
(mode.height() != _current_mode.height()) ||
(mode.format() != _current_mode.format())) {
QRect geo(geometry()); QRect geo(geometry());
geo.setWidth(mode.width()); geo.setWidth (mode.area.w());
geo.setHeight(mode.height()); geo.setHeight(mode.area.h());
QWindowSystemInterface::handleGeometryChange(window(), geo); QWindowSystemInterface::handleGeometryChange(window(), geo);
@ -449,8 +447,8 @@ void QGenodePlatformWindow::_adjust_and_set_geometry(const QRect &rect)
QPlatformWindow::setGeometry(adjusted_rect); QPlatformWindow::setGeometry(adjusted_rect);
Framebuffer::Mode mode(adjusted_rect.width(), adjusted_rect.height(), Framebuffer::Mode const mode { .area = { (unsigned)adjusted_rect.width(),
Framebuffer::Mode::RGB565); (unsigned)adjusted_rect.height() } };
_gui_session.buffer(mode, false); _gui_session.buffer(mode, false);
_current_mode = mode; _current_mode = mode;

View File

@ -42,16 +42,13 @@ class QGenodeScreen : public QPlatformScreen
Framebuffer::Mode const scr_mode = _gui.mode(); Framebuffer::Mode const scr_mode = _gui.mode();
if (scr_mode.format() != Framebuffer::Mode::RGB565) _geometry.setRect(0, 0, scr_mode.area.w(),
qCritical() << "GUI screen format is not RGB565"; scr_mode.area.h());
_geometry.setRect(0, 0, scr_mode.width(),
scr_mode.height());
} }
QRect geometry() const { return _geometry; } QRect geometry() const { return _geometry; }
int depth() const { return 16; } int depth() const { return 32; }
QImage::Format format() const { return QImage::Format_RGB16; } QImage::Format format() const { return QImage::Format_ARGB32; }
QDpi logicalDpi() const { return QDpi(80, 80); }; QDpi logicalDpi() const { return QDpi(80, 80); };
QPlatformCursor *cursor() const QPlatformCursor *cursor() const

View File

@ -57,12 +57,14 @@ struct Window : Genode_egl_window
Window(Genode::Env &env, int w, int h) Window(Genode::Env &env, int w, int h)
: :
env(env), env(env),
mode_dispatcher(*signal_ep, *this, &Window::mode_handler) mode_dispatcher(*signal_ep, *this, &Window::mode_handler)
{ {
width = w; width = w;
height = h; height = h;
framebuffer.construct(env, Framebuffer::Mode(width, height, Framebuffer::Mode::RGB565)); Framebuffer::Mode const mode { .area = { (unsigned)width, (unsigned)height } };
framebuffer.construct(env, mode);
addr = env.rm().attach(framebuffer->dataspace()); addr = env.rm().attach(framebuffer->dataspace());
framebuffer->mode_sigh(mode_dispatcher); framebuffer->mode_sigh(mode_dispatcher);
@ -87,10 +89,10 @@ struct Window : Genode_egl_window
eglut_window *win = _eglut->current; eglut_window *win = _eglut->current;
if (win) { if (win) {
win->native.width = mode.width(); win->native.width = mode.area.w();
win->native.height = mode.height(); win->native.height = mode.area.h();
width = mode.width(); width = mode.area.w();
height = mode.height(); height = mode.area.h();
if (win->reshape_cb) if (win->reshape_cb)
win->reshape_cb(win->native.width, win->native.height); win->reshape_cb(win->native.width, win->native.height);

View File

@ -33,9 +33,7 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
/** /**
* Create session and return typed session capability * Create session and return typed session capability
*/ */
Session_capability _connect(Genode::Parent &parent, Session_capability _connect(Genode::Parent &parent, Area area)
unsigned width, unsigned height,
Mode::Format format)
{ {
using namespace Genode; using namespace Genode;
@ -48,12 +46,10 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
Arg_string::set_arg(argbuf, sizeof(argbuf), "cap_quota", CAP_QUOTA); Arg_string::set_arg(argbuf, sizeof(argbuf), "cap_quota", CAP_QUOTA);
/* set optional session-constructor arguments */ /* set optional session-constructor arguments */
if (width) if (area.w())
Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_width", width); Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_width", area.w());
if (height) if (area.h())
Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_height", height); Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_height", area.h());
if (format != Mode::INVALID)
Arg_string::set_arg(argbuf, sizeof(argbuf), "fb_format", format);
return session(parent, argbuf); return session(parent, argbuf);
} }
@ -72,8 +68,7 @@ class Framebuffer::Connection : public Genode::Connection<Session>,
Connection(Genode::Env &env, Framebuffer::Mode mode) Connection(Genode::Env &env, Framebuffer::Mode mode)
: :
Genode::Connection<Session>(env, _connect(env.parent(), Genode::Connection<Session>(env, _connect(env.parent(),
mode.width(), mode.height(), mode.area)),
mode.format())),
Session_client(cap()) Session_client(cap())
{ } { }
}; };

View File

@ -18,12 +18,15 @@
#include <base/signal.h> #include <base/signal.h>
#include <dataspace/capability.h> #include <dataspace/capability.h>
#include <session/session.h> #include <session/session.h>
#include <os/surface.h>
namespace Framebuffer { namespace Framebuffer {
struct Mode; struct Mode;
struct Session; struct Session;
struct Session_client; struct Session_client;
using Area = Genode::Surface_base::Area;
} }
@ -32,57 +35,11 @@ namespace Framebuffer {
*/ */
struct Framebuffer::Mode struct Framebuffer::Mode
{ {
public: Area area;
/** Genode::size_t bytes_per_pixel() const { return 4; }
* Pixel formats
*/
enum Format { INVALID, RGB565 };
static Genode::size_t bytes_per_pixel(Format format) void print(Genode::Output &out) const { Genode::print(out, area); }
{
if (format == RGB565) return 2;
return 0;
}
private:
int _width = 0, _height = 0;
Format _format = INVALID;
/*
* Helpers for sanitized access. The sanitizing is needed whenever
* a 'Mode' object is transferred via RPC from an untrusted client.
*/
static Format _sanitized(Format f) { return f == RGB565 ? RGB565 : INVALID; }
static int _sanitized(int v) { return v >= 0 ? v : 0; }
public:
Mode() { }
Mode(int width, int height, Format format)
: _width(width), _height(height), _format(format) { }
int width() const { return _sanitized(_width); }
int height() const { return _sanitized(_height); }
Format format() const { return _sanitized(_format); }
/**
* Return number of bytes per pixel
*/
Genode::size_t bytes_per_pixel() const {
return bytes_per_pixel(format()); }
void print(Genode::Output &out) const
{
Genode::print(out, width(), "x", height(), "@");
switch (format()) {
case RGB565: Genode::print(out, "RGB565"); break;
default: Genode::print(out, "INVALID"); break;
}
}
}; };

View File

@ -325,7 +325,7 @@ struct Gui::Session : Genode::Session
* If alpha blending is used, each pixel requires an additional byte * If alpha blending is used, each pixel requires an additional byte
* for the alpha value and a byte holding the input mask. * for the alpha value and a byte holding the input mask.
*/ */
return (mode.bytes_per_pixel() + 2*use_alpha)*mode.width()*mode.height(); return (mode.bytes_per_pixel() + 2*use_alpha)*mode.area.count();
} }

View File

@ -22,6 +22,15 @@ namespace Genode {
0xff0000, 16, 0xff00, 8, 0xff, 0, 0, 0> 0xff0000, 16, 0xff00, 8, 0xff, 0, 0, 0>
Pixel_rgb888; Pixel_rgb888;
template <>
inline Pixel_rgb888 Pixel_rgb888::avr(Pixel_rgb888 p1, Pixel_rgb888 p2)
{
Pixel_rgb888 res;
res.pixel = (((p1.pixel&0xfe00fe00)>>1) + ((p2.pixel&0xfe00fe00)>>1))
| (((p1.pixel&0x00fe00fe)>>1) + ((p2.pixel&0x00fe00fe)>>1));
return res;
}
template <> template <>
inline Pixel_rgb888 Pixel_rgb888::blend(Pixel_rgb888 src, int alpha) inline Pixel_rgb888 Pixel_rgb888::blend(Pixel_rgb888 src, int alpha)
{ {
@ -37,7 +46,7 @@ namespace Genode {
{ {
Pixel_rgb888 res; Pixel_rgb888 res;
res.pixel = blend(p1, 255 - alpha).pixel + blend(p2, alpha).pixel; res.pixel = blend(p1, 256 - alpha).pixel + blend(p2, alpha).pixel;
return res; return res;
} }
} }

View File

@ -14,7 +14,7 @@
<default-policy> <child name="input_filter"/> </default-policy> </service> <default-policy> <child name="input_filter"/> </default-policy> </service>
<start name="fb_sdl" caps="100" ld="no"> <start name="fb_sdl" caps="100" ld="no">
<resource name="RAM" quantum="4M"/> <resource name="RAM" quantum="10M"/>
<provides> <provides>
<service name="Input"/> <service name="Input"/>
<service name="Framebuffer"/> <service name="Framebuffer"/>

View File

@ -44,7 +44,7 @@
<start name="fb_drv" caps="120"> <start name="fb_drv" caps="120">
<binary name="vesa_fb_drv"/> <binary name="vesa_fb_drv"/>
<resource name="RAM" quantum="4M"/> <resource name="RAM" quantum="8M"/>
<provides><service name="Framebuffer"/></provides> <provides><service name="Framebuffer"/></provides>
<route> <route>
<service name="ROM" label="config"> <parent label="fb_drv.config"/> </service> <service name="ROM" label="config"> <parent label="fb_drv.config"/> </service>
@ -87,7 +87,7 @@
</route> </route>
</start> </start>
<start name="input_filter" caps="80"> <start name="input_filter" caps="90">
<resource name="RAM" quantum="1280K"/> <resource name="RAM" quantum="1280K"/>
<provides> <service name="Input"/> </provides> <provides> <service name="Input"/> </provides>
<route> <route>

View File

@ -77,7 +77,7 @@
<start name="fb_drv" caps="120"> <start name="fb_drv" caps="120">
<binary name="vesa_fb_drv"/> <binary name="vesa_fb_drv"/>
<resource name="RAM" quantum="4M"/> <resource name="RAM" quantum="8M"/>
<provides><service name="Framebuffer"/></provides> <provides><service name="Framebuffer"/></provides>
<route> <route>
<service name="ROM" label="config"> <parent label="fb_drv.config"/> </service> <service name="ROM" label="config"> <parent label="fb_drv.config"/> </service>

View File

@ -1,4 +1,5 @@
base base
os os
blit
framebuffer_session framebuffer_session
timer_session timer_session

View File

@ -42,7 +42,7 @@ install_config {
</start> </start>
<start name="drivers" caps="1500"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>
@ -147,7 +147,7 @@ install_config {
</route> </route>
</start> </start>
<start name="nitpicker" caps="110"> <start name="nitpicker" caps="120">
<resource name="RAM" quantum="1216K"/> <resource name="RAM" quantum="1216K"/>
<provides> <service name="Gui"/> </provides> <provides> <service name="Gui"/> </provides>
<route> <route>
@ -185,7 +185,7 @@ install_config {
</start> </start>
<start name="scout" caps="10000"> <start name="scout" caps="10000">
<resource name="RAM" quantum="64M" /> <resource name="RAM" quantum="80M" />
</start> </start>
</config>} </config>}
@ -199,11 +199,11 @@ puts $launchpad_config_fd {<config>
<launcher name="launchpad" ram_quota="6M" caps="1000"> <launcher name="launchpad" ram_quota="6M" caps="1000">
<configfile name="launchpad.config" /> <configfile name="launchpad.config" />
</launcher> </launcher>
<launcher name="nitlog" ram_quota="1M" caps="70"/> <launcher name="nitlog" ram_quota="1M" caps="100"/>
<launcher name="liquid_fb" ram_quota="7M" caps="70"> <launcher name="liquid_fb" ram_quota="9M" caps="100">
<config resize_handle="on" /> <config resize_handle="on" />
</launcher> </launcher>
<launcher name="nitpicker" ram_quota="1M" caps="70"> <launcher name="nitpicker" ram_quota="1M" caps="100">
<config> <config>
<domain name="" layer="3" conten="client" label="no" focus="click"/> <domain name="" layer="3" conten="client" label="no" focus="click"/>
<default-policy domain="" /> <default-policy domain="" />

View File

@ -40,7 +40,7 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="120M" constrain_phys="yes"/> <resource name="RAM" quantum="120M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>

View File

@ -27,8 +27,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -31,8 +31,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -18,8 +18,8 @@
#include <base/heap.h> #include <base/heap.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <os/pixel_alpha8.h> #include <os/pixel_alpha8.h>
#include <os/pixel_rgb565.h>
#include <os/pixel_rgb888.h> #include <os/pixel_rgb888.h>
#include <os/pixel_rgb565.h>
#include <os/surface.h> #include <os/surface.h>
#include <os/texture_rgb888.h> #include <os/texture_rgb888.h>
#include <gui_session/connection.h> #include <gui_session/connection.h>
@ -42,7 +42,7 @@ void convert_default_pointer_data_to_pixels(PT *pixel, Gui::Area size)
for (unsigned y = 0; y < size.h(); y++) { for (unsigned y = 0; y < size.h(); y++) {
for (unsigned x = 0; x < size.w(); x++) { for (unsigned x = 0; x < size.w(); x++) {
/* the source is known to be in RGB565 format */ /* the source is known to be in RGB888 format */
Genode::Pixel_rgb565 src = Genode::Pixel_rgb565 src =
*(Genode::Pixel_rgb565 *)(&big_mouse.pixels[y][x]); *(Genode::Pixel_rgb565 *)(&big_mouse.pixels[y][x]);
@ -139,9 +139,7 @@ void Pointer::Main::_resize_gui_buffer_if_needed(Gui::Area pointer_size)
if (pointer_size == _current_pointer_size) if (pointer_size == _current_pointer_size)
return; return;
Framebuffer::Mode const mode { (int)pointer_size.w(), Framebuffer::Mode const mode { .area = pointer_size };
(int)pointer_size.h(),
Framebuffer::Mode::RGB565 };
_gui.buffer(mode, true /* use alpha */); _gui.buffer(mode, true /* use alpha */);
@ -169,7 +167,7 @@ void Pointer::Main::_show_default_pointer()
Genode::Attached_dataspace ds { _env.rm(), _pointer_ds }; Genode::Attached_dataspace ds { _env.rm(), _pointer_ds };
convert_default_pointer_data_to_pixels(ds.local_addr<Genode::Pixel_rgb565>(), convert_default_pointer_data_to_pixels(ds.local_addr<Genode::Pixel_rgb888>(),
pointer_size); pointer_size);
_gui.framebuffer()->refresh(0, 0, pointer_size.w(), pointer_size.h()); _gui.framebuffer()->refresh(0, 0, pointer_size.w(), pointer_size.h());
@ -220,12 +218,12 @@ void Pointer::Main::_show_shape_pointer(Shape_report &shape_report)
Attached_dataspace ds { _env.rm(), _pointer_ds }; Attached_dataspace ds { _env.rm(), _pointer_ds };
Pixel_rgb565 *pixel = ds.local_addr<Pixel_rgb565>(); Pixel_rgb888 *pixel = ds.local_addr<Pixel_rgb888>();
Pixel_alpha8 *alpha = Pixel_alpha8 *alpha =
reinterpret_cast<Pixel_alpha8 *>(pixel + shape_size.count()); reinterpret_cast<Pixel_alpha8 *>(pixel + shape_size.count());
Surface<Pixel_rgb565> pixel_surface(pixel, shape_size); Surface<Pixel_rgb888> pixel_surface(pixel, shape_size);
Surface<Pixel_alpha8> alpha_surface(alpha, shape_size); Surface<Pixel_alpha8> alpha_surface(alpha, shape_size);
Dither_painter::paint(pixel_surface, texture); Dither_painter::paint(pixel_surface, texture);
@ -341,8 +339,7 @@ Pointer::Main::Main(Genode::Env &env) : _env(env)
* pointer size to let the user know right from the start if the * pointer size to let the user know right from the start if the
* RAM quota is too low. * RAM quota is too low.
*/ */
Framebuffer::Mode const mode { Pointer::MAX_WIDTH, Pointer::MAX_HEIGHT, Framebuffer::Mode const mode { .area = { Pointer::MAX_WIDTH, Pointer::MAX_HEIGHT } };
Framebuffer::Mode::RGB565 };
_gui.buffer(mode, true /* use alpha */); _gui.buffer(mode, true /* use alpha */);
@ -353,7 +350,7 @@ Pointer::Main::Main(Genode::Env &env) : _env(env)
_handle_hover(); _handle_hover();
} catch (Genode::Rom_connection::Rom_connection_failed) { } catch (Genode::Rom_connection::Rom_connection_failed) {
Genode::warning("Could not open ROM session for \"hover\".", Genode::warning("Could not open ROM session for \"hover\".",
" This ROM is used for custom pointer shape support."); " This ROM is used for custom pointer shape support.");
} }
try { try {
@ -362,7 +359,7 @@ Pointer::Main::Main(Genode::Env &env) : _env(env)
_handle_xray(); _handle_xray();
} catch (Genode::Rom_connection::Rom_connection_failed) { } catch (Genode::Rom_connection::Rom_connection_failed) {
Genode::warning("Could not open ROM session for \"xray\".", Genode::warning("Could not open ROM session for \"xray\".",
" This ROM is used for custom pointer shape support."); " This ROM is used for custom pointer shape support.");
} }
} }

View File

@ -16,7 +16,7 @@
#include <util/color.h> #include <util/color.h>
#include <base/component.h> #include <base/component.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <nitpicker_gfx/box_painter.h> #include <nitpicker_gfx/box_painter.h>
#include <nitpicker_gfx/tff_font.h> #include <nitpicker_gfx/tff_font.h>
@ -51,7 +51,7 @@ struct Status_bar::Buffer
* The status bar is as wide as nitpicker's screen and has a fixed * The status bar is as wide as nitpicker's screen and has a fixed
* height. * height.
*/ */
Framebuffer::Mode const _mode { _nit_mode.width(), HEIGHT, _nit_mode.format() }; Framebuffer::Mode const _mode { .area = { _nit_mode.area.w(), HEIGHT } };
Dataspace_capability _init_buffer() Dataspace_capability _init_buffer()
{ {
@ -120,14 +120,9 @@ void Status_bar::Buffer::draw(Domain_name const &domain_name,
Label const &label, Label const &label,
Color color) Color color)
{ {
if (_mode.format() != Framebuffer::Mode::RGB565) { typedef Pixel_rgb888 PT;
error("pixel format not supported");
return;
}
typedef Pixel_rgb565 PT; Area const area = _mode.area;
Area const area(_mode.width(), _mode.height());
Surface<PT> surface(_fb_ds.local_addr<PT>(), area); Surface<PT> surface(_fb_ds.local_addr<PT>(), area);
@ -248,8 +243,7 @@ void Status_bar::Main::_handle_mode()
_draw_status_bar(); _draw_status_bar();
Rect const geometry(Point(0, 0), Area(_buffer->mode().width(), Rect const geometry(Point(0, 0), _buffer->mode().area);
_buffer->mode().height()));
_gui.enqueue<Gui::Session::Command::Geometry>(_view, geometry); _gui.enqueue<Gui::Session::Command::Geometry>(_view, geometry);
_gui.execute(); _gui.execute();

View File

@ -13,6 +13,7 @@
#include <framebuffer.h> #include <framebuffer.h>
#include <base/component.h> #include <base/component.h>
#include <blit/blit.h>
using namespace Framebuffer; using namespace Framebuffer;
@ -50,7 +51,7 @@ Session_component::Session_component(Genode::Env &env,
_fb_mem.construct(_env, _core_fb.addr, _core_fb.pitch * _core_fb.height, _fb_mem.construct(_env, _core_fb.addr, _core_fb.pitch * _core_fb.height,
true); true);
_fb_mode = Mode(_core_fb.width, _core_fb.height, Mode::RGB565); _fb_mode = Mode { .area = { _core_fb.width, _core_fb.height } };
_fb_ram.construct(_env.ram(), _env.rm(), _core_fb.width * _core_fb.height * _fb_ram.construct(_env.ram(), _env.rm(), _core_fb.width * _core_fb.height *
_fb_mode.bytes_per_pixel()); _fb_mode.bytes_per_pixel());
@ -70,28 +71,24 @@ void Session_component::refresh(int const x, int const y, int const w, int const
{ {
using namespace Genode; using namespace Genode;
uint32_t const c_x = x < 0 ? 0U : x; int const width = _core_fb.width;
uint32_t const c_y = y < 0 ? 0U : y; int const height = _core_fb.height;
uint32_t const c_w = w < 0 ? 0U : w; unsigned const bpp = 4;
uint32_t const c_h = h < 0 ? 0U : h; unsigned const pitch = _core_fb.pitch;
uint32_t const u_x = min(_core_fb.width, max(c_x, 0U)); /* clip specified coordinates against screen boundaries */
uint32_t const u_y = min(_core_fb.height, max(c_y, 0U)); int const x2 = min(x + w - 1, width - 1),
uint32_t const u_w = min(_core_fb.width, max(c_w, 0U) + u_x); y2 = min(y + h - 1, height - 1);
uint32_t const u_h = min(_core_fb.height, max(c_h, 0U) + u_y); int const x1 = max(x, 0),
y1 = max(y, 0);
if (x1 > x2 || y1 > y2)
return;
Pixel_rgb888 * const pixel_32 = _fb_mem->local_addr<Pixel_rgb888>(); /* copy pixels from back buffer to physical frame buffer */
Pixel_rgb565 const * const pixel_16 = _fb_ram->local_addr<Pixel_rgb565>(); char const *src = _fb_ram->local_addr<char>() + bpp*width*y1 + bpp*x1;
char *dst = _fb_mem->local_addr<char>() + pitch*y1 + bpp*x1;
for (uint32_t r = u_y; r < u_h; ++r) { blit(src, bpp*width, dst, pitch, bpp*(x2 - x1 + 1), y2 - y1 + 1);
for (uint32_t c = u_x; c < u_w; ++c) {
uint32_t const s = c + r * _core_fb.width;
uint32_t const d = c + r * (_core_fb.pitch / (_core_fb.bpp / 8));
pixel_32[d].rgba(pixel_16[s].r(), pixel_16[s].g(),
pixel_16[s].b(), 0);
}
}
} }
Genode::Dataspace_capability Session_component::dataspace() Genode::Dataspace_capability Session_component::dataspace()

View File

@ -1,4 +1,4 @@
TARGET = fb_boot_drv TARGET = fb_boot_drv
LIBS = base LIBS = base blit
SRC_CC = main.cc framebuffer.cc SRC_CC = main.cc framebuffer.cc
INC_DIR += $(PRG_DIR)/include INC_DIR += $(PRG_DIR)/include

View File

@ -41,7 +41,7 @@ namespace Framebuffer
HSYNC_LEN = 64, HSYNC_LEN = 64,
VSYNC_LEN = 25, VSYNC_LEN = 25,
BYTES_PER_PIXEL = 2, BYTES_PER_PIXEL = 4,
FRAMEBUFFER_SIZE = SCR_WIDTH*SCR_HEIGHT*BYTES_PER_PIXEL, FRAMEBUFFER_SIZE = SCR_WIDTH*SCR_HEIGHT*BYTES_PER_PIXEL,
}; };
@ -65,13 +65,12 @@ class Framebuffer::Session_component :
/** /**
* Bit definitions of the lcd control register * Bit definitions of the lcd control register
*/ */
CTRL_ENABLED = 1 << 0, CTRL_ENABLED = 1 << 0,
CTRL_BPP16 = 4 << 1, CTRL_BPP_24 = 5 << 1,
CTRL_BPP16_565 = 6 << 1, CTRL_TFT = 1 << 5,
CTRL_TFT = 1 << 5, CTRL_BGR = 1 << 8,
CTRL_BGR = 1 << 8, CTRL_POWER = 1 << 11,
CTRL_POWER = 1 << 11, CTRL_VCOMP = 1 << 12,
CTRL_VCOMP = 1 << 12,
/** /**
* Bit definitions for CLCDC timing. * Bit definitions for CLCDC timing.
@ -151,7 +150,7 @@ class Framebuffer::Session_component :
_timer.msleep(100); _timer.msleep(100);
} }
ctrl = CTRL_BGR | CTRL_ENABLED | CTRL_TFT | CTRL_VCOMP | CTRL_BPP16_565; ctrl = CTRL_BGR | CTRL_ENABLED | CTRL_TFT | CTRL_VCOMP | CTRL_BPP_24;
/* init color-lcd oscillator */ /* init color-lcd oscillator */
sys_reg_write(SP810_REG_LOCK, 0xa05f); sys_reg_write(SP810_REG_LOCK, 0xa05f);
@ -177,7 +176,7 @@ class Framebuffer::Session_component :
Genode::Dataspace_capability dataspace() override { return _fb_ds_cap; } Genode::Dataspace_capability dataspace() override { return _fb_ds_cap; }
Mode mode() const override { return Mode(SCR_WIDTH, SCR_HEIGHT, Mode::RGB565); } Mode mode() const override { return Mode { .area { SCR_WIDTH, SCR_HEIGHT } }; }
void mode_sigh(Genode::Signal_context_capability) override { } void mode_sigh(Genode::Signal_context_capability) override { }

View File

@ -66,7 +66,7 @@ class Framebuffer::Driver
return true; return true;
} }
Mode mode() { return Mode(_width, _height, Mode::RGB565); } Mode mode() { return Mode { .area = { _width, _height } }; }
Ipu &ipu() { return _ipu; } Ipu &ipu() { return _ipu; }
}; };

View File

@ -225,24 +225,25 @@ class Ipu : Genode::Mmio
cpmem.sly = stride - 1; cpmem.sly = stride - 1;
cpmem.eba0 = phys_base >> 3; cpmem.eba0 = phys_base >> 3;
cpmem.eba1 = phys_base >> 3; cpmem.eba1 = phys_base >> 3;
cpmem.bpp = 3; /* corresponds to 16BPP */ cpmem.bpp = 0; /* corresponds to 32BPP */
cpmem.pfs = 7; /* corresponds to RGB */ cpmem.pfs = 7; /* corresponds to RGB */
cpmem.npb = 31; /* 32 pixel per burst access */ cpmem.npb = 15;
/* red */ /* red */
cpmem.wid0 = 4; cpmem.wid0 = 7;
cpmem.off0 = 0; cpmem.off0 = 8;
/* green */ /* green */
cpmem.wid1 = 5; cpmem.wid1 = 7;
cpmem.off1 = 5; cpmem.off1 = 16;
/* blue */ /* blue */
cpmem.wid2 = 4; cpmem.off2 = 11; cpmem.wid2 = 7;
cpmem.off2 = 24;
/* alpha */ /* alpha */
cpmem.wid3 = 7; cpmem.wid3 = 7;
cpmem.off3 = 16; cpmem.off3 = 0;
Genode::memcpy(dst, (void*)&cpmem, sizeof(Cp_mem)); Genode::memcpy(dst, (void*)&cpmem, sizeof(Cp_mem));
} }

View File

@ -57,8 +57,8 @@ class Framebuffer::Session_component :
void _refresh_buffered(int x, int y, int w, int h) void _refresh_buffered(int x, int y, int w, int h)
{ {
/* clip specified coordinates against screen boundaries */ /* clip specified coordinates against screen boundaries */
int x2 = min(x + w - 1, (int)_mode.width() - 1), int x2 = min(x + w - 1, (int)_mode.area.w() - 1),
y2 = min(y + h - 1, (int)_mode.height() - 1); y2 = min(y + h - 1, (int)_mode.area.h() - 1);
int x1 = max(x, 0), int x1 = max(x, 0),
y1 = max(y, 0); y1 = max(y, 0);
if (x1 > x2 || y1 > y2) return; if (x1 > x2 || y1 > y2) return;
@ -66,10 +66,10 @@ class Framebuffer::Session_component :
int bypp = _mode.bytes_per_pixel(); int bypp = _mode.bytes_per_pixel();
/* copy pixels from back buffer to physical frame buffer */ /* copy pixels from back buffer to physical frame buffer */
char *src = (char *)_bb_addr + bypp*(_mode.width()*y1 + x1), char *src = (char *)_bb_addr + bypp*(_mode.area.w()*y1 + x1),
*dst = (char *)_fb_addr + bypp*(_mode.width()*y1 + x1); *dst = (char *)_fb_addr + bypp*(_mode.area.h()*y1 + x1);
blit(src, bypp*_mode.width(), dst, bypp*_mode.width(), blit(src, bypp*_mode.area.w(), dst, bypp*_mode.area.w(),
bypp*(x2 - x1 + 1), y2 - y1 + 1); bypp*(x2 - x1 + 1), y2 - y1 + 1);
} }
@ -79,7 +79,7 @@ class Framebuffer::Session_component :
: _env(env), : _env(env),
_buffered(buffered), _buffered(buffered),
_mode(driver.mode()), _mode(driver.mode()),
_size(_mode.bytes_per_pixel() * _mode.width() * _mode.height()), _size(_mode.bytes_per_pixel()*_mode.area.count()),
_bb_ds(buffered ? _env.ram().alloc(_size) _bb_ds(buffered ? _env.ram().alloc(_size)
: Genode::Ram_dataspace_capability()), : Genode::Ram_dataspace_capability()),
_bb_addr(buffered ? (void*)_env.rm().attach(_bb_ds) : 0), _bb_addr(buffered ? (void*)_env.rm().attach(_bb_ds) : 0),

View File

@ -0,0 +1,2 @@
If you find the red and blue color channels swapped, you may need to specify
the option 'framebuffer_swap=1' in you Raspberry Pi's config.txt.

View File

@ -45,8 +45,8 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Framebuffer::Se
Mode _mode = mode(); Mode _mode = mode();
/* clip specified coordinates against screen boundaries */ /* clip specified coordinates against screen boundaries */
int x2 = min(x + w - 1, (int)_mode.width() - 1), int x2 = min(x + w - 1, (int)_mode.area.w() - 1),
y2 = min(y + h - 1, (int)_mode.height() - 1); y2 = min(y + h - 1, (int)_mode.area.h() - 1);
int x1 = max(x, 0), int x1 = max(x, 0),
y1 = max(y, 0); y1 = max(y, 0);
if (x1 > x2 || y1 > y2) return; if (x1 > x2 || y1 > y2) return;
@ -89,7 +89,7 @@ class Framebuffer::Session_component : public Genode::Rpc_object<Framebuffer::Se
Mode mode() const override Mode mode() const override
{ {
return Mode(_width, _height, Mode::RGB565); return Mode { .area = { _width, _height } };
} }
void mode_sigh(Genode::Signal_context_capability) override { } void mode_sigh(Genode::Signal_context_capability) override { }
@ -123,7 +123,7 @@ struct Framebuffer::Main
Platform::Connection _platform { _env }; Platform::Connection _platform { _env };
Platform::Framebuffer_info _fb_info {1024, 768, 16 }; Platform::Framebuffer_info _fb_info { 1024, 768, 32 };
Constructible<Framebuffer::Session_component> _fb_session { }; Constructible<Framebuffer::Session_component> _fb_session { };
Constructible<Static_root<Framebuffer::Session>> _fb_root { }; Constructible<Static_root<Framebuffer::Session>> _fb_root { };

View File

@ -95,8 +95,8 @@ class Framebuffer::Session_component : public Rpc_object<Session>
{ {
unsigned const bpp = _requested_mode.bytes_per_pixel(); unsigned const bpp = _requested_mode.bytes_per_pixel();
unsigned const flags = SDL_SWSURFACE | SDL_RESIZABLE; unsigned const flags = SDL_SWSURFACE | SDL_RESIZABLE;
unsigned const w = _requested_mode.width(); unsigned const w = _requested_mode.area.w();
unsigned const h = _requested_mode.height(); unsigned const h = _requested_mode.area.h();
if (SDL_VideoModeOK(w, h, bpp*8, flags)) if (SDL_VideoModeOK(w, h, bpp*8, flags))
_screen = SDL_SetVideoMode(w, h, bpp*8, flags); _screen = SDL_SetVideoMode(w, h, bpp*8, flags);
@ -153,8 +153,8 @@ class Framebuffer::Session_component : public Rpc_object<Session>
/* clip refresh area to screen boundaries */ /* clip refresh area to screen boundaries */
int const x1 = max(x, 0); int const x1 = max(x, 0);
int const y1 = max(y, 0); int const y1 = max(y, 0);
int const x2 = min(x + w - 1, min(_mode.width(), _screen->w) - 1); int const x2 = min(x + w - 1, min((int)_mode.area.w(), _screen->w) - 1);
int const y2 = min(y + h - 1, min(_mode.height(), _screen->h) - 1); int const y2 = min(y + h - 1, min((int)_mode.area.h(), _screen->h) - 1);
if (x1 > x2 || y1 > y2) if (x1 > x2 || y1 > y2)
return; return;
@ -163,7 +163,7 @@ class Framebuffer::Session_component : public Rpc_object<Session>
unsigned const bpp = _mode.bytes_per_pixel(); unsigned const bpp = _mode.bytes_per_pixel();
char const * const src_base = _fb_ds->local_addr<char>(); char const * const src_base = _fb_ds->local_addr<char>();
unsigned const src_pitch = bpp*_mode.width(); unsigned const src_pitch = bpp*_mode.area.w();
char const * const src = src_base + y1*src_pitch + bpp*x1; char const * const src = src_base + y1*src_pitch + bpp*x1;
unsigned const dst_pitch = _screen->pitch; unsigned const dst_pitch = _screen->pitch;
@ -186,10 +186,10 @@ struct Fb_sdl::Main
Timer::Connection _timer { _env }; Timer::Connection _timer { _env };
int _fb_width = _config.xml().attribute_value("width", 1024UL); unsigned const _fb_width = _config.xml().attribute_value("width", 1024UL);
int _fb_height = _config.xml().attribute_value("height", 768UL); unsigned const _fb_height = _config.xml().attribute_value("height", 768UL);
Framebuffer::Mode _fb_mode { _fb_width, _fb_height, Framebuffer::Mode::RGB565 }; Framebuffer::Mode _fb_mode { .area = { _fb_width, _fb_height } };
Framebuffer::Session_component _fb_session { _env, _fb_mode }; Framebuffer::Session_component _fb_session { _env, _fb_mode };
@ -250,9 +250,13 @@ void Fb_sdl::Main::_handle_sdl_event(SDL_Event const &event)
if (event.type == SDL_VIDEORESIZE) { if (event.type == SDL_VIDEORESIZE) {
Framebuffer::Mode const mode(event.resize.w, event.resize.h, if (event.resize.w < 0 || event.resize.h < 0) {
Framebuffer::Mode::RGB565); warning("attempt to resize to negative size");
return;
}
Framebuffer::Mode const mode { .area = { (unsigned)event.resize.w,
(unsigned)event.resize.h } };
_fb_session.submit_mode_change(mode); _fb_session.submit_mode_change(mode);
return; return;
} }

View File

@ -97,8 +97,6 @@ struct Framebuffer::Session_component : Genode::Rpc_object<Framebuffer::Session>
View_updater &_view_updater; View_updater &_view_updater;
Framebuffer::Mode::Format _format = _gui.mode().format();
/* /*
* Mode as requested by the configuration or by a mode change of our * Mode as requested by the configuration or by a mode change of our
* GUI session. * GUI session.
@ -150,10 +148,10 @@ struct Framebuffer::Session_component : Genode::Rpc_object<Framebuffer::Session>
void size(Gui::Area size) void size(Gui::Area size)
{ {
/* ignore calls that don't change the size */ /* ignore calls that don't change the size */
if (Gui::Area(_next_mode.width(), _next_mode.height()) == size) if (Gui::Area(_next_mode.area.w(), _next_mode.area.h()) == size)
return; return;
Framebuffer::Mode const mode(size.w(), size.h(), _next_mode.format()); Framebuffer::Mode const mode { .area = size };
if (!_ram_suffices_for_mode(mode)) { if (!_ram_suffices_for_mode(mode)) {
Genode::warning("insufficient RAM for mode ", mode); Genode::warning("insufficient RAM for mode ", mode);
@ -168,7 +166,7 @@ struct Framebuffer::Session_component : Genode::Rpc_object<Framebuffer::Session>
Gui::Area size() const Gui::Area size() const
{ {
return Gui::Area(_active_mode.width(), _active_mode.height()); return _active_mode.area;
} }
@ -268,15 +266,15 @@ struct Nit_fb::Main : View_updater
unsigned width(Framebuffer::Mode const &mode) const unsigned width(Framebuffer::Mode const &mode) const
{ {
if (_width > 0) return _width; if (_width > 0) return _width;
if (_width < 0) return mode.width() + _width; if (_width < 0) return mode.area.w() + _width;
return mode.width(); return mode.area.w();
} }
unsigned height(Framebuffer::Mode const &mode) const unsigned height(Framebuffer::Mode const &mode) const
{ {
if (_height > 0) return _height; if (_height > 0) return _height;
if (_height < 0) return mode.height() + _height; if (_height < 0) return mode.area.h() + _height;
return mode.height(); return mode.area.h();
} }
bool valid() const { return _width != 0 && _height != 0; } bool valid() const { return _width != 0 && _height != 0; }
@ -285,9 +283,8 @@ struct Nit_fb::Main : View_updater
Framebuffer::Mode _initial_mode() Framebuffer::Mode _initial_mode()
{ {
return Framebuffer::Mode(_initial_size.width (gui.mode()), return Framebuffer::Mode { .area = { _initial_size.width (gui.mode()),
_initial_size.height(gui.mode()), _initial_size.height(gui.mode()) } };
gui.mode().format());
} }
/* /*
@ -327,9 +324,9 @@ struct Nit_fb::Main : View_updater
Value const value = config.attribute_value(attr, Value()); Value const value = config.attribute_value(attr, Value());
if (value == "top_left") return Point(0, 0); if (value == "top_left") return Point(0, 0);
if (value == "top_right") return Point(mode.width(), 0); if (value == "top_right") return Point(mode.area.w(), 0);
if (value == "bottom_left") return Point(0, mode.height()); if (value == "bottom_left") return Point(0, mode.area.h());
if (value == "bottom_right") return Point(mode.width(), mode.height()); if (value == "bottom_right") return Point(mode.area.w(), mode.area.h());
warning("unsupported ", attr, " attribute value '", value, "'"); warning("unsupported ", attr, " attribute value '", value, "'");
return Point(0, 0); return Point(0, 0);
@ -339,9 +336,9 @@ struct Nit_fb::Main : View_updater
{ {
Xml_node const config = config_rom.xml(); Xml_node const config = config_rom.xml();
Framebuffer::Mode const nit_mode = gui.mode(); Framebuffer::Mode const gui_mode = gui.mode();
position = _coordinate_origin(nit_mode, config) position = _coordinate_origin(gui_mode, config)
+ Point(config.attribute_value("xpos", 0L), + Point(config.attribute_value("xpos", 0L),
config.attribute_value("ypos", 0L)); config.attribute_value("ypos", 0L));
@ -354,15 +351,15 @@ struct Nit_fb::Main : View_updater
_initial_size.set = true; _initial_size.set = true;
} }
unsigned const nit_width = nit_mode.width(); unsigned const gui_width = gui_mode.area.w();
unsigned const nit_height = nit_mode.height(); unsigned const gui_height = gui_mode.area.h();
long width = config.attribute_value("width", (long)nit_mode.width()), long width = config.attribute_value("width", (long)gui_mode.area.w()),
height = config.attribute_value("height", (long)nit_mode.height()); height = config.attribute_value("height", (long)gui_mode.area.h());
if (!_initial_size.set && _initial_size.valid()) { if (!_initial_size.set && _initial_size.valid()) {
width = _initial_size.width (nit_mode); width = _initial_size.width (gui_mode);
height = _initial_size.height(nit_mode); height = _initial_size.height(gui_mode);
_initial_size.set = true; _initial_size.set = true;
} else { } else {
@ -371,8 +368,8 @@ struct Nit_fb::Main : View_updater
* If configured width / height values are negative, the effective * If configured width / height values are negative, the effective
* width / height is deduced from the screen size. * width / height is deduced from the screen size.
*/ */
if (width < 0) width = nit_width + width; if (width < 0) width = gui_width + width;
if (height < 0) height = nit_height + height; if (height < 0) height = gui_height + height;
} }
fb_session.size(Area(width, height)); fb_session.size(Area(width, height));

View File

@ -230,16 +230,15 @@ class Gui::Session_component : public Rpc_object<Session>
Framebuffer::Mode mode() override Framebuffer::Mode mode() override
{ {
int mode_width = _max_size.valid() ? unsigned const mode_width = _max_size.valid() ?
_max_size.w() : _max_size.w() :
_gui.mode().width(); _gui.mode().area.w();
int mode_height = _max_size.valid() ? unsigned const mode_height = _max_size.valid() ?
_max_size.h() : _max_size.h() :
_gui.mode().height(); _gui.mode().area.h();
return Framebuffer::Mode(mode_width, mode_height, return Framebuffer::Mode { .area = { mode_width, mode_height } };
_gui.mode().format());
} }
void mode_sigh(Signal_context_capability) override { } void mode_sigh(Signal_context_capability) override { }

View File

@ -29,9 +29,8 @@ class Nitpicker::Buffer
{ {
private: private:
Area _size; Area _size;
Framebuffer::Mode::Format _format; Attached_ram_dataspace _ram_ds;
Attached_ram_dataspace _ram_ds;
public: public:
@ -42,19 +41,17 @@ class Nitpicker::Buffer
* \throw Out_of_caps * \throw Out_of_caps
* \throw Region_map::Region_conflict * \throw Region_map::Region_conflict
*/ */
Buffer(Ram_allocator &ram, Region_map &rm, Buffer(Ram_allocator &ram, Region_map &rm, Area size, size_t bytes)
Area size, Framebuffer::Mode::Format format, size_t bytes)
: :
_size(size), _format(format), _ram_ds(ram, rm, bytes) _size(size), _ram_ds(ram, rm, bytes)
{ } { }
/** /**
* Accessors * Accessors
*/ */
Ram_dataspace_capability ds_cap() const { return _ram_ds.cap(); } Ram_dataspace_capability ds_cap() const { return _ram_ds.cap(); }
Area size() const { return _size; } Area size() const { return _size; }
Framebuffer::Mode::Format format() const { return _format; } void *local_addr() const { return _ram_ds.local_addr<void>(); }
void *local_addr() const { return _ram_ds.local_addr<void>(); }
}; };

View File

@ -25,9 +25,6 @@ class Nitpicker::Chunky_texture : public Buffer, public Texture<PT>
{ {
private: private:
Framebuffer::Mode::Format _format() {
return Framebuffer::Mode::RGB565; }
/** /**
* Return base address of alpha channel or 0 if no alpha channel exists * Return base address of alpha channel or 0 if no alpha channel exists
*/ */
@ -46,7 +43,7 @@ class Nitpicker::Chunky_texture : public Buffer, public Texture<PT>
*/ */
Chunky_texture(Ram_allocator &ram, Region_map &rm, Area size, bool use_alpha) Chunky_texture(Ram_allocator &ram, Region_map &rm, Area size, bool use_alpha)
: :
Buffer(ram, rm, size, _format(), calc_num_bytes(size, use_alpha)), Buffer(ram, rm, size, calc_num_bytes(size, use_alpha)),
Texture<PT>((PT *)local_addr(), Texture<PT>((PT *)local_addr(),
_alpha_base(size, use_alpha), size) { } _alpha_base(size, use_alpha), size) { }

View File

@ -197,13 +197,13 @@ struct Nitpicker::Main : Focus_updater
{ {
Env &_env; Env &_env;
Framebuffer::Connection _framebuffer { _env, Framebuffer::Mode() }; Framebuffer::Connection _framebuffer { _env, Framebuffer::Mode { } };
Input::Connection _input { _env }; Input::Connection _input { _env };
Attached_dataspace _ev_ds { _env.rm(), _input.dataspace() }; Attached_dataspace _ev_ds { _env.rm(), _input.dataspace() };
typedef Pixel_rgb565 PT; /* physical pixel type */ typedef Pixel_rgb888 PT; /* physical pixel type */
/* /*
* Initialize framebuffer * Initialize framebuffer
@ -219,7 +219,7 @@ struct Nitpicker::Main : Focus_updater
Attached_dataspace fb_ds; Attached_dataspace fb_ds;
Canvas<PT> screen = { fb_ds.local_addr<PT>(), Area(mode.width(), mode.height()) }; Canvas<PT> screen = { fb_ds.local_addr<PT>(), mode.area };
Area size = screen.size(); Area size = screen.size();
@ -608,7 +608,7 @@ void Nitpicker::Main::_handle_fb_mode()
_fb_screen.construct(_env.rm(), _framebuffer); _fb_screen.construct(_env.rm(), _framebuffer);
/* let the view stack use the new size */ /* let the view stack use the new size */
_view_stack.size(Area(_fb_screen->mode.width(), _fb_screen->mode.height())); _view_stack.size(_fb_screen->mode.area);
/* redraw */ /* redraw */
_view_stack.update_all_views(); _view_stack.update_all_views();

View File

@ -21,7 +21,7 @@ void Session_component::_release_buffer()
if (!_texture) if (!_texture)
return; return;
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Chunky_texture<PT> const *cdt = static_cast<Chunky_texture<PT> const *>(_texture); Chunky_texture<PT> const *cdt = static_cast<Chunky_texture<PT> const *>(_texture);
@ -412,15 +412,10 @@ void Session_component::execute()
} }
} }
Framebuffer::Mode Session_component::mode() Framebuffer::Mode Session_component::mode()
{ {
Area const phys_area(_framebuffer.mode().width(), return Framebuffer::Mode { .area = screen_area(_framebuffer.mode().area) };
_framebuffer.mode().height());
Area const session_area = screen_area(phys_area);
return Framebuffer::Mode(session_area.w(), session_area.h(),
_framebuffer.mode().format());
} }
@ -473,11 +468,9 @@ void Session_component::session_control(Label suffix, Session_control control)
Buffer *Session_component::realloc_buffer(Framebuffer::Mode mode, bool use_alpha) Buffer *Session_component::realloc_buffer(Framebuffer::Mode mode, bool use_alpha)
{ {
typedef Pixel_rgb565 PT; typedef Pixel_rgb888 PT;
Area const size(mode.width(), mode.height()); _buffer_size = Chunky_texture<PT>::calc_num_bytes(mode.area, use_alpha);
_buffer_size = Chunky_texture<PT>::calc_num_bytes(size, use_alpha);
/* /*
* Preserve the content of the original buffer if nitpicker has * Preserve the content of the original buffer if nitpicker has
@ -504,7 +497,7 @@ Buffer *Session_component::realloc_buffer(Framebuffer::Mode mode, bool use_alpha
{ {
try { try {
return new (&_session_alloc) return new (&_session_alloc)
Chunky_texture<PT>(_env.ram(), _env.rm(), size, use_alpha); Chunky_texture<PT>(_env.ram(), _env.rm(), mode.area, use_alpha);
} catch (...) { } catch (...) {
return (Chunky_texture<PT>*)nullptr; return (Chunky_texture<PT>*)nullptr;
} }

View File

@ -20,7 +20,7 @@
#include <base/heap.h> #include <base/heap.h>
#include <os/session_policy.h> #include <os/session_policy.h>
#include <os/reporter.h> #include <os/reporter.h>
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <gui_session/gui_session.h> #include <gui_session/gui_session.h>
/* local includes */ /* local includes */

View File

@ -11,7 +11,7 @@
* under the terms of the GNU Affero General Public License version 3. * under the terms of the GNU Affero General Public License version 3.
*/ */
#include <os/pixel_rgb565.h> #include <os/pixel_rgb888.h>
#include <nitpicker_gfx/texture_painter.h> #include <nitpicker_gfx/texture_painter.h>
#include <nitpicker_gfx/box_painter.h> #include <nitpicker_gfx/box_painter.h>

View File

@ -30,7 +30,7 @@ struct Test
int id; int id;
Timer::Connection timer { env }; Timer::Connection timer { env };
Heap heap { env.ram(), env.rm() }; Heap heap { env.ram(), env.rm() };
Framebuffer::Connection fb { env, Framebuffer::Mode() }; Framebuffer::Connection fb { env, Framebuffer::Mode { } };
Attached_dataspace fb_ds { env.rm(), fb.dataspace() }; Attached_dataspace fb_ds { env.rm(), fb.dataspace() };
Framebuffer::Mode const fb_mode { fb.mode() }; Framebuffer::Mode const fb_mode { fb.mode() };
char *buf[2]; char *buf[2];
@ -100,8 +100,8 @@ struct Blit_test : Test
{ {
unsigned kib = 0; unsigned kib = 0;
uint64_t const start_ms = timer.elapsed_ms(); uint64_t const start_ms = timer.elapsed_ms();
unsigned const w = fb_mode.width() * fb_mode.bytes_per_pixel(); unsigned const w = fb_mode.area.w() * fb_mode.bytes_per_pixel();
unsigned const h = fb_mode.height(); unsigned const h = fb_mode.area.h();
for (unsigned i = 0; timer.elapsed_ms() - start_ms < DURATION_MS; i++) { for (unsigned i = 0; timer.elapsed_ms() - start_ms < DURATION_MS; i++) {
blit(buf[i % 2], w, fb_ds.local_addr<char>(), w, w, h); blit(buf[i % 2], w, fb_ds.local_addr<char>(), w, w, h);
kib += (w * h) / 1024; kib += (w * h) / 1024;
@ -118,8 +118,8 @@ struct Unaligned_blit_test : Test
{ {
unsigned kib = 0; unsigned kib = 0;
uint64_t const start_ms = timer.elapsed_ms(); uint64_t const start_ms = timer.elapsed_ms();
unsigned const w = fb_mode.width() * fb_mode.bytes_per_pixel(); unsigned const w = fb_mode.area.w() * fb_mode.bytes_per_pixel();
unsigned const h = fb_mode.height(); unsigned const h = fb_mode.area.h();
for (unsigned i = 0; timer.elapsed_ms() - start_ms < DURATION_MS; i++) { for (unsigned i = 0; timer.elapsed_ms() - start_ms < DURATION_MS; i++) {
blit(buf[i % 2] + 2, w, fb_ds.local_addr<char>() + 2, w, w - 2, h); blit(buf[i % 2] + 2, w, fb_ds.local_addr<char>() + 2, w, w - 2, h);
kib += (w * h) / 1024; kib += (w * h) / 1024;

View File

@ -18,10 +18,13 @@
#include <base/log.h> #include <base/log.h>
#include <framebuffer_session/connection.h> #include <framebuffer_session/connection.h>
#include <base/attached_dataspace.h> #include <base/attached_dataspace.h>
#include <os/surface.h>
#include <os/pixel_rgb888.h>
#include <util/reconstructible.h> #include <util/reconstructible.h>
using Genode::uint16_t; using Area = Genode::Surface_base::Area;
using Pixel = Genode::Pixel_rgb888;
class Test_environment class Test_environment
{ {
@ -29,13 +32,11 @@ class Test_environment
using Ds = Genode::Constructible<Genode::Attached_dataspace>; using Ds = Genode::Constructible<Genode::Attached_dataspace>;
enum Color { Pixel const BLACK = { 0, 0, 0 };
BLACK = 0x0, Pixel const BLUE = { 0, 0, 255 };
BLUE = 0x1f, Pixel const GREEN = { 0, 255, 0 };
GREEN = 0x7e0, Pixel const RED = { 255, 0, 0 };
RED = 0xf800, Pixel const WHITE = { 255, 255, 255 };
WHITE = 0xffff,
};
enum State { STRIPES, ALL_BLUE, ALL_GREEN, ALL_RED, COLORED }; enum State { STRIPES, ALL_BLUE, ALL_GREEN, ALL_RED, COLORED };
@ -57,7 +58,7 @@ class Test_environment
void _sync_handle() { void _sync_handle() {
if (_sync_cnt++ % FRAME_CNT == 0) _draw(); } if (_sync_cnt++ % FRAME_CNT == 0) _draw(); }
void _draw_frame(uint16_t volatile *, uint16_t, unsigned, unsigned); void _draw_frame(Pixel *, Pixel, Area);
Genode::size_t _fb_bpp() { return _mode.bytes_per_pixel(); } Genode::size_t _fb_bpp() { return _mode.bytes_per_pixel(); }
Genode::size_t _fb_size() { return _fb_ds->size(); } Genode::size_t _fb_size() { return _fb_ds->size(); }
@ -79,9 +80,10 @@ class Test_environment
}; };
void Test_environment::_draw_frame(uint16_t volatile *p, uint16_t c, void Test_environment::_draw_frame(Pixel *p, Pixel c, Area area)
unsigned const w, unsigned const h)
{ {
unsigned const w = area.w(), h = area.h();
/* top and bottom */ /* top and bottom */
for (unsigned i = 0; i < w; ++i) for (unsigned i = 0; i < w; ++i)
p[i] = p[(h - 1)*w + i] = c; p[i] = p[(h - 1)*w + i] = c;
@ -100,7 +102,7 @@ void Test_environment::_draw()
case STRIPES: case STRIPES:
{ {
Genode::log("black & white stripes"); Genode::log("black & white stripes");
addr_t const stripe_width = _mode.width() / 4; addr_t const stripe_width = _mode.area.w() / 4;
addr_t stripe_o = 0; addr_t stripe_o = 0;
bool stripe = 0; bool stripe = 0;
for (addr_t o = 0; o < _fb_size(); o += _fb_bpp()) { for (addr_t o = 0; o < _fb_size(); o += _fb_bpp()) {
@ -109,11 +111,10 @@ void Test_environment::_draw()
stripe_o = 0; stripe_o = 0;
stripe = !stripe; stripe = !stripe;
} }
*(uint16_t volatile *)(_fb_base() + o) = stripe ? BLACK : WHITE; *(Pixel *)(_fb_base() + o) = stripe ? BLACK : WHITE;
} }
_draw_frame((uint16_t volatile *)_fb_base(), RED, _draw_frame((Pixel *)_fb_base(), RED, _mode.area);
_mode.width(), _mode.height());
_state = ALL_BLUE; _state = ALL_BLUE;
break; break;
} }
@ -121,10 +122,9 @@ void Test_environment::_draw()
{ {
Genode::log("blue"); Genode::log("blue");
for (addr_t o = 0; o < _fb_size(); o += _fb_bpp()) for (addr_t o = 0; o < _fb_size(); o += _fb_bpp())
*(uint16_t volatile *)(_fb_base() + o) = BLUE; *(Pixel *)(_fb_base() + o) = BLUE;
_draw_frame((uint16_t volatile *)_fb_base(), RED, _draw_frame((Pixel *)_fb_base(), RED, _mode.area);
_mode.width(), _mode.height());
_state = ALL_GREEN; _state = ALL_GREEN;
break; break;
} }
@ -132,10 +132,9 @@ void Test_environment::_draw()
{ {
Genode::log("green"); Genode::log("green");
for (addr_t o = 0; o < _fb_size(); o += _fb_bpp()) for (addr_t o = 0; o < _fb_size(); o += _fb_bpp())
*(uint16_t volatile *)(_fb_base() + o) = GREEN; *(Pixel *)(_fb_base() + o) = GREEN;
_draw_frame((uint16_t volatile *)_fb_base(), RED, _draw_frame((Pixel *)_fb_base(), RED, _mode.area);
_mode.width(), _mode.height());
_state = ALL_RED; _state = ALL_RED;
break; break;
} }
@ -143,10 +142,9 @@ void Test_environment::_draw()
{ {
Genode::log("red"); Genode::log("red");
for (addr_t o = 0; o < _fb_size(); o += _fb_bpp()) for (addr_t o = 0; o < _fb_size(); o += _fb_bpp())
*(uint16_t volatile *)(_fb_base() + o) = RED; *(Pixel *)(_fb_base() + o) = RED;
_draw_frame((uint16_t volatile *)_fb_base(), WHITE, _draw_frame((Pixel *)_fb_base(), WHITE, _mode.area);
_mode.width(), _mode.height());
_state = COLORED; _state = COLORED;
break; break;
} }
@ -155,14 +153,13 @@ void Test_environment::_draw()
Genode::log("all colors mixed"); Genode::log("all colors mixed");
unsigned i = 0; unsigned i = 0;
for (addr_t o = 0; o < _fb_size(); o += _fb_bpp(), i++) for (addr_t o = 0; o < _fb_size(); o += _fb_bpp(), i++)
*(uint16_t volatile *)(_fb_base() + o) = i; *(Pixel *)(_fb_base() + o) = Pixel(i>>16, i>>8, i);
_draw_frame((uint16_t volatile *)_fb_base(), WHITE, _draw_frame((Pixel *)_fb_base(), WHITE, _mode.area);
_mode.width(), _mode.height());
_state = STRIPES; _state = STRIPES;
} }
}; };
_fb.refresh(0, 0, _mode.width(), _mode.height()); _fb.refresh(0, 0, _mode.area.w(), _mode.area.h());
} }
@ -176,11 +173,6 @@ void Test_environment::_mode_handle()
Genode::log("framebuffer is ", _mode); Genode::log("framebuffer is ", _mode);
if (_mode.bytes_per_pixel() != 2) {
Genode::error("pixel format not supported");
throw -1;
}
_draw(); _draw();
} }

View File

@ -18,6 +18,7 @@
#include <gui_session/connection.h> #include <gui_session/connection.h>
#include <timer_session/connection.h> #include <timer_session/connection.h>
#include <input/event.h> #include <input/event.h>
#include <os/pixel_rgb888.h>
using namespace Genode; using namespace Genode;
@ -150,10 +151,10 @@ void Component::construct(Genode::Env &env)
static Gui::Connection gui { env, "testnit" }; static Gui::Connection gui { env, "testnit" };
static Timer::Connection timer { env }; static Timer::Connection timer { env };
Framebuffer::Mode const mode(256, 256, Framebuffer::Mode::RGB565); Framebuffer::Mode const mode { .area = { 256, 256 } };
gui.buffer(mode, false); gui.buffer(mode, false);
int const scr_w = mode.width(), scr_h = mode.height(); int const scr_w = mode.area.w(), scr_h = mode.area.h();
log("screen is ", mode); log("screen is ", mode);
if (!scr_w || !scr_h) { if (!scr_w || !scr_h) {
@ -172,7 +173,8 @@ void Component::construct(Genode::Env &env)
Genode::Attached_dataspace fb_ds( Genode::Attached_dataspace fb_ds(
env.rm(), gui.framebuffer()->dataspace()); env.rm(), gui.framebuffer()->dataspace());
short *pixels = fb_ds.local_addr<short>(); typedef Genode::Pixel_rgb888 PT;
PT *pixels = fb_ds.local_addr<PT>();
unsigned char *alpha = (unsigned char *)&pixels[scr_w*scr_h]; unsigned char *alpha = (unsigned char *)&pixels[scr_w*scr_h];
unsigned char *input_mask = CONFIG_ALPHA ? alpha + scr_w*scr_h : 0; unsigned char *input_mask = CONFIG_ALPHA ? alpha + scr_w*scr_h : 0;
@ -183,7 +185,7 @@ void Component::construct(Genode::Env &env)
*/ */
for (int i = 0; i < scr_h; i++) for (int i = 0; i < scr_h; i++)
for (int j = 0; j < scr_w; j++) { for (int j = 0; j < scr_w; j++) {
pixels[i*scr_w + j] = (i/8)*32*64 + (j/4)*32 + i*j/256; pixels[i*scr_w + j] = PT((3*i)/8, j, i*j/32);
if (CONFIG_ALPHA) { if (CONFIG_ALPHA) {
alpha[i*scr_w + j] = (i*2) ^ (j*2); alpha[i*scr_w + j] = (i*2) ^ (j*2);
input_mask[i*scr_w + j] = alpha[i*scr_w + j] > 127; input_mask[i*scr_w + j] = alpha[i*scr_w + j] > 127;

View File

@ -16,3 +16,5 @@ terminal_session
timer_session timer_session
usb_session usb_session
vfs vfs
nitpicker_gfx
blit

View File

@ -16,3 +16,5 @@ timer_session
usb_session usb_session
vfs vfs
vm_session vm_session
nitpicker_gfx
blit

View File

@ -48,8 +48,8 @@ install_config {
<provides><service name="Timer"/></provides> <provides><service name="Timer"/></provides>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

View File

@ -65,8 +65,8 @@ install_config {
</config> </config>
</start> </start>
<start name="drivers" caps="1000"> <start name="drivers" caps="1500">
<resource name="RAM" quantum="32M" constrain_phys="yes"/> <resource name="RAM" quantum="64M" constrain_phys="yes"/>
<binary name="init"/> <binary name="init"/>
<route> <route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service> <service name="ROM" label="config"> <parent label="drivers.config"/> </service>

Some files were not shown because too many files have changed in this diff Show More