From 89cb3aa23868f707c37967f8f1bb6acc09efaccc Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Thu, 17 Aug 2017 18:19:17 +0200 Subject: [PATCH] mesa-demos: add more examples Issue #2507. --- repos/libports/run/eglgears.run | 152 ------------- repos/libports/run/mesa-gears.inc | 18 ++ repos/libports/run/mesa-gears.run | 2 + repos/libports/run/mesa-gears_i965.run | 2 + repos/libports/run/mesa-triangle_gl.inc | 18 ++ repos/libports/run/mesa-triangle_gl.run | 2 + repos/libports/run/mesa-triangle_gl_i965.run | 2 + repos/libports/run/mesa.inc | 206 ++++++++++++++++++ .../src/test/mesa_demo/eglut/eglut_genode.cc | 139 +++++++----- .../mesa_demo/{eglgears => gears}/eglgears.c | 0 .../mesa_demo/{eglgears => gears}/target.mk | 0 .../src/test/mesa_demo/triangle_gl/main.c | 53 +++++ .../src/test/mesa_demo/triangle_gl/target.mk | 15 ++ 13 files changed, 405 insertions(+), 204 deletions(-) delete mode 100644 repos/libports/run/eglgears.run create mode 100644 repos/libports/run/mesa-gears.inc create mode 100644 repos/libports/run/mesa-gears.run create mode 100644 repos/libports/run/mesa-gears_i965.run create mode 100644 repos/libports/run/mesa-triangle_gl.inc create mode 100644 repos/libports/run/mesa-triangle_gl.run create mode 100644 repos/libports/run/mesa-triangle_gl_i965.run create mode 100644 repos/libports/run/mesa.inc rename repos/libports/src/test/mesa_demo/{eglgears => gears}/eglgears.c (100%) rename repos/libports/src/test/mesa_demo/{eglgears => gears}/target.mk (100%) create mode 100644 repos/libports/src/test/mesa_demo/triangle_gl/main.c create mode 100644 repos/libports/src/test/mesa_demo/triangle_gl/target.mk 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) +