Turn framebuffer drivers into capture clients

Issue genodelabs/genode#3813
This commit is contained in:
Norman Feske
2020-07-08 14:19:52 +02:00
parent db415f5b1f
commit 50334e62f4
16 changed files with 186 additions and 317 deletions

View File

@@ -8,13 +8,11 @@
<service name="CPU"/>
<service name="LOG"/>
<service name="Timer"/>
<service name="Capture"/>
</parent-provides>
<default caps="100"/>
<service name="Framebuffer">
<default-policy> <child name="fb_drv"/> </default-policy> </service>
<service name="Input">
<default-policy> <child name="input_filter"/> </default-policy> </service>
@@ -29,17 +27,17 @@
<start name="fb_drv">
<binary name="exynos5_fb_drv"/>
<resource name="RAM" quantum="10M"/>
<provides> <service name="Framebuffer"/> </provides>
<resource name="RAM" quantum="18M"/>
<config/>
<route>
<service name="IRQ"> <parent/> </service>
<service name="IO_MEM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="PD"> <parent/> </service>
<service name="CPU"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <parent/> </service>
<service name="IRQ"> <parent/> </service>
<service name="IO_MEM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="PD"> <parent/> </service>
<service name="CPU"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <parent/> </service>
<service name="Capture"> <parent/> </service>
<service name="Regulator"> <child name="arndale_platform_drv"/> </service>
</route>
</start>

View File

@@ -8,29 +8,27 @@
<service name="CPU"/>
<service name="LOG"/>
<service name="Timer"/>
<service name="Capture"/>
</parent-provides>
<default caps="100"/>
<service name="Framebuffer">
<default-policy> <child name="fb_drv"/> </default-policy> </service>
<service name="Input">
<default-policy> <child name="input_filter"/> </default-policy> </service>
<start name="fb_drv">
<binary name="omap4_fb_drv"/>
<resource name="RAM" quantum="10M"/>
<provides> <service name="Framebuffer"/> </provides>
<config/>
<route>
<service name="IRQ"> <parent/> </service>
<service name="IO_MEM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="PD"> <parent/> </service>
<service name="CPU"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <parent/> </service>
<service name="IRQ"> <parent/> </service>
<service name="IO_MEM"> <parent/> </service>
<service name="ROM"> <parent/> </service>
<service name="PD"> <parent/> </service>
<service name="CPU"> <parent/> </service>
<service name="LOG"> <parent/> </service>
<service name="Timer"> <parent/> </service>
<service name="Capture"> <parent/> </service>
</route>
</start>

View File

@@ -1,7 +1,7 @@
base
os
blit
framebuffer_session
capture_session
input_session
gpio_session
timer_session

View File

@@ -1,7 +1,7 @@
base
os
blit
framebuffer_session
capture_session
input_session
gpio_session
timer_session

View File

