diff --git a/repos/libports/run/eglgears.run b/repos/libports/run/eglgears.run
deleted file mode 100644
index 40dbb48d3..000000000
--- a/repos/libports/run/eglgears.run
+++ /dev/null
@@ -1,152 +0,0 @@
-set build_components {
- core init
- drivers/timer
- drivers/input
- drivers/framebuffer
- lib/mesa/swrast
- server/nitpicker
- server/nit_fb
- app/launchpad
- app/pointer
- test/mesa_demo/eglgears
-}
-
-source ${genode_dir}/repos/base/run/platform_drv.inc
-append_platform_drv_build_components
-
-build $build_components
-
-create_boot_directory
-
-set config {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-append_if [have_spec linux] config {
-
-
-
-
-
-
- }
-
-append_platform_drv_config
-
-append_if [expr ![have_spec linux]] config {
-
-
-
-
-
-
- }
-
-append_if [have_spec ps2] config {
-
-
-
- }
-
-append config {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-install_config $config
-
-set boot_modules {
- core init ld.lib.so timer nitpicker nit_fb
- launchpad gears pointer
- libc.lib.so libm.lib.so pthread.lib.so
- egl.lib.so mesa.lib.so stdcxx.lib.so
- expat.lib.so glapi.lib.so
- egl_swrast.lib.so
-}
-
-lappend_if [have_spec linux] boot_modules fb_sdl
-lappend_if [expr ![have_spec linux]] boot_modules fb_drv
-lappend_if [have_spec ps2] boot_modules ps2_drv
-
-append_platform_drv_boot_modules
-
-build_boot_image $boot_modules
-
-append qemu_args " -m 768"
-
-run_genode_until forever
-
diff --git a/repos/libports/run/mesa-gears.inc b/repos/libports/run/mesa-gears.inc
new file mode 100644
index 000000000..b482c02e7
--- /dev/null
+++ b/repos/libports/run/mesa-gears.inc
@@ -0,0 +1,18 @@
+set demo_component test/mesa_demo/gears
+set demo_binary gears
+set demo_ram_quota 32M
+set demo_caps 200
+
+set demo_config {
+
+
+
+
+
+}
+
+set demo_modules {
+ gears
+}
+
+source ${genode_dir}/repos/libports/run/mesa.inc
diff --git a/repos/libports/run/mesa-gears.run b/repos/libports/run/mesa-gears.run
new file mode 100644
index 000000000..b12e08eb0
--- /dev/null
+++ b/repos/libports/run/mesa-gears.run
@@ -0,0 +1,2 @@
+set use_i965 0
+source ${genode_dir}/repos/libports/run/mesa-gears.inc
diff --git a/repos/libports/run/mesa-gears_i965.run b/repos/libports/run/mesa-gears_i965.run
new file mode 100644
index 000000000..5dce09ceb
--- /dev/null
+++ b/repos/libports/run/mesa-gears_i965.run
@@ -0,0 +1,2 @@
+set use_i965 1
+source ${genode_dir}/repos/libports/run/mesa-gears.inc
diff --git a/repos/libports/run/mesa-triangle_gl.inc b/repos/libports/run/mesa-triangle_gl.inc
new file mode 100644
index 000000000..5a6665ead
--- /dev/null
+++ b/repos/libports/run/mesa-triangle_gl.inc
@@ -0,0 +1,18 @@
+set demo_component test/mesa_demo/triangle_gl
+set demo_binary triangle_gl
+set demo_ram_quota 32M
+set demo_caps 200
+
+set demo_config {
+
+
+
+
+
+}
+
+set demo_modules {
+ triangle_gl
+}
+
+source ${genode_dir}/repos/libports/run/mesa.inc
diff --git a/repos/libports/run/mesa-triangle_gl.run b/repos/libports/run/mesa-triangle_gl.run
new file mode 100644
index 000000000..ef4f91234
--- /dev/null
+++ b/repos/libports/run/mesa-triangle_gl.run
@@ -0,0 +1,2 @@
+set use_i965 0
+source ${genode_dir}/repos/libports/run/mesa-triangle_gl.inc
diff --git a/repos/libports/run/mesa-triangle_gl_i965.run b/repos/libports/run/mesa-triangle_gl_i965.run
new file mode 100644
index 000000000..a97fd81d8
--- /dev/null
+++ b/repos/libports/run/mesa-triangle_gl_i965.run
@@ -0,0 +1,2 @@
+set use_i965 1
+source ${genode_dir}/repos/libports/run/mesa-triangle_gl.inc
diff --git a/repos/libports/run/mesa.inc b/repos/libports/run/mesa.inc
new file mode 100644
index 000000000..0b0a31493
--- /dev/null
+++ b/repos/libports/run/mesa.inc
@@ -0,0 +1,206 @@
+
+if {[have_spec linux] && $use_i965} {
+ puts "i965 driver not supported on Linux."
+ exit 1
+}
+
+if {[have_include power_on/qemu] && $use_i965} {
+ puts "i965 driver not supported in Qemu."
+ exit 1
+}
+
+
+set build_components {
+ core init
+ drivers/timer
+ drivers/input
+ drivers/framebuffer
+ drivers/gpu/intel
+ server/liquid_framebuffer
+ server/nitpicker
+ lib/mesa/swrast
+ app/launchpad
+ app/pointer
+}
+
+lappend_if $use_i965 build_components lib/mesa/i965
+
+lappend build_components $demo_component
+
+source ${genode_dir}/repos/base/run/platform_drv.inc
+append_platform_drv_build_components
+
+build $build_components
+
+create_boot_directory
+
+set config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+append_if [have_spec linux] config {
+
+
+
+
+
+
+ }
+
+append_platform_drv_config
+
+append_if [expr ![have_spec linux]] config {
+
+
+
+
+
+
+ }
+
+append_if [have_spec ps2] config {
+
+
+
+ }
+
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+
+#
+#
+#
+
+set backend_library egl_swrast.lib.so
+if {$use_i965} {
+set backend_library egl_i965.lib.so
+}
+
+set launchpad_config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+
+append launchpad_config "
+
+ "
+
+append launchpad_config $demo_config
+
+append launchpad_config "
+
+
+
+ "
+append launchpad_config {
+
+
+
+
+
+}
+
+append config {
+
+ }
+append config $launchpad_config
+append config {
+ }
+
+append_if $use_i965 config {
+
+
+
+
+
+
+
+ }
+
+append config {
+}
+
+install_config $config
+
+set boot_modules {
+ core init ld.lib.so timer nitpicker pointer liquid_fb
+ launchpad
+
+ libc.lib.so libm.lib.so pthread.lib.so
+ egl.lib.so mesa.lib.so stdcxx.lib.so
+ expat.lib.so glapi.lib.so
+
+ egl_swrast.lib.so
+}
+
+append_if $use_i965 boot_modules {
+ egl_i965.lib.so drm.lib.so
+ intel_gpu_drv
+}
+
+append boot_modules $demo_modules
+
+lappend_if [have_spec linux] boot_modules fb_sdl
+lappend_if [expr ![have_spec linux]] boot_modules fb_drv
+lappend_if [have_spec ps2] boot_modules ps2_drv
+
+append_platform_drv_boot_modules
+
+build_boot_image $boot_modules
+
+append qemu_args " -m 768"
+
+run_genode_until forever
diff --git a/repos/libports/src/test/mesa_demo/eglut/eglut_genode.cc b/repos/libports/src/test/mesa_demo/eglut/eglut_genode.cc
index 2b288e0e9..9a36c4a8b 100644
--- a/repos/libports/src/test/mesa_demo/eglut/eglut_genode.cc
+++ b/repos/libports/src/test/mesa_demo/eglut/eglut_genode.cc
@@ -28,6 +28,8 @@
#include
#include
+#include
+#include
#include
extern "C" {
@@ -35,67 +37,84 @@ extern "C" {
#include
}
-#include
-static bool initialized = false;
Genode::Env *genode_env;
+static Genode::Constructible signal_ep;
-struct Eglut_env
+Genode::Entrypoint &genode_entrypoint()
{
- Libc::Env &env;
- Genode::Heap heap { env.ram(), env.rm() };
+ return *signal_ep;
+}
- Eglut_env(Libc::Env &env) : env(env) { }
+
+struct Window : Genode_egl_window
+{
+ Genode::Env &env;
+ Genode::Constructible framebuffer;
+ Genode::Io_signal_handler mode_dispatcher;
+ bool mode_change_pending = false;
+
+ Window(Genode::Env &env, int w, int h)
+ :
+ env(env),
+ mode_dispatcher(*signal_ep, *this, &Window::mode_handler)
+ {
+ width = w;
+ height = h;
+
+ framebuffer.construct(env, Framebuffer::Mode(width, height, Framebuffer::Mode::RGB565));
+ addr = env.rm().attach(framebuffer->dataspace());
+
+ framebuffer->mode_sigh(mode_dispatcher);
+
+ mode_change();
+ }
+
+ void mode_handler()
+ {
+ mode_change_pending = true;
+ }
+
+ void update()
+ {
+ env.rm().detach(addr);
+ addr = env.rm().attach(framebuffer->dataspace());
+ }
+
+ void mode_change()
+ {
+ Framebuffer::Mode mode = framebuffer->mode();
+
+ eglut_window *win = _eglut->current;
+ if (win) {
+ win->native.width = mode.width();
+ win->native.height = mode.height();
+ width = mode.width();
+ height = mode.height();
+
+ if (win->reshape_cb)
+ win->reshape_cb(win->native.width, win->native.height);
+ }
+
+ update();
+ mode_change_pending = false;
+ }
+
+ void refresh()
+ {
+ framebuffer->refresh(0, 0, width, height);
+ }
};
-Genode::Constructible eglut_env;
+Genode::Constructible eglut_win;
+
void _eglutNativeInitDisplay()
{
_eglut->surface_type = EGL_WINDOW_BIT;
}
-void Window::sync_handler()
-{
- struct eglut_window *win =_eglut->current;
-
- if (_eglut->idle_cb)
- _eglut->idle_cb();
-
-
- if (win->display_cb)
- win->display_cb();
-
- if (initialized) {
- eglSwapBuffers(_eglut->dpy, win->surface);
-
- //XXX: required till vsync interrupt
- eglWaitClient();
- }
-}
-
-
-void Window::mode_handler()
-{
- if (!framebuffer.is_constructed())
- return;
-
- initialized = true;
- Framebuffer::Mode mode = framebuffer->mode();
-
- eglut_window *win = _eglut->current;
- if (win) {
- win->native.width = mode.width();
- win->native.height = mode.height();
-
- if (win->reshape_cb)
- win->reshape_cb(win->native.width, win->native.height);
- }
-
- update();
-}
-
void _eglutNativeFiniDisplay(void)
{
@@ -106,7 +125,8 @@ void _eglutNativeFiniDisplay(void)
void _eglutNativeInitWindow(struct eglut_window *win, const char *title,
int x, int y, int w, int h)
{
- Genode_egl_window *native = new (eglut_env->heap) Window(eglut_env->env, w, h);
+ eglut_win.construct(*genode_env, w, h);
+ Genode_egl_window *native = &*eglut_win;
win->native.u.window = native;
win->native.width = w;
win->native.height = h;
@@ -122,7 +142,24 @@ void _eglutNativeFiniWindow(struct eglut_window *win)
void _eglutNativeEventLoop()
{
while (true) {
- select(0, nullptr, nullptr, nullptr, nullptr);
+ struct eglut_window *win =_eglut->current;
+
+ if (eglut_win->mode_change_pending) {
+ eglut_win->mode_change();
+ }
+
+ if (_eglut->idle_cb)
+ _eglut->idle_cb();
+
+
+ if (win->display_cb)
+ win->display_cb();
+
+ if (eglut_win.is_constructed()) {
+ eglWaitClient();
+ eglSwapBuffers(_eglut->dpy, win->surface);
+ eglut_win->refresh();
+ }
}
}
@@ -135,9 +172,7 @@ extern "C" int eglut_main(int argc, char *argv[]);
void Libc::Component::construct(Libc::Env &env)
{
- eglut_env.construct(env);
-
genode_env = &env;
-
+ signal_ep.construct(env, 1024*sizeof(long), "eglut_signal_ep");
Libc::with_libc([] () { eglut_main(1, nullptr); });
}
diff --git a/repos/libports/src/test/mesa_demo/eglgears/eglgears.c b/repos/libports/src/test/mesa_demo/gears/eglgears.c
similarity index 100%
rename from repos/libports/src/test/mesa_demo/eglgears/eglgears.c
rename to repos/libports/src/test/mesa_demo/gears/eglgears.c
diff --git a/repos/libports/src/test/mesa_demo/eglgears/target.mk b/repos/libports/src/test/mesa_demo/gears/target.mk
similarity index 100%
rename from repos/libports/src/test/mesa_demo/eglgears/target.mk
rename to repos/libports/src/test/mesa_demo/gears/target.mk
diff --git a/repos/libports/src/test/mesa_demo/triangle_gl/main.c b/repos/libports/src/test/mesa_demo/triangle_gl/main.c
new file mode 100644
index 000000000..e064c7479
--- /dev/null
+++ b/repos/libports/src/test/mesa_demo/triangle_gl/main.c
@@ -0,0 +1,53 @@
+#define GL_GLEXT_PROTOTYPES
+#include
+#ifdef __APPLE__
+# include
+#else
+#include
+#include
+#include
+#include "eglut.h"
+#endif
+#include
+#include
+
+
+/*
+ * GLUT callbacks:
+ */
+static void update_timer(void)
+{
+ eglutPostRedisplay();
+}
+
+static void render(void)
+{
+ glClearColor(0.f, 0.f, 0.f, 0.f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glLoadIdentity();
+
+ glBegin(GL_TRIANGLES);
+ glVertex3f( 0.0f, 1.0f, 0.0f);
+ glVertex3f(-1.0f,-1.0f, 0.0f);
+ glVertex3f( 1.0f,-1.0f, 0.0f);
+ glEnd();
+
+ glFlush();
+}
+
+/*
+ * Entry point
+ */
+int eglut_main(int argc, char** argv)
+{
+ eglutInit(argc, argv);
+ eglutInitWindowSize(600, 600);
+ eglutInitAPIMask(EGLUT_OPENGL_BIT);
+ eglutCreateWindow("Triangle");
+ eglutIdleFunc(&update_timer);
+ eglutDisplayFunc(&render);
+
+ eglutMainLoop();
+ return 0;
+}
diff --git a/repos/libports/src/test/mesa_demo/triangle_gl/target.mk b/repos/libports/src/test/mesa_demo/triangle_gl/target.mk
new file mode 100644
index 000000000..a6cc69f27
--- /dev/null
+++ b/repos/libports/src/test/mesa_demo/triangle_gl/target.mk
@@ -0,0 +1,15 @@
+TARGET = triangle_gl
+LIBS = libm libc egl mesa
+
+SRC_C = eglut.c main.c
+SRC_CC = eglut_genode.cc
+LD_OPT = --export-dynamic
+
+EGLUT_DIR = $(PRG_DIR)/../eglut
+
+INC_DIR += $(REP_DIR)/src/lib/mesa/include \
+ $(EGLUT_DIR)
+
+vpath %.c $(EGLUT_DIR)
+vpath %.cc $(EGLUT_DIR)
+