Internship: Open-Source Software Developer - (Collabora)
Collabora Part Time Software Engineer Remote-US Remote-South & Central America Remote-UK Remote-Asia Remote-Africa Remote-Canada Remote-Australia
Remote Job Description
Conditions of the Internship:
- you will be mentored by one or more of Collabora's outstanding F/LOSS developers as part of one of our development teams;
- your working hours will be from 30 to 40 hours per week;
- compensation, which varies based on location and agreed hours, will be discussed during the interview process;
- you will be working from either our Cambridge office, our Montreal office, or remotely from home;
- you need to have a legal right to work in the UK or Canada if you wish to relocate to an office; and
- your start date will be any time in 2020, after you have completed your full time education.
Offered Projects (please see descriptions below):
- libfunctionfs: Write a library facilitation userspace-implemented USB gadget functions
- VKMS: Automated compositor testing with VKMS
- Panfrost: Panfrost compiler improvements
- GStreamer: Chromecast sink element in Rust
- Monado: Head tracked fish tank display
- Monado: SLAM-Jam
libfunctionfs: Write a library facilitation userspace-implemented USB gadget functions
- Linux kernel provides ~20 USB function for USB gadgets. However, if a function is needed which is not provided, the user can use FunctionFS, a very special USB function which is a filesystem, and then implement their USB function in userspace using file operations to transfer data between the host and the device. Example functions which can be implemented this way are mtp or adb, because they are _not_ provided by the upstream kernel and there is little chance that they will ever be. The primary goal of the project is to design and write a C library facilitating writing such userspace-implemented USB gadget functions. The secondary goal is to develop a tool which uses the library to create binary blobs containing USB function descriptors for FunctionFS, that includes developing an extensible framework for accommodating various kinds of USB descriptors. A nice-to-have would be e.g. Python bindings for the library.
VKMS: Automated compositor testing with VKMS
- VKMS is a virtual kernel modesetting driver which provides a KMS driver on top of a pure software implementation. Currently, VKMS implements a fixed plane -> CRTC -> connector -> writeback pipeline, which can be used for testing the normal flow. Being a software implementation, we could enhance VKMS (perhaps through user-supplied eBPF hooks, or just through proxying requests similarly to the DisplayLink EVDI driver) to allow userspace to trigger particular error or corner cases inside the driver, allowing automated testing of compositors (e.g. Weston) responses to error cases from the driver.
Panfrost: Panfrost compiler improvements
- The student would work on the compiler for the Midgard or Bifrost architecture to improve the functionality or performance of a production compiler, dealing with the real world rewards challenges of compiling for irregular graphics architectures. Depending on the student's interest, this project could involve optimisation or adding new features. The exact project will be agreed during the interview stage. For reference, this is one of the potential projects which could be done: "A student will implement half-float (fp16) and short integer (int16) data types in the production Midgard compiler, in addition to single-precision floats and 32-bit integers. The student will extend Midgard's machine intermediate representation and register allocation algorithm to respect differing type sizes, effectively using the subdivided register space to reduce register spilling and improve performance. The project's completion will be marked by merging the student's code to upstream Mesa."
GStreamer: Chromecast sink element in Rust
- Being able to stream to a Chromcast device would be a great addition to GStreamer. First step would be to create a httpserversink element which could be used to expose any stream using a self-served HTTP server. The logic would be very similar to the http-launch tool but with the server wrapped inside a new element rather than an application. This element would probably use Hyper as http crate. Then this element would be wrapped in a new chromecastsink bin which would be using a crate such as rust-cast to export the http stream to a Chromcast device.
Monado: Head tracked fish tank display
- The core OpenXR 1.0 specification supports stereo VR headsets and monoscopic handheld displays like smartphones or tablets which are supposed to be used as a "magic window" into a VR world or for AR purposes; for this purpose the device's orientation and position is tracked to provide users the ability to move the "window" view by moving the display device. A further use of monoscopic displays is the "fish tank" configuration with a fixed display like a TV and instead the head position of the user is tracked, to render the content behind the magic window from the right perspective (example). For this project, the student will add support in Monado for tracking a face, figure out the relation of the face/eyes to the a monitor and calculate fov values. The focus of this is not making creating production ready code that in 100% of the cases, but the integration of the code into Monado. The small test application hello_xr will need changes to add better support for monoscopic fish tank views, like improving the scene setup. Depending on progress, the student can modify one or all of Godot, Blender and Unreal to support monoscopic fish tank mode.
- The WMR and Oculus Rift S PC VR headsets only support camera based inside out tracking as their positional tracking system. We want to support these headsets in our Monado runtime, but to do so we need an implementation of simultaneous localization and mapping (SLAM) tracking. Several open source implementations exist, but mostly optimized for robotics/research, not for real time VR headset tracking. The task would be to design and run a comparison of MIT licensed SLAM implementations such as Maplab, OpenVSLAM or Kimera, and perhaps others. If time permits, use a HMD with cameras or put a camera on a headset and integrate into a complete solution.