@@ -37,18 +37,18 @@ append config {
<binary name="init"/>
<route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Capture"> <child name="nitpicker"/> </service>
<any-service> <parent/> </any-service>
</route>
<provides>
<service name="Input"/> <service name="Framebuffer"/>
</provides>
<provides> <service name="Input"/> </provides>
</start>
<start name="nitpicker">
<resource name="RAM" quantum="8M"/>
<provides><service name="Gui"/></provides>
<config>
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<config request_framebuffer="no">
<capture/>
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="default" layer="2" content="client" label="no" focus="click" hover="always" />
<policy label_prefix="pointer" domain="pointer"/>

View File

@@ -42,20 +42,21 @@ install_config {
<binary name="init"/>
<route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Capture"> <child name="nitpicker"/> </service>
<any-service> <parent/> </any-service>
</route>
<provides>
<service name="Input"/> <service name="Framebuffer"/>
</provides>
<provides> <service name="Input"/> </provides>
</start>
<start name="nitpicker">
<resource name="RAM" quantum="4M"/>
<provides><service name="Gui"/></provides>
<config>
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<config request_framebuffer="no">
<capture/>
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="default" layer="2" content="client" label="no" hover="always" focus="click" />
<domain name="default" layer="2" content="client" label="no"
hover="always" focus="click" width="1024" height="768"/>
<policy label_prefix="pointer" domain="pointer"/>
<default-policy domain="default"/>

View File

@@ -53,12 +53,11 @@ install_config {
<binary name="init"/>
<route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Capture"> <child name="nitpicker"/> </service>
<any-service> <parent/> </any-service>
</route>
<provides>
<service name="Input"/> <service name="Framebuffer"/>
</provides>
<provides> <service name="Input"/> </provides>
</start>
<start name="timer">
@@ -69,10 +68,12 @@ install_config {
<start name="nitpicker">
<resource name="RAM" quantum="4M"/>
<provides><service name="Gui"/></provides>
<config focus="rom">
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<config focus="rom" request_framebuffer="no">
<capture/>
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="default" layer="2" content="client" label="no" hover="always"/>
<domain name="default" layer="2" content="client" label="no" hover="always" width="1024" height="768"/>
<policy label_prefix="pointer" domain="pointer"/>
<default-policy domain="default"/>

View File

@@ -26,6 +26,7 @@ set build_components {
server/nitpicker
server/rom_filter
server/terminal_log
server/input_event_bridge
test/nitpicker
}
@@ -63,15 +64,22 @@ append config {
<default caps="128"/>
<start name="fb_sdl" ld="no">
<resource name="RAM" quantum="4M"/>
<provides>
<service name="Input"/>
<service name="Framebuffer"/>
</provides>
<provides> <service name="Input"/> </provides>
<config width="800" height="600"/>
<route> <any-service> <parent/> <any-child/> </any-service> </route>
</start>
<alias name="fb_drv" child="fb_sdl"/>
<alias name="input_drv" child="fb_sdl"/>
<start name="input_event_bridge">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="Event"/>
<service name="Input"/>
</provides>
<config/>
<route>
<any-service> <parent/> </any-service>
</route>
</start>
<alias name="input_drv" child="input_event_bridge"/>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
@@ -99,7 +107,9 @@ append config {
<attribute name="enabled" /> </input>
<output node="config">
<attribute name="request_framebuffer" value="no"/>
<inline>
<capture/>
<report focus="yes" xray="yes" hover="yes" />
<domain name="pointer" layer="2" content="client" label="no" origin="pointer" />
</inline>
@@ -138,10 +148,9 @@ append config {
<start name="nitpicker">
<resource name="RAM" quantum="4M"/>
<provides><service name="Gui"/></provides>
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<route>
<service name="ROM" label="config"> <child name="nitpicker_config"/> </service>
<service name="Framebuffer"> <child name="fb_drv" /> </service>
<service name="Input"> <child name="input_drv" /> </service>
<service name="Report"> <child name="report_rom" /> </service>
<any-service> <parent/> <any-child/> </any-service>
@@ -301,6 +310,7 @@ set boot_modules {
testnit
timer
global_keys_handler
input_event_bridge
}
build_boot_image $boot_modules

View File

@@ -235,11 +235,12 @@ append_if $use_interactive_pkg config {
<binary name="init"/>
<route>
<service name="ROM" label="config"> <parent label="drivers.config"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<service name="Capture"> <child name="nitpicker"/> </service>
<any-service> <parent/> </any-service>
</route>
<provides>
<service name="Input"/> <service name="Framebuffer"/>
<service name="Input"/>
<service name="Platform"/>
</provides>
</start>}
@@ -250,7 +251,6 @@ if { !$use_interactive_pkg } {
append_if [have_spec x86] config {
<start name="intel_fb_drv" caps="1000">
<resource name="RAM" quantum="60M"/>
<provides><service name="Framebuffer"/></provides>
<route>
<any-service> <parent/> <any-child /> </any-service>
</route>
@@ -342,12 +342,13 @@ append config {
<start name="nitpicker" caps="110">
<resource name="RAM" quantum="1216K"/>
<resource name="CPU" quantum="20"/>
<provides><service name="Gui"/></provides>
<config>
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<config request_framebuffer="no">
<capture/>
<report focus="yes" />
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="panel" layer="2" content="client" label="no" focus="none" />
<domain name="client" layer="3" content="client" label="no" focus="click"/>
<domain name="client" layer="3" content="client" label="no" focus="click" width="1024" height="768"/>
<policy label_prefix="pointer" domain="pointer"/>
<default-policy domain="client"/>
</config>

View File

@@ -2,7 +2,7 @@ set build_components { test/sdl }
set app_config {
<start name="test-sdl">
<resource name="RAM" quantum="32M"/>
<resource name="RAM" quantum="48M"/>
<config>
<vfs> <dir name="dev"> <log/> </dir> </vfs>
<libc stdout="/dev/log"/>

View File

@@ -2,7 +2,7 @@ set build_components { test/sdl2 }
set app_config {
<start name="test-sdl2">
<resource name="RAM" quantum="32M"/>
<resource name="RAM" quantum="48M"/>
<config ld_verbose="yes">
<vfs> <dir name="dev"> <log/> </dir> </vfs>
<libc stdout="/dev/log"/>

View File

@@ -18,6 +18,7 @@ set build_components {
drivers/gpu/intel
server/liquid_framebuffer
server/nitpicker
server/input_event_bridge
lib/mesa/swrast
app/launchpad
app/pointer
@@ -55,20 +56,26 @@ set config {
append_if [have_spec linux] config {
<start name="fb_sdl" caps="200" ld="no">
<resource name="RAM" quantum="4M"/>
<provides> <service name="Input"/> </provides>
</start>
<start name="input_event_bridge">
<resource name="RAM" quantum="1M"/>
<provides>
<service name="Event"/>
<service name="Input"/>
<service name="Framebuffer"/>
</provides>
</start>}
<config/>
<route>
<any-service> <parent/> </any-service>
</route>
</start>
<alias name="input_drv" child="input_event_bridge"/> }
append_platform_drv_config
append_if [expr ![have_spec linux]] config {
<start name="fb_drv">
<resource name="RAM" quantum="10M"/>
<provides>
<service name="Framebuffer"/>
</provides>
<route><any-service> <parent /> <any-child/> </any-service> </route>
</start>}
@@ -76,7 +83,8 @@ append_if [have_spec ps2] config {
<start name="ps2_drv">
<resource name="RAM" quantum="2M"/>
<provides> <service name="Input"/> </provides>
</start> }
</start>
<alias name="input_drv" child="ps2_drv"/> }
append config {
<start name="timer">
@@ -85,14 +93,18 @@ append config {
</start>
<start name="nitpicker">
<resource name="RAM" quantum="1M"/>
<provides> <service name="Gui"/> </provides>
<config>
<provides> <service name="Gui"/> <service name="Capture"/> </provides>
<config request_framebuffer="no">
<capture/>
<domain name="pointer" layer="1" content="client" label="no" origin="pointer" />
<domain name="default" layer="2" content="client" label="no" focus="click" hover="always" />
<policy label_prefix="pointer" domain="pointer"/>
<default-policy domain="default"/>
</config>
<route><any-service><parent/><any-child/></any-service></route>
<route>
<service name="Input"> <child name="input_drv"/> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
<start name="pointer">
<resource name="RAM" quantum="1M"/>
@@ -120,7 +132,7 @@ set launchpad_config {
<service name="RM"/>
<service name="CPU"/>
<service name="LOG"/>
<service name="Nitpicker"/>
<service name="Gui"/>
<service name="Timer"/>
<service name="Gpu"/>
</parent-provides>
@@ -178,8 +190,9 @@ install_config $config
set boot_modules {
core init ld.lib.so timer nitpicker pointer liquid_fb
launchpad
input_event_bridge
libc.lib.so vfs.lib.so libm.lib.so pthread.lib.so
libc.lib.so vfs.lib.so libm.lib.so
egl.lib.so mesa.lib.so stdcxx.lib.so
expat.lib.so glapi.lib.so sdl.lib.so

View File

@@ -49,7 +49,7 @@ class Timer_delayer : public Mmio::Delayer, public Timer::Connection
Timer_delayer(Genode::Env &env) : Timer::Connection(env) { }
void usleep(uint64_t us) { Timer::Connection::usleep(us); }
void usleep(uint64_t us) override { Timer::Connection::usleep(us); }
};

View File

@@ -1,11 +1,12 @@
/*
* \brief Framebuffer driver for Exynos5 HDMI
* \author Martin Stein
* \author Norman Feske
* \date 2013-08-09
*/
/*
* Copyright (C) 2013-2017 Genode Labs GmbH
* Copyright (C) 2013-2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -13,122 +14,67 @@
/* Genode includes */
#include <base/attached_rom_dataspace.h>
#include <base/attached_ram_dataspace.h>
#include <base/component.h>
#include <framebuffer_session/framebuffer_session.h>
#include <timer_session/connection.h>
#include <dataspace/client.h>
#include <capture_session/connection.h>
#include <base/log.h>
#include <os/static_root.h>
#include <util/string.h>
/* local includes */
#include <driver.h>
namespace Framebuffer
{
namespace Framebuffer {
using namespace Genode;
/**
* Framebuffer session backend
*/
class Session_component;
struct Main;
};
class Framebuffer::Session_component
:
public Genode::Rpc_object<Framebuffer::Session>
struct Framebuffer::Main
{
private:
using Area = Capture::Area;
using Pixel = Capture::Pixel;
Genode::Env &_env;
Env &_env;
unsigned _width;
unsigned _height;
size_t _size;
Dataspace_capability _ds;
addr_t _phys_base;
Timer::Connection _timer { _env };
Attached_rom_dataspace _config { _env, "config" };
public:
Driver _driver { _env };
/**
* Constructor
*
* \param driver driver backend that communicates with hardware
* \param width width of framebuffer in pixel
* \param height height of framebuffer in pixel
* \param output targeted output device
*/
Session_component(Genode::Env &env, Driver &driver,
unsigned width, unsigned height)
:
_env(env),
_width(width),
_height(height),
_size(driver.buffer_size(width, height)),
_ds(_env.ram().alloc(_size, WRITE_COMBINED)),
_phys_base(Dataspace_client(_ds).phys_addr())
{
if (driver.init(width, height, _phys_base)) {
error("could not initialize display");
struct Could_not_initialize_display : Exception { };
throw Could_not_initialize_display();
}
}
Area const _size { _config.xml().attribute_value("width", 1920u),
_config.xml().attribute_value("height", 1080u) };
/************************************
** Framebuffer::Session interface **
************************************/
Attached_ram_dataspace _fb_ds { _env.ram(), _env.rm(),
_driver.buffer_size(_size.w(), _size.h()),
WRITE_COMBINED };
Dataspace_capability dataspace() override { return _ds; }
addr_t const _fb_phys = Dataspace_client(_fb_ds.cap()).phys_addr();
Mode mode() const override
{
return Mode { .area = { _width, _height } };
}
Capture::Connection _capture { _env };
void mode_sigh(Genode::Signal_context_capability) override { }
Capture::Connection::Screen _captured_screen { _capture, _env.rm(), _size };
void sync_sigh(Genode::Signal_context_capability sigh) override
{
_timer.sigh(sigh);
_timer.trigger_periodic(10*1000);
}
Timer::Connection _timer { _env };
void refresh(int, int, int, int) override { }
};
Signal_handler<Main> _timer_handler { _env.ep(), *this, &Main::_handle_timer };
static unsigned config_dimension(Genode::Xml_node node, char const *attr,
unsigned default_value)
{
return node.attribute_value(attr, default_value);
}
struct Main
{
Genode::Env &_env;
Genode::Entrypoint &_ep;
Genode::Attached_rom_dataspace _config { _env, "config" };
Framebuffer::Driver _driver { _env };
Framebuffer::Session_component _fb_session { _env, _driver,
config_dimension(_config.xml(), "width", 1920),
config_dimension(_config.xml(), "height", 1080)
};
Genode::Static_root<Framebuffer::Session> _fb_root { _ep.manage(_fb_session) };
Main(Genode::Env &env) : _env(env), _ep(_env.ep())
void _handle_timer()
{
/* announce service and relax */
_env.parent().announce(_ep.manage(_fb_root));
Surface<Pixel> surface(_fb_ds.local_addr<Pixel>(), _size);
_captured_screen.apply_to_surface(surface);
}
Main(Env &env) : _env(env)
{
if (_driver.init(_size.w(), _size.h(), _fb_phys)) {
error("could not initialize display");
throw Exception();
}
_timer.sigh(_timer_handler);
_timer.trigger_periodic(10*1000);
}
};
void Component::construct(Genode::Env &env) { static Main main(env); }
void Component::construct(Genode::Env &env) { static Framebuffer::Main main(env); }

View File

@@ -1,8 +1,7 @@
TARGET = exynos5_fb_drv
REQUIRES = arm_v7
SRC_CC += main.cc driver.cc
LIBS += base
LIBS += base blit
INC_DIR += $(PRG_DIR)
INC_DIR += $(call select_from_repositories,include/spec/exynos5)
CC_CXX_WARN_STRICT :=

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (C) 2012-2017 Genode Labs GmbH
* Copyright (C) 2012-2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
@@ -13,176 +13,78 @@
/* Genode includes */
#include <base/attached_rom_dataspace.h>
#include <base/attached_ram_dataspace.h>
#include <base/component.h>
#include <base/log.h>
#include <framebuffer_session/framebuffer_session.h>
#include <dataspace/client.h>
#include <blit/blit.h>
#include <os/static_root.h>
#include <timer_session/connection.h>
#include <capture_session/connection.h>
/* local includes */
#include <driver.h>
namespace Framebuffer {
using namespace Genode;
class Session_component;
class Main;
};
class Framebuffer::Session_component : public Genode::Rpc_object<Framebuffer::Session>
struct Framebuffer::Main
{
private:
using Area = Capture::Area;
using Pixel = Capture::Pixel;
/*
* Noncopyable
*/
Session_component(Session_component const &);
Session_component &operator = (Session_component const &);
Env &_env;
size_t _width;
size_t _height;
bool _buffered;
Mode _mode { };
size_t _size;
/* dataspace uses a back buffer (if '_buffered' is true) */
Genode::Dataspace_capability _bb_ds;
void *_bb_addr;
/* dataspace of physical frame buffer */
Genode::Dataspace_capability _fb_ds;
void *_fb_addr;
Signal_context_capability _sync_sigh { };
Timer::Connection _timer;
void _refresh_buffered(int x, int y, int w, int h)
{
Mode _mode = mode();
/* clip specified coordinates against screen boundaries */
int x2 = min(x + w - 1, (int)_mode.area.w() - 1),
y2 = min(y + h - 1, (int)_mode.area.h() - 1);
int x1 = max(x, 0),
y1 = max(y, 0);
if (x1 > x2 || y1 > y2) return;
int bypp = _mode.bytes_per_pixel();
/* copy pixels from back buffer to physical frame buffer */
char *src = (char *)_bb_addr + bypp*(_mode.area.w()*y1 + x1),
*dst = (char *)_fb_addr + bypp*(_mode.area.w()*y1 + x1);
blit(src, bypp*_mode.area.w(), dst, bypp*_mode.area.h(),
bypp*(x2 - x1 + 1), y2 - y1 + 1);
}
public:
Session_component(Genode::Env &env, Driver &driver, size_t width, size_t height,
Driver::Output output, bool buffered)
: _width(width),
_height(height),
_buffered(buffered),
_size(driver.buffer_size(width, height)),
_bb_ds(buffered ? env.ram().alloc(_size)
: Genode::Ram_dataspace_capability()),
_bb_addr(buffered ? (void*)env.rm().attach(_bb_ds) : 0),
_fb_ds(env.ram().alloc(_size, WRITE_COMBINED)),
_fb_addr((void*)env.rm().attach(_fb_ds)),
_timer(env)
{
if (!driver.init(width, height, output,
Dataspace_client(_fb_ds).phys_addr())) {
error("Could not initialize display");
struct Could_not_initialize_display : Exception { };
throw Could_not_initialize_display();
}
Genode::log("using ", width, "x", height,
output == Driver::OUTPUT_HDMI ? " HDMI" : " LCD");
}
/************************************
** Framebuffer::Session interface **
************************************/
Dataspace_capability dataspace() override
{
return _buffered ? _bb_ds : _fb_ds;
}
Mode mode() const override
{
return Mode { .area = { _width, _height } };
}
void mode_sigh(Genode::Signal_context_capability) override { }
void sync_sigh(Genode::Signal_context_capability sigh) override
{
_sync_sigh = sigh;
_timer.sigh(_sync_sigh);
_timer.trigger_periodic(10*1000);
}
void refresh(int x, int y, int w, int h) override
{
if (_buffered)
_refresh_buffered(x, y, w, h);
if (_sync_sigh.valid())
Signal_transmitter(_sync_sigh).submit();
}
};
template <typename T>
static T config_attribute(Genode::Xml_node node, char const *attr_name, T const &default_value)
{
return node.attribute_value(attr_name, default_value);
}
static Framebuffer::Driver::Output config_output(Genode::Xml_node node,
Framebuffer::Driver::Output default_value)
{
Framebuffer::Driver::Output value = default_value;
if (node.attribute_value("output", Genode::String<8>()) == "LDC")
value = Framebuffer::Driver::OUTPUT_LCD;
return value;
}
struct Main
{
Genode::Env &_env;
Genode::Entrypoint &_ep;
Genode::Attached_rom_dataspace _config { _env, "config" };
Attached_rom_dataspace _config { _env, "config" };
Framebuffer::Driver _driver { _env };
Framebuffer::Session_component _fb_session { _env, _driver,
config_attribute(_config.xml(), "width", 1024u),
config_attribute(_config.xml(), "height", 768u),
config_output(_config.xml(), Framebuffer::Driver::OUTPUT_HDMI),
config_attribute(_config.xml(), "buffered", false),
};
Genode::Static_root<Framebuffer::Session> _fb_root { _ep.manage(_fb_session) };
Main(Genode::Env &env) : _env(env), _ep(_env.ep())
Driver::Output _configured_output() const
{
/* announce service */
_env.parent().announce(_ep.manage(_fb_root));
Driver::Output value = Driver::OUTPUT_HDMI;
if (_config.xml().attribute_value("output", String<8>()) == "LDC")
value = Driver::OUTPUT_LCD;
return value;
}
Area const _size { _config.xml().attribute_value("width", 1024u),
_config.xml().attribute_value("height", 768u) };
Attached_ram_dataspace _fb_ds { _env.ram(), _env.rm(),
_driver.buffer_size(_size.w(), _size.h()),
WRITE_COMBINED };
addr_t const _fb_phys = Dataspace_client(_fb_ds.cap()).phys_addr();
Capture::Connection _capture { _env };
Capture::Connection::Screen _captured_screen { _capture, _env.rm(), _size };
Timer::Connection _timer { _env };
Signal_handler<Main> _timer_handler { _env.ep(), *this, &Main::_handle_timer };
void _handle_timer()
{
Surface<Pixel> surface(_fb_ds.local_addr<Pixel>(), _size);
_captured_screen.apply_to_surface(surface);
}
Main(Env &env) : _env(env)
{
if (!_driver.init(_size.w(), _size.h(), _configured_output(), _fb_phys)) {
error("Could not initialize display");
throw Exception();
}
_timer.sigh(_timer_handler);
_timer.trigger_periodic(10*1000);
}
};
void Component::construct(Genode::Env &env) { static Main main(env); }
void Component::construct(Genode::Env &env) { static Framebuffer::Main main(env); }