News & Blog

News, Events & Blogs

News & Blog

The latest from our Open Source experts

Search the newsroom

Profiling virtualized GPU acceleration with Perfetto

April 22, 2021 by Antonio Caggiano  |   Blog

Recently, we have been using Perfetto to successfully profile Apitrace traces in crosvm through VirGL renderer. We have now added perfetto instrumentation to VirGL renderer, Mesa, and Apitrace to see what happens precisely in a frame.

Profiling virtualized GPU acceleration with Perfetto

Continuous 3D Hand Pose Tracking using Machine Learning & Monado OpenXR

April 20, 2021 by Marcus Edel  |   Blog

As part of a project backed by INVEST-AI, a program managed by IVADO Labs, we have developed a multi-stage neural network-based solution that accurately locates and tracks the hands despite complex background noise and occlusion between hands.

Continuous 3D Hand Pose Tracking using Machine Learning & Monado OpenXR

An easy to use MTP implementation for your next embedded Linux project

April 13, 2021 by Andrzej Pietrasiewicz  |   Blog

Did you know you could run a permissively-licensed MTP implementation with minimal dependencies on an embedded device? Here's a step-by-step guide on how to easily run cmtp-responder on a Rock Pi 4 or any other board equipped with a UDC.

An easy to use MTP implementation for your next embedded Linux project

PanVk: An Open Source Vulkan driver for Arm Mali Midgard and Bifrost GPUs

March 25, 2021 by Boris Brezillon  |   News & Events

The Panfrost project started as a reverse engineering effort to understand Arm Mali Midgard and Bifrost GPU internals. With the driver getting more and more mature, the natural next step was to work on an Open Source Vulkan driver for those GPUs.

PanVk: An Open Source Vulkan driver for Arm Mali Midgard and Bifrost GPUs

Rust: integrating LLVM source-base code coverage with GitLab

March 24, 2021 by Guillaume Desmottes  |   Blog

Earlier this year, the Rust compiler gained support for LLVM source-base code coverage. In this post we'll explain how to setup a CI job in a Rust project to feed source-base coverage information to GitLab.

Rust: integrating LLVM source-base code coverage with GitLab

Linaro Virtual Connect - Spring 2021

March 22, 2021 by Mark Filion  |   News & Events

Join us this week at the Spring edition of Linaro Virtual Connect, as we discuss bringing stateless video decoding support to Linux, and take a look at where we are, and what's to come, for open drivers for Arm GPUs.

Linaro Virtual Connect - Spring 2021

Build and run GTK 4 applications with Visual Studio

March 18, 2021 by Xavier Claessens  |   Blog

Over the past few months, I've been working on a side project to improve Meson sub-project support. The best stress test is to build projects on Windows, without msys2, because it has no dependencies or tools installed (e.g. pkg-config).

Build and run GTK 4 applications with Visual Studio

OpenGL on DirectX: Conformance & upstreaming of the D3D12 driver

March 10, 2021 by Erik Faye-Lund  |   News & Events

One year ago, we announced a new partnership with Microsoft to build OpenGL mapping layers to DirectX 12. Today, we're excited to share that the we have passed the OpenGL 3.3 conformance tests, and have now upstreamed the D3D12 driver in Mesa 3D!

OpenGL on DirectX: Conformance & upstreaming of the D3D12 driver

New features, changes & improvements to KernelCI's UI

March 04, 2021 by Alexandra Pereira  |   Blog

The most complete automated testing and continuous integration tool for the Linux kernel continues to evolve at a rapid pace. Here's a look at the latest improvements to the KernelCI dashboard, the main web interface used by the project.

New features, changes & improvements to KernelCI's UI

Asymmetric Multi Processing with Linux & Zephyr on the STM32MP1

March 03, 2021 by Arnaud Ferraris  |   Blog

In the embedded world, many modern SoCs such as the ST Microelectronics STM32MP1 now include coprocessor cores which can be used for a wide range of tasks and can offload some of the work from the main processor.

Asymmetric Multi Processing with Linux & Zephyr on the STM32MP1

Wine on Wayland: An exciting first update

February 19, 2021 by Alexandros Frantzis  |   News & Events

Two months ago we announced a first proposal for a Wayland driver for Wine, the compatibility layer for Windows applications. Here's an update on this effort, which contains more details and instructions for building and running the Wayland driver.

Wine on Wayland: An exciting first update

New year, new kernel: Collabora's contributions to Linux 5.11

February 17, 2021 by Ezequiel Garcia  |   News & Events

The first kernel release of 2021 brings a number of highlights contributed by Collaborans, including the new Syscall User Dispatch mechanism, and the destaging of both the H.264 stateless decoding interface and the Rockchip ISP driver.

New year, new kernel: Collabora's contributions to Linux 5.11

Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 363 [type] => document [contentType] => text/html [pagetitle] => Making Viewer UIs for Pitivi [longtitle] => [description] => [alias] => making-viewer-uis-for-pitivi [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Being someone who has already experimented with two transformation box approaches for Pitivi in the past, maintainers thought I might be the right person to do a modern one. Creating a user interface for a video transformation requires three things: the implementation of the transformation, a way to draw the widgets over the viewer, and mapping the input to the reverse transformation. [content] => <p>Being someone who has already experimented with two transformation box approaches for Pitivi in the past, maintainers thought I might be the right person to do a modern one.</p> <p>Creating a user interface for a video transformation requires three things:</p> <ul> <li style="font-weight: 400;">The implementation of the transformation</li> <li style="font-weight: 400;">A way to draw the widgets over the viewer and</li> <li style="font-weight: 400;">Mapping the input to the reverse transformation</li> </ul> <h3>The transformation</h3> <p>First of all the implementation of the transformation, which is in our case scaling and translation, is currently done by GES.UriSource, calculated on the CPU. In the first Pitivi transformation box I did in GSoC 2012 this was done by the notorious Frei0r plugins from GStreamer Plugins Bad, which is also a CPU implementation. In the second version this was done on the GPU with the gltransformation element I wrote for GSoC 2014.</p> <h3>A method to draw widgets over the viewer</h3> <p>In Pitivi&rsquo;s case, the viewer is a GStreamer sink. In all three versions rendering of the overlay widgets was done by Cairo, but it was done differently for all three implementations, since they all used different sinks.</p> <h4>2012</h4> <p>The first one used a hacky solution where the sink and cairo drew in the same Gtk drawing area, acquired for GStreamer with the Gst Overlay API. Many Gtk and GStreamer devs wondered how this worked at all. This and Pitivi switching to more modern sinks was the reason why the first version of the box didn&rsquo;t stay upstream for long.</p> <p><a href="https://lubosz.files.wordpress.com/2016/08/lubosz-the-magician.png"><br /> </a><a class="fix-link-focus" href="https://lubosz.files.wordpress.com/2016/08/lubosz-the-magician.png"><img class="alignnone size-large wp-image-888" src="https://lubosz.files.wordpress.com/2016/08/lubosz-the-magician.png?w=700&amp;h=438" alt="lubosz-the-magician" width="700" height="438" /></a></p> <h4>2014</h4> <p>Still using Gst Overlay API, but this time with the glimagesink. The cairo widgets are rendered into OpenGL textures and composed in the glimagesink draw callback in the GStreamer GL context. Worked pretty smooth for me, but didn&rsquo;t provide a fallback solution for users without GL. Clearly an approach for the future, but how about something solid?</p> <p><a class="fix-link-focus" href="https://lubosz.files.wordpress.com/2016/08/screenshot-from-2016-09-26-16-04-40.png"><img class="alignnone size-large wp-image-889" src="https://lubosz.files.wordpress.com/2016/08/screenshot-from-2016-09-26-16-04-40.png?w=700&amp;h=420" alt="screenshot-from-2016-09-26-16-04-40" width="700" height="420" /></a></p> <h4>2016</h4> <p>Now we have the almighty GtkSink in Pitivi. It is a Gtk widget and overlays can be added via Gtk Overlay. The sink is also exchangeable with GtkGLSink, which uses a GStreamer GL context to display the video texture and also can use GStreamer GL plugins like gltransformation without needing to download the GPU memory with gldownload. Cairo rendering now can be easily added over GStreamer sinks, yay.</p> <p><a class="fix-link-focus" href="https://lubosz.files.wordpress.com/2016/09/screenshot-from-2016-09-26-16-03-27.png"><img class="alignnone size-large wp-image-892" src="https://lubosz.files.wordpress.com/2016/09/screenshot-from-2016-09-26-16-03-27.png?w=700&amp;h=438" alt="screenshot-from-2016-09-26-16-03-27" width="700" height="438" /></a><br /><br /></p> <h3>Linking the UI with the components doing the transformation</h3> <p>The mapping of the input from the UI to the transformation is clearly dependent on the transformation you are using. In the 2012 version I needed to map the input to frei0r^-1. In 2014 I used an OpenGL Model-View-Projection matrix calculated in Graphene, which could also do rotations and 3D transformations (we have a z-axis, yay).</p> <p>The 2016 implementation uses the inverse transformation for the GES.UriSource transformation, which is done by the GStreamer elements videomixer and videoscale. Of course things like keeping aspect ratio, maintaining limits and transforming Gtk widget coordinates to the transformation&rsquo;s coordinates are part of this 3rd ingredient.</p> <h3>Extensibility</h3> <p>The new transformation box fits great with Pitivi by making clips selectable from the viewer, so you can manage multiple overlapping clips quite easily. But the best part of this implementation may be its extensibility. I already made two overlay classes, one for the normal clips which uses a GES.UriSource transformation and one for title clips aka GES.TextSource, which is using different coordinates and different GStreamer plugins. In this fashion other plugins can be written for the Pitivi viewer, for example for 3D transformations with gltransformation. Or you could do crazy stuff like a UI for barrel distortion etc.</p> <p>Clone the code and <a href="https://github.com/pitivi/pitivi/blob/master/docs/HACKING.md" target="_blank">contribute</a>!</p> <p>If you have any questions about this ask me. I&rsquo;m lubosz on Freenode IRC.<br /><br /></p> <p style="text-align: center;"><a href="https://lubosz.wordpress.com/2016/09/26/making-viewer-uis-for-pitivi/" target="_blank">Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 61 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1476368937 [editedby] => 11 [editedon] => 1531506026 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1476356580 [publishedby] => 11 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/10/13/making-viewer-uis-for-pitivi/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Lubosz Sarnecki [NewsAndBlogArticle_isFeatured] => No [idx] => 181 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 360 [type] => document [contentType] => text/html [pagetitle] => Web Engines Hackfest 2016 [longtitle] => [description] => [alias] => web-engines-hackfest-2016 [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => I had a great time last week and the Web Engines Hackfest! It was the 7th web hackfest hosted by Igalia and the 7th hackfest I attended. I’m almost a local Galician already. Brazilian Portuguese being so close to Galician certainly helps! Collabora co-sponsored the event and it was great that two colleagues of mine managed to join me in attendance. [content] => <p>I had a great time last week and the <a title="Web Engines Hackfest" href="http://www.webengineshackfest.org/" target="_blank">Web Engines Hackfest</a>! It was the 7th web hackfest hosted by Igalia and the 7th hackfest I attended. I&rsquo;m almost a local Galician already. Brazilian Portuguese being so close to Galician certainly helps! Collabora co-sponsored the event and it was great that two colleagues of mine managed to join me in attendance.</p> <div class="entry-content"> <p>It had great talks that will eventually end up in videos uploaded to the web site. We were amazed at&nbsp;the progress being made to Servo, including some performance results that blew our minds. We also discussed the next steps for WebKitGTK+, WebKit for Wayland (or WPE), our own Clutter wrapper to WebKitGTK+ which is used for the <a title="Apertis project wiki" href="https://wiki.apertis.org/Main_Page" target="_blank">Apertis</a> project, and much more.</p> <figure id="attachment_391" class="wp-caption alignright" style="width: 660px;"><a href="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_103753.jpg"><img class="size-large wp-image-391" src="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_103753-1024x576.jpg" alt="Zan giving his talk on WPE (former WebKitForWayland)" width="660" height="371" /></a><figcaption class="wp-caption-text">Zan giving his talk on WPE (former WebKitForWayland)</figcaption></figure> <p><br />One thing that drew my attention was how many Dell laptops there were. Many collaborans (myself included) and igalians are now using Dells, it seems. Sure, there were thinkpads and macbooks, but there was plenty of inspirons and xpses as well. It&rsquo;s interesting how the brand make up shifted over the years since 2009, when the hackfest could easily be mistaken with a thinkpad shop.</p> <p>Back to the actual hackfest:&nbsp;with the recent release of Gnome 3.22 (and Fedora 25 nearing release), my main focus was on dealing with some regressions suffered by users experienced after a change that made putting the final rendering composited by the nested Wayland compositor we have inside WebKitGTK+ to the GTK+ widget so it is shown on the screen.</p> <p>One of the main problems people reported was applications that use WebKitGTK+ <a title="Bug 1378987 - Epiphany 3.22 fails to render pages" href="https://bugzilla.redhat.com/show_bug.cgi?id=1378987" target="_blank">not showing anything</a> where the content was supposed to appear. It turns out the problem was caused by GTK+ not being able to create a GL context. If the system was simply not able to use GL&nbsp;there would be no problem: WebKit would then just disable accelerated compositing and things would work, albeit slower.</p> <p>The&nbsp;problem was WebKit being able to use an older GL version than the minimum required by GTK+. We fixed it by testing that GTK+ is able to create GL contexts before using the fast path, falling back to the slow glReadPixels codepath if not. This way we keep accelerated compositing working inside WebKit, which gives us nice 3D transforms and less repainting, but take the performance hit in the final &ldquo;blit&rdquo;.</p> <figure id="attachment_392" class="wp-caption alignright" style="width: 660px;"><a href="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_151644.jpg"><img class="size-large wp-image-392" src="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_151644-1024x576.jpg" alt="Introducing &quot;WebKitClutterGTK+&quot;" width="660" height="371" /></a><figcaption class="wp-caption-text">Introducing &ldquo;WebKitClutterGTK+&rdquo;</figcaption></figure> <p><br />Another issue we hit was GTK+ not properly updating its knowledge of the window&rsquo;s opaque region when painting a frame with GL, which led to some really interesting issues like <a title="Bug 771553 - Shrinking window generates a black patch when gl is used" href="https://bugzilla.gnome.org/show_bug.cgi?id=771553" target="_blank">a shadow appearing when you tried to shrink the window</a>. There was also an issue where the window would <a title="Bug 771944 - Fullscreen does not cover entire screen" href="https://bugzilla.gnome.org/show_bug.cgi?id=771944" target="_blank">not use all of the screen when fullscreen</a> which was likely related. Both were fixed.</p> <p>Andr&eacute; Magalh&atilde;es also worked on a couple of patches we wrote for customer projects and are now pushing upstream. One enables the use of <a title="Multiple web inspector frontends" href="https://bugs.webkit.org/show_bug.cgi?id=148902" target="_blank">more than one frontend to connect to a remote web inspector server at once</a>. This can be used to, for instance, show the regular web inspector on a browser window and also use IDE integration for setting breakpoints and so on.</p> <p>The other patch was cooked by Philip Withnall and helped us deal with some performance bottlenecks we were hitting. It improves <a title="Improve performance of painting scrollbars" href="https://bugs.webkit.org/show_bug.cgi?id=162673" target="_blank">the performance of painting scroll bars</a>.&nbsp;WebKitGTK+ does its own painting of scrollbars (we do not use the GTK+ widgets for various reasons). It turns out painting scrollbars can be quite a hit when the page is being scrolled fast,&nbsp;if&nbsp;not done efficiently.</p> <p>Emanuele Aina had a great time learning more about meson to figure out a build issue we had when a more recent GStreamer was added to our jhbuild environment. He came out of the experience rather sane, which makes me think meson might indeed be much better than autotools.</p> <figure id="attachment_389" class="wp-caption alignright" style="width: 660px;"><a href="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_152130.jpg"><img class="size-large wp-image-389" src="https://blog.kov.eti.br/wp-content/uploads/2016/10/20160928_152130-1024x576.jpg" alt="Igalia 15 years cake" width="660" height="371" /></a><figcaption class="wp-caption-text">Igalia 15 years cake</figcaption></figure> <p><br />It was a great hackfest, great seeing everyone face to face. We were happy to celebrate Igalia&rsquo;s 15 years with them. Hope to see everyone again next year =)<br /><br /></p> </div> <p style="text-align: center;"><a href="https://blog.kov.eti.br/2016/10/web-engines-hackfest-2016/" target="_blank">Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 60 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1475767371 [editedby] => 11 [editedon] => 1531505626 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1475753340 [publishedby] => 11 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/10/06/web-engines-hackfest-2016/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Gustavo Noronha [NewsAndBlogArticle_isFeatured] => No [idx] => 182 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 359 [type] => document [contentType] => text/html [pagetitle] => Collabora contributions to Linux Kernel 4.8 [longtitle] => [description] => [alias] => collabora-contributions-to-linux-kernel-4.8 [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Linux Kernel 4.8 is out and once more Collabora engineers did a significant contribution to the Kernel. For this latest release, Collabora provided 101 patches from 8 engineers, our biggest contribution to date in single kernel release! [content] => <div class="entry-content"> <p>Linux Kernel 4.8 is <a href="https://lwn.net/Articles/702411/" target="_blank">out</a> and once more Collabora engineers did a significant contribution to the Kernel. For this latest release, Collabora provided 101 patches from 8 engineers, our biggest contribution to date for a single kernel release! We&rsquo;ve also seen the first contribution from Frederic Dalleau since he joined Collabora. LWN.net covered the new features of the new kernel in three different posts, <a href="https://lwn.net/Articles/695294/" target="_blank">here</a>, <a href="https://lwn.net/Articles/696073/" target="_blank">here</a> and <a href="https://lwn.net/Articles/696720/" target="_blank">here</a>.</p> <p>On the Collabora side of the contributions we touched a few different areas in the kernel. Bob Ham, who recently left Collabora, added support for the Alea I Random Number Generator, while Enric Balletbo improved the audio support on the Rockchip rk3288 SoC. Frederic Dalleau fixed an important memory leak on the Bluetooth stack.</p> <p>Gustavo Padovan continued his work add Explicit Synchronization for Buffer Sharing on the kernel. In this release he added fence_array support and prepared the SW_SYNC interfaces for de-staging, SW_SYNC meant to be used for Explict Syncronization testing. He also worked in removing some of the legacy functions from drm_irq.c from the kernel.</p> <p>Helen Koike added some improvements and clean ups to the ASoC subsystem mainly on the max9877 and tpa6130a2 drivers. Nicolas Dufresne fixed the bytes per line calculation on YUV planes on the uvcvideo driver.</p> <p>Thierry Escande added many improvements the NFC digital layer and Tomeu Vizoso added a new helper for the ChromeOS Embedded Controller and improved usage of DRM Core APIs on the Rockchip driver. He also fixed an issue with the Analogix DP on Rockchip that was not enabling clocks in the correct order.</p> <p>Bob Ham (2):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d3ede2dba3d800912523838a6db35d562e042101">hwrng: chaoskey &ndash; Add support for Araneus Alea I USB RNG</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e4a886e811cd07dd5c6f389eae4d35870ec2a483">hwrng: chaoskey &ndash; Fix URB warning due to timeout on Alea</a></li> </ul> <p>Enric Balletbo i Serra (8):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6c42db30d8c808d1d04a8178a29e085b8b5eb475">ARM: dts: rockchip: Add shared file for audio on rk3288-veyron boards</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=7dbc2b97ba8aac7168c39a7f9148110f6eaa5053">ARM: dts: rockchip: Enable analog audio on rk3288-veyron chromebooks</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5f22449344d9db35bcaf19c8e1bb4062188aeb09">ASoC: rockchip-max98090: Fix NULL pointer dereference while accessing to jack.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ec0d23b295b901cdfd60e9b8a65ce208acf53067">ASoC: rockchip-max98090: Fix the Headset Mic route.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9211009306826637942c6be0fd64198aaddfd32d">ASoC: rockchip-max98090: Fix jack detection and event reporting.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f03a881a8a8de26b09949b89d6a7177afbc5754d">ARM: dts: am335x-bone-common: use stdout-path in Beaglebone boards.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=0ac4aeb5185fda7c9dd42964ce3d9c368bb81d41">ASoC: max9867: Fix unix permissions for source files.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=22daf7a71683185db6bcb089e006be5f99dddf9c">watchdog: ziirave_wdt: Correct I2C device id to fix module autoloading.</a></li> </ul> <p>Frederic Dalleau (1):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9afee94939e3eda4c8bf239f7727cb56e158c976">Bluetooth: Fix memory leak at end of hci requests</a></li> </ul> <p>Gustavo Padovan (50):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b3dfbdf261e076a997f812323edfdba84ba80256">dma-buf/fence: add fence_array fences v6</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1b47aaf9a93a69a61f8cc5219fd9c758b8588a59">drm/fence: add fence to drm_pending_event</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=041916a770155c84cb29de3601e626a7ac7a3219">dma-buf/sync_file: fix build warning with context format type</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dd54b806ddb72270485ebc94c560d7434a39b750">drm/armada: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=817673172384887780efb89f3f00ed22c5c1a0d6">drm/atmel: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8a6052222299b61a2b2b3d7c31699769195b49a5">drm/qxl: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=06413e4b29d04cdfdeffeead7a07be3f2ad16746">drm/udl: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a288c1ea8e7745202d96a74c17dce4cf69b7677f">drm/virtio: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=60629c4d192f12028a47f6eb019fe21795e46424">drm/amdgpu: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=accbaf6ec8751e94c39c73051b8ab8737571dca4">drm/armada: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=23a25ed3cab03ab4e16e7a17769af8667704bfe8">drm/atmel: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=078ace6f4afc4e98a9c029366f04a68fcf1f8168">drm/qxl: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a782bca5e52ef112246387cee071364dc0e5a344">drm/radeon: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=097f0ab43c98e9b64435cf6879ff465087d36f63">drm/shmobile: use drm_crtc_vblank_{get,put}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ddac4b5a6c08f8800002517ea5352b3eb9451cfc">Documentation: add fence-array to kernel DocBook</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dc4ff116930087c288b253574d016452a39902af">drm/nouveau: replace legacy vblank helpers</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=db749b7e3dabddab26717b5735e73482c3cfccff">drm: remove legacy drm_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=93507d135bbfae34a626d0625aaae30536b84140">drm: remove legacy drm_arm_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ceb74152c46911e85f0f390e715032815694e5e7">drm: make drm_vblank_{get,put}() static</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9a7841e9861dce4eeee0bcba52ab90618135be5d">drm/amdgpu: use drm_crtc_vblank_{on,off}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5c9ac115de55ab02cd07c76a7923009e18cb2826">drm/radeon: use drm_crtc_vblank_{on,off}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=27377a1ce7ddeb4f4a55b726e99be99075725387">drm/amdgpu: use crtc directly in drm_crtc_vblank_put()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=890938b59d236cfad4b0b2c4f868098d9fcd174b">drm/radeon: use crtc directly in drm_crtc_vblank_put()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c02726ffea2df09acc46adb049a7fb4ea10f0e05">drm/gma500: use drm_crtc_vblank_{on,off}()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=63bb0bc1b19d125c052e3b199421a0ca4d67e021">staging/android: store last signaled value on sync timeline</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5c1401f83a16b7ee3762c9044ab56ed3f3cdcdcd">staging/android: remove .{fence, timeline}_value_str() from timeline_ops</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ef30afefeaf624c483e56c63e60e0dda8c42a0ef">staging/android: remove struct sync_timeline_ops</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dcc280803e8a803643b6d12b2f35df608623c7fd">staging/android: remove sw_sync_timeline and sw_sync_pt</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d21858fdb3269e98aa62d522efec7ce2865368e6">staging/android: remove sw_sync.[ch] files</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4be6e00cd34210d5b3d37ddb7bf46137cf5a99b1">staging/android: rename android_fence to timeline_fence</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=724812d6a66e3a1524f7eb78b900bc0624b6d7dc">staging/android: remove unnecessary check for fence</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=62627c8f61e09a6204cd77de30df9a83ff158812">staging/android: remove size arg of sync_timeline_create()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=0431b9065f28ecf6c320fefebe0241620049984f">staging/android: bring struct sync_pt back</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1867a23b13b25d0a228b0509ade20fb977dcb601">staging/android: move sw_sync related code to sw_sync.c</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d79892ad0b97ec23645cffa5406edb4eb18cb553">staging/android: clean up #includes in the sync framework</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=aff9da10e218c54f5ffc8bcb66c9837135074190">staging/android: make sync_timeline internal to sw_sync</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6f65aa8925f7a908eb4d08339c03c40a300ac461">staging/android: make sw_ioctl info internal to sw_sync.c</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=342952d3a5c4d128649c7fd8e34d7d5eb6d036aa">staging/android: remove &lsquo;destroyed&rsquo; member from struct sync_timeline</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=711102325302d793aa0eee493be79ce9c32ae426">staging/android: remove sync_timeline_destroy()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b9bc2b7b658a4bee8884e2c339a0a27f4bfa7f22">staging/android: remove drv_name from sync_timeline</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1fe82e2e148697fd1fbbb2944e143b182c51e227">staging/android: rename sync.h to sync_debug.h</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b1f656044a9936880d5a7460cd8784b2e124ab87">staging/android: add DEBUG_FS dependence on Kconfig</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6e5f73fcadb66188f6c5e43ae58d34b2ced524c0">drm: make drm_vblank_count_and_time() static</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=0ac28c57c9299f0761d304f7bd4a3518a42b2146">drm/armada: use drm_crtc_handle_vblank()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=548ebe1e77dcb314565eee9646e2be816e3d74cf">drm/atmel: use drm_crtc_handle_vblank()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d297b0204321303306d9f4b099e83f05bfeff1c9">drm/nouveau: use drm_crtc_handle_vblank()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c12758ce399e6062db779ab35466b3679e8ca681">drm/rcar-du: use drm_crtc_handle_vblank()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=099ede834beb283d8c3bcd3f75b14e8b98da7216">drm/tilcdc: use drm_crtc_handle_vblank()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c483e06506b8614220ed036319fc4c7af787f602">MAINTAINERS: add entry for the Sync File Framework</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=31954660a7a613cd01e6ab1e90e7fea6ca6ffc74">dma-buf/sync_file: improve Kconfig description for Sync Files</a></li> </ul> <p>Helen Koike (8):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d27d5f1a4d00808cb8751ddb972a40f952576fd8">[media] stk1160: Check *nplanes in queue_setup</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=aecf4e9bafa586bcc11d00e831ca1ddd00f6c6a7">ASoC: max9877: Remove unused function declaration</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49220e9b454e60774c4e65a2c7ad624fb22c9180">ASoC: max9877: Remove unused function declaration</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=cb7e62256e99d285e415cf75db67558f0f8bb107">ASoC: tpa6130a2: Register component</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a0d5ff4496dca6e435ae3adb286d6583cf785aca">ASoC: tap6130a2: Use regmap</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e01d700c399d8d899850a1e5fad5227a9d976304">ASoC: tpa6130a2: Use snd soc volsw functions</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6d2de5ab4328718302c54b20222c6b1a574c3fce">ASoC: tpa6130a2: Add DAPM support</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=39088c251c69d3b7b288e30228aed06e1d339da5">ASoC: tpa6130a2: Remove goto err_gpio</a></li> </ul> <p>Nicolas Dufresne (1):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f222467a2c51a46f51516975f9b096f903c26ce4">[media] uvcvideo: Fix bytesperline calculation for planar YUV</a></li> </ul> <p>Thierry Escande (26):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a81ba50a89930a96e34862cf236b4f4461e741ae">NFC: port100: Explicitly set NFC-F framing for NFC-DEP</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=7854a44526de84142e367f08288c9f3a33c4c8ee">NFC: digital: Add a delay between poll cycles</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=806bfe31c96f77e917eac476ba87164f7bbd1366">NFC: llcp: Use dynamic debug for hex dump</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=204bddcb508fe3bca5c97a9f528bafd7ba8fcec8">NFC: nfcsim: Make use of the Digital layer</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=de9e5aeb4f40e72fa3bb087d378c9bd4ecf65c7f">NFC: llcp: Fix usage of llcp_add_tlv()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=256f3ee3d1468660ca3b10ad3beab7e8f6cbd969">NFC: llcp: Fix 2 memory leaks</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e3e0258839a01f793a8a0c0885e8ad387681cdc6">NFC: port100: Don&rsquo;t send a new command if one is still pending</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b74584c1a6d68110d135a6ce0336aab0055f4341">NFC: port100: Fix the command cancellation process</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a52bd7d2753b0567c71d604c640e9c4a86221756">NFC: port100: Make port100_abort_cmd() synchronous</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9f0c4542c49cbd041f2b6943b16644af0a3ff48f">NFC: port100: Abort current command before switching RF off</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8f49bec6c36c73f0c212e07229b19fb4bba85788">NFC: nfcsim: Fix missing dependency on NFC_DIGITAL</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b77693447db987e77a39afaa8774e8702cb110d5">NFC: digital: Fix a memory leak in NFC-F listening mode</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3f89fea35fc37b326d6b3697fcc9cba235a60811">NFC: digital: Rework error handling in DEP_RES response</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=82e57952869fbbdf09d8f9e7ac284df13741e93d">NFC: digital: Call pending command callbacks at device unregister</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=af66df0f53b9120437556d8eb00d70a36e791258">NFC: digital: Set the command pending flag</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3cc952dbf1a7176b9247da4cd2612c9ddc1d1b51">NFC: digital: Abort last command when dep link goes down</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1d984c2e03c1fb21539a9f50627e312788512013">NFC: digital: Fix handling of saved PDU sk_buff pointers</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e8e7f4217564fc115b60a9373646afb193aa08cf">NFC: digital: Remove useless call to skb_reserve()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f23a9868b1c45e77ec6082eb95508885111ffda1">NFC: digital: Fix target DEP_REQ I-PDU handling after ATN PDU</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=482333b277de181ce80c833d84f2598e2527b267">NFC: digital: Fix ACK &amp; NACK PDUs handling in target mode</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e073eb6797191abe2fe30ca643ab0cc3d8e1e534">NFC: digital: Rework ACK PDU handling in initiator mode</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e200f008ace69eebac0a1432dc9e24ab5cd0d029">NFC: digital: Free supervisor PDUs</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1a09c56f545c8ff8d338a38c7c40d79f4165a94c">NFC: digital: Add support for NFC DEP Response Waiting Time</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d85a301c26621d3466956dc477c32c20c15a52ee">NFC: digital: Fix RTOX supervisor PDU handling</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f9ac6273e5b8fa45e7cd2086e1bbc91af9af7f19">NFC: nfcsim: Add support for sysfs control entry</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2a0fe4fe5bf2a6e2277354e7e8f369a20d881891">NFC: nfcsim: Simulate lost frames through debugfs entry</a></li> </ul> <p>Tomeu Vizoso (5):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=f706974a69b6e2be8f69fb4dc89158a6297338f9">drm/rockchip: Drop drm_driver.load/unload callbacks</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5a5873830972e7d8983dd205b3686f728047d556">drm/rockchip: Use atomic PM helpers</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=fe64ba5c6323538ef0a74c7213fe5e18117b1c85">drm/rockchip: Resume DP early</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c200c39b2d3906dfd5c7d6b3918befda5b5d7ea2">clk: clk-conf: Fix error message when clock isn&rsquo;t found</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9798ac6d32c1a32d6d92d853ff507d2d39c4300c">mfd: cros_ec: Add cros_ec_cmd_xfer_status() helper</a></li> </ul> </div> <p style="text-align: center;">&nbsp;</p> <p style="text-align: center;"><a href="http://padovan.org/blog/2016/10/collabora-contributions-to-linux-kernel-4-8/" target="_blank">Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 59 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1475506302 [editedby] => 11 [editedon] => 1531505635 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1475492820 [publishedby] => 11 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/10/03/collabora-contributions-to-linux-kernel-4.8/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Gustavo Padovan [NewsAndBlogArticle_isFeatured] => No [idx] => 183 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 354 [type] => document [contentType] => text/html [pagetitle] => WebKitGTK+ 2.14 and the Web Engines Hackfest [longtitle] => [description] => [alias] => webkitgtk-2.14-and-the-web-engines-hackfest [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Next week our friends at Igalia will be hosting this year’s Web Engines Hackfest. Collabora will be there! We are gold sponsors, and have three developers attending. It will also be an opportunity to celebrate Igalia’s 15th birthday. Looking forward to meet you there! [content] => <div class="entry-content"> <div class="entry-content"> <p>Next week our friends at <a title="Igalia" href="http://igalia.com/" target="_blank">Igalia</a> will be hosting this year&rsquo;s <a title="Web Engines Hackfest" href="http://www.webengineshackfest.org/" target="_blank">Web Engines Hackfest</a>. Collabora will be there! We are <a title="Web Engines Hackfest Sponsors" href="http://www.webengineshackfest.org/#sponsors" target="_blank">gold sponsors</a>, and&nbsp;have three developers attending. It will also be an opportunity to celebrate Igalia&rsquo;s 15th birthday \o/. Looking forward to meet you there! =)</p> <p><a title="WebKitGTK+ 2.14" href="https://blogs.igalia.com/carlosgc/2016/09/20/webkitgtk-2-14/" target="_blank">Carlos Garcia has recently released WebKitGTK+ 2.14</a>, the latest stable release. This is a great release that brings a lot of improvements and works much better on Wayland, which is becoming mature enough to be used by default. In particular, it fixes the clipboard, which was one of the main missing features, thanks to Carlos Garnacho!&nbsp;We have also been able to contribute a bit to this release =)</p> <p>One of the biggest changes this cycle is the threaded compositor, which was implemented by Igalia&rsquo;s Gwang Yoon Hwang. This work improves performance by not stalling other web engine features while compositing. Earlier this year we&nbsp;contributed fixes to make the threaded compositor work with the web inspector and fixed elements, helping with the goal of enabling it by default for this release.</p> <p>Wayland was also lacking an accelerated compositing implementation. There was a patch to add a nested Wayland compositor to the UIProcess, with the WebProcesses connecting&nbsp;to it as Wayland clients to share&nbsp;the final rendering so that it can be shown to screen. It was not ready though and there were questions as to whether that was the way to go and alternative proposals were floating around on how to best implement it.</p> <p>At last year&rsquo;s hackfest we had discussions about what the best path for that would be where collaborans Emanuele Aina and Daniel Stone (proxied by Emanuele) <a title="webkit-gtk mailing list discussion" href="https://lists.webkit.org/pipermail/webkit-gtk/2015-December/002465.html" target="_blank">contributed quite a bit</a> on figuring out how to implement it in a way that was both efficient and platform agnostic.</p> <p>We later picked up the old patchset, rebased on the then-current master and <a title="wayland-ac branch of the WebKitGTK+ engine with Clutter integration" href="https://git.apertis.org/cgit/webkit-gtk-clutter.git/log/?h=wayland-ac" target="_blank">made it run efficiently</a> as proof of concept for the <a title="Apertis" href="http://www.apertis.org/" target="_blank">Apertis</a>&nbsp;project on an i.MX6 board. This was done using the fancy GL support that landed in GTK+ in the meantime, with some API additions and shortcuts to sidestep performance issues. The work was sponsored by <a title="Roberto Bosch Car Multimedia" href="http://www.bosch.com/en/com/bosch_group/business_sectors_divisions/automotive_technology/car_multimedia/car-multimedia.html" target="_blank">Robert Bosch Car Multimedia</a>.</p> <p><iframe src="https://www.youtube.com/embed/j664ERyjWNQ?feature=oembed" width="100%" height="371" frameborder="0"></iframe></p> <p>Igalia managed to improve&nbsp;and land a very well designed patch that implements the nested compositor, though it was still not as efficient as it could be, as it was using glReadPixels to get the final rendering of the page to the GTK+ widget through cairo. I have improved that code by <a title="Changeset 206045" href="https://trac.webkit.org/changeset/206045" target="_blank">ensuring we do not waste memory when using HiDPI</a>.</p> <p>As part of our proof of concept investigation, we got this <a title="Car visualizer" href="http://carvisualizer.plus360degrees.com/threejs/" target="_blank">WebGL car visualizer</a>&nbsp;running quite well on our sabrelite imx6 boards. Some of it went into the upstream patches or proposals mentioned below, but we have a bunch of potential improvements still in store that we hope to turn into upstreamable patches and advance during next week&rsquo;s hackfest.</p> <p>One of the improvements that already landed was an alternate code path that leverages GTK+&rsquo;s recent GL super powers to <a title="Changeset 206080" href="https://trac.webkit.org/changeset/206080" target="_blank">render using gdk_cairo_draw_from_gl()</a>, avoiding the expensive copying of pixels from the GPU to the CPU and making it go faster. That improvement exposed a <a title="Bug 771553 - Shrinking window generates a black patch when gl is used" href="https://bugzilla.gnome.org/show_bug.cgi?id=771553" target="_blank">weird bug in GTK+</a> that causes a black patch to appear when shrinking the window, which I have a tentative fix for.</p> <p>We originally <a title="Bug 769739 - Add a more efficient way to draw EGLImages, gdk_cairo_draw_from_egl_image()" href="https://bugzilla.gnome.org/show_bug.cgi?id=769739" target="_blank">proposed to add a new gdk_cairo_draw_from_egl()</a> to use an EGLImage instead of a GL texture or renderbuffer. On our proof of concept we noticed it is even more efficient than the texturing currently used by GTK+, and could give us even better performance for WebKitGTK+. Emanuele Bassi thinks it might be better to add EGLImage as another code branch inside from_gl() though, so we will look into that.</p> <p>Another very interesting igalian addition to this release is support for the MemoryPressureHandler even on systems with no cgroups set up. The memory pressure handler is a WebKit feature which flushes caches and frees resources that are not being used when the operating system notifies it memory is scarce.</p> <p>We worked with the Raspberry Pi Foundation to add support for that feature to the <a title="WEB BROWSER BETA" href="https://www.raspberrypi.org/blog/web-browser-beta/" target="_blank">Raspberry Pi browser</a> and contributed it upstream back in 2014, when Collabora was trying to squeeze as much as possible from the hardware. We had to add a cgroups setup to wrap Epiphany in, back then, so that it would actually benefit from the feature.</p> <p>With this improvement,&nbsp;it will benefit even without the custom cgroups setups as well, by having the UIProcess monitor memory usage and notify each WebProcess when memory is tight.</p> <p>Some of these improvements were achieved by developers getting together at the Web Engines Hackfest last year and laying out the ground work or ideas that ended up in the code base. I look forward to another great few days of hackfest next week! See you there o/<br /><br /></p> </div> </div> <p style="text-align: center;"><a href="https://blog.kov.eti.br/2016/09/webkitgtk-2-14-and-the-web-engines-hackfest/" target="_blank">Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 57 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1474660863 [editedby] => 11 [editedon] => 1531505672 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1474556460 [publishedby] => 11 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/09/22/webkitgtk-2.14-and-the-web-engines-hackfest/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Gustavo Noronha [NewsAndBlogArticle_isFeatured] => No [idx] => 184 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 356 [type] => document [contentType] => text/html [pagetitle] => Mainline Explicit Fencing - Part 1 [longtitle] => [description] => [alias] => mainline-explicit-fencing-part-1 [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => When it comes to buffer sharing synchronization in the kernel there are two ways of doing it: Implicit Fencing and Explicit Fencing. The difference between them relies on the fact that the kernel may or may not share synchronization information with userspace, it will either be implicit, with no fencing information provided, or explicit with all information available to userspace. [content] => <div class="entry-content"> <p>When it comes to buffer sharing synchronization in the kernel there are two ways of doing it: <strong>Implicit Fencing</strong> and <strong>Explicit Fencing</strong>. The difference between them relies on the fact that the kernel may or may not share synchronization information with userspace, it will either be implicit, with no fencing information provided, or explicit with all information available to userspace.</p> <p>The fencing synchronization mechanism allows the sharing of buffers without the risk of a driver or userspace to read an incomplete buffer or write to a buffer that is still under use somewhere else in the system. The fencing provides ordering to these operations to make reads or writes happen only when the buffer is not used by other drivers anymore. For example,when a GPU job is queued a fence is associated to the buffer in the job, that fence can be used by other drivers for synchronization purposes, they won&rsquo;t use the buffer a signal from the fence is received. The signal means the buffers is now free to be used. Similarly we can have the same setting for the GPU driver to wait the buffer to come out of the screen to render on it again.</p> <p>The central piece here is the <strong>fence, </strong>an element that is attached to each buffer whenever a request involving the buffer is sent to the kernel. The fence can be used by userspace or other drivers to wait for the work to finish. So once the work is finished the fence signals and the waiter can proceed and do whatever they want with the buffer.</p> <p>While <strong>Implicit Fencing</strong> &nbsp;helps a lot with buffer synchronization there are a few cases where the whole desktop compositing could stall. Imagine the following compositor flow: there are 3 buffers to process, A, B and C. A and B are sent for rendering in parallel while C is going to be composed of both A and B. But the compositor will only be notified when both buffers are rendered thus if B takes too long the compositing of the whole desktop will be blocked waiting for B and C won&rsquo;t be displayed in time.<br />&nbsp;</p> <table class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td style="text-align: center;"><a style="margin-left: auto; margin-right: auto;"><img src="http://padovan.org/blog/wp-content/uploads/2016/09/compositor.png" alt="" width="277" height="183" border="0" /></a></td> </tr> <tr> <td class="tr-caption" style="text-align: center;">Figure 1. A compositor processing two buffers in parallel, with Implicit Fencing if B takes too long the desktop compositor freezes.</td> </tr> </tbody> </table> <p><br />However with <strong>Explicit Fencing</strong> the compositor should have one fence for each buffer and will be notified when each buffer is rendered. So if A renders fast and B takes too long the compositor can decide not wait for B and proceed with the scanout of C with buffer A but an old version of B. The fencing information allows the compositor to be smart and take decisions to avoid the screen to freeze for example.</p> <p>As of today the Linux Kernel only has generic APIs for Implicit Fencing, although some drivers have Explicit Fencing already their APIs are device specific. Android currently has its own implementation through the Android Sync Framework &ndash; which will be explained in the next article.</p> <p><strong>Explicit Fencing</strong> works on a Consumer-Producer fashion. In an GPU rendering + scanout to the screen pipeline it would synchronize between the kernel drivers, so when submitting a new rendering job to the GPU(Producer side) userspace would get back a fence related to that buffer submitted. That means userspace doesn&rsquo;t need to block waiting for the job to complete, a signal is sent when the job is finished. As userspace doesn&rsquo;t need to block it and has a fence of the buffer it then can proceed right away with the syscall to ask the display hardware(Consumer) to scanout the buffer that is yet to be processed. With explicit fencing the kernel is taught to wait for the fence to signal, before starting the scanout process.</p> <p>A new fence is returned to userspace when the buffer is submitted to the kernel for scanout on the display hardware, that fence will signal when the buffer is not being displayed anymore, thus is ready for reuse by another rendering job. When the userspace gets this fence back it can submit a new rendering job to the GPU without waiting. The wait is done on the kernel side by the GPU driver, once the fence signals the rendering on that buffer can be initiated.<br />&nbsp;</p> <table class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td style="text-align: center;"><a style="margin-left: auto; margin-right: auto;"><img src="http://padovan.org/blog/wp-content/uploads/2016/09/fencing.png" alt="" width="354" height="380" border="0" /></a></td> </tr> <tr> <td class="tr-caption" style="text-align: center;">Figure 2. The fence travels all the way to userspace and the next element on the pipeline. The yellow arrows represents the fences on userspace.</td> </tr> </tbody> </table> <p>&nbsp;</p> <p>Last but not least, debugability of the graphics pipeline is improved. Having access to the fence in userspace helps a lot understanding what is happening in the pipeline. Previously, with Implicit Fencing there was no infomation available, so it was hard to figure out what was happening on the pipeline, also each vendor was trying to implement their own Implicit Fencing mechanism. Now with an standard Explicit Fencing mechanism it easier to build debug/tracing infrastructure that can be used to investigate issues in any system.</p> <p>The next article will explain the Android Sync Framework and later the work on mainline to support explicit fencing will be described.</p> <p><strong><a href="news-and-blog/blog/2016/10/18/mainline-explicit-fencing-part-2/">Continue reading (Mainline Explicit Fencing - Part 2)</a>&hellip;</strong></p> </div> [richtext] => 1 [template] => 15 [menuindex] => 58 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1474669630 [editedby] => 11 [editedon] => 1561403292 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1473805500 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/09/13/mainline-explicit-fencing-part-1/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;amp;amp;amp;amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Gustavo Padovan [NewsAndBlogArticle_isFeatured] => No [idx] => 185 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 341 [type] => document [contentType] => text/html [pagetitle] => Building Android for Qemu: A Step-by-Step Guide [longtitle] => [description] => [alias] => building-android-for-qemu-a-step-by-step-guide [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Developing Linux for Android on Qemu allows you to do some things that are not necessarily possible using the stock emulator. For my purposes I need access to a GPU and be able to modify the driver, which is where Virgilrenderer and Qemu comes in handy. [content] => <p><img title="Android running on Qemu" src="http://memcpy.io/images/2016-08-30_android_qemu.png" alt="Alt text" /></p> <p><em><strong>Note:</strong> This guide only applies to aosp version 6.x.x, and has never been tested with anything else. It is unlikely to work with aosp 7.x.x, and will definitely not work with &gt;8.x.x.</em></p> <p>Developing Linux for Android on Qemu allows you to do some things that are not necessarily possible using the stock emulator. For my purposes I need access to a GPU and be able to modify the driver, which is where Virgilrenderer and Qemu comes in handy.</p> <p>The guide below helps you compile Android and run it on top of Qemu with Mesa/Virgilrenderer supplying a virtual GPU. Because of this, the following guide is aimed at Linux hosts.</p> <p>This guide is based on Rob Herrings <a href="https://github.com/robherring/generic_device/wiki/KConfig-based-Multi-platform-Android-Device-%28and-Mesa-graphics%29" target="_blank" rel="noopener noreferrer">fantastic guide</a>, but has been slightly streamlined and had physical hardware support stripped out.</p> <h2>Install dependencies</h2> <p>These dependencies were available on Ubuntu 16.04, some alternative packages might be needed for other distributions.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>sudo apt install autoconf gcc-aarch64-linux-gnu libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev libcap-dev libcap-ng-dev libcurl4-gnutls-dev libepoxy-dev libfdt-dev libgbm-dev libgles2-mesa-dev libglib2.0-dev libibverbs-dev libjpeg8-dev liblzo2-dev libncurses5-dev libnuma-dev librbd-dev librdmacm-dev libsasl2-dev libsdl1.2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh2-1-dev libtool libusb-1.0-0 libusb-1.0-0-dev libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev valgrind xfslibs-dev xutils-dev zlib1g-dev </pre> </td> </tr> </tbody> </table> <h2><br />Set up paths</h2> <p>Naturally all of the paths below are configurable, this is just what I used.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>export PROJECT_PATH="/opt/qemu_android" export VIRGLRENDERER_PATH="<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/virglrenderer" export QEMU_PATH="<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/qemu" export LINUX_PATH="<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/linux" export ANDROID_PATH="<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/android" export ANDROID_TOOLS_PATH="<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/android-tools" </pre> </td> </tr> </tbody> </table> <h2><br />Virglrenderer</h2> <p>Virglrenderer creates a virtual 3D GPU, that allows the Qemu guest to use the graphics capabilities of the host machine.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>git clone git://git.freedesktop.org/git/virglrenderer <span class="cp">${</span><span class="n">VIRGLRENDERER_PATH</span><span class="cp">}</span> cd <span class="cp">${</span><span class="n">VIRGLRENDERER_PATH</span><span class="cp">}</span> ./autogen.sh make sudo make install </pre> </td> </tr> </tbody> </table> <h2><br />Qemu</h2> <p>Qemu is a full system emulator, and supports a multitude of machine architectures. We're going to to use x86_64 but also build support for arm64/aarch64.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>git clone git://git.qemu-project.org/qemu.git <span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span> mkdir <span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span>/build cd <span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span>/build ../configure --target-list=aarch64-softmmu,x86_64-softmmu --enable-gtk --with-gtkabi=3.0 --enable-kvm make -j </pre> </td> </tr> </tbody> </table> <h2><br />Linux kernel</h2> <p>Build trunk of mainline linux kernel.</p> <p><strong>Important:</strong> The below instructions use upstream/master but during testing of this guide, <em>https://git.kernel.org/pub/scm/linux/kernel/git/padovan/linux.git</em> and the <em>fences</em> branch was used due to SW_SYNC not yet being included in upstream. Inclusion is targeted for <em>v4.9</em>.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git <span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span> cd <span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span> wget http://memcpy.io/files/2016-08-30/Kconfig -O <span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span>/.config make oldconfig make -j </pre> </td> </tr> </tbody> </table> <p><strong><br />Important:</strong> If you decide not to use the <em>.config</em> linked in this step, a few Kconfig options need to be set:</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>CONFIG_ANDROID=y CONFIG_ANDROID_BINDER_IPC=y CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 CONFIG_DEFAULT_SECURITY_SELINUX=y CONFIG_DEFAULT_SECURITY="selinux" CONFIG_VIRTIO_BLK=y CONFIG_SCSI_VIRTIO=y CONFIG_VIRTIO_NET=y CONFIG_VIRTIO_CONSOLE=y CONFIG_HW_RANDOM_VIRTIO=y CONFIG_DRM_VIRTIO_GPU=y CONFIG_VIRT_DRIVERS=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=y CONFIG_VIRTIO_INPUT=y CONFIG_VIRTIO_MMIO=y CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y CONFIG_NET_9P=y CONFIG_NET_9P_VIRTIO=y CONFIG_SYNC=y CONFIG_SW_SYNC=y CONFIG_SYNC_FILE=y </pre> </td> </tr> </tbody> </table> <h2><br />Android</h2> <p>Build the Android Open Source Project.</p> <p><strong>Important:</strong> When running <em>source build/envsetup.sh</em> make sure that you are using bash. I had issues running <em>lunch</em> using zsh.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>mkdir <span class="cp">${</span><span class="n">ANDROID_PATH</span><span class="cp">}</span> cd <span class="cp">${</span><span class="n">ANDROID_PATH</span><span class="cp">}</span> repo init -u https://android.googlesource.com/platform/manifest -b master cd .repo git clone https://github.com/robherring/android_manifest.git -b android-6.0 local_manifests cd .. repo sync -j cd device/linaro/generic make defconfig make all cd ../../.. # The following snippet must be run in bash bash source build/envsetup.sh # Select linaro_x86_64-userdebug lunch make -j # We don't need to use bash any longer exit </pre> </td> </tr> </tbody> </table> <p><br />As of this writing SW_SYNC related patches by Gustavo Padovan has yet to be included into AOSP, and therefore has to be included included manually until it is upstreamed. After switching to this branch, the AOSP project has to be rebuilt again.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>cd <span class="cp">${</span><span class="n">ANDROID_PATH</span><span class="cp">}</span>/external/drm_hwcomposer git remote add padovan git://git.collabora.com/git/user/padovan/android-system-core.git git fetch padovan git checkout padovan/master </pre> </td> </tr> </tbody> </table> <h2><br />mkbootimg</h2> <p>Fetch the make boot image script. This script later assembles the boot image, <em>boot.img</em>.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre><span class="x">git clone https://android.googlesource.com/platform/system/core.git </span><span class="p">$</span><span class="nv">ANDROID_TOOLS_PATH</span> </pre> </td> </tr> </tbody> </table> <h2><br />Run Qemu machine</h2> <p>When running the below script, make sure that the all of the paths from step two have been exported.</p> <table class="tr-caption-container" width="90%" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td> <pre>wget http://memcpy.io/files/2016-08-30/boot_android_qemu.sh -O <span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh chmod +x <span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh <span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh x86_64 </pre> </td> </tr> </tbody> </table> <h2><br />Conclusion</h2> <p>Hopefully this guide will have enabled you build the required software and run Android on Qemu with a virtual GPU. The post was has been a part of work undertaken by my employer Collabora.<br /><br /></p> <p style="text-align: center;"><a href="http://memcpy.io/building-android-for-qemu-with-mesa-and-virgil3d.html" target="_blank" rel="noopener noreferrer">Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 56 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076726 [editedby] => 11 [editedon] => 1537215679 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1472824680 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/09/02/building-android-for-qemu-a-step-by-step-guide/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;amp;amp;amp;amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Robert Foss [NewsAndBlogArticle_isFeatured] => No [idx] => 186 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 340 [type] => document [contentType] => text/html [pagetitle] => Increased performance of emulated NVMe devices [longtitle] => [description] => [alias] => increased-performance-of-emulated-nvme-devices [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Nowadays, in Google Cloud Engine (GCE), it is possible to attach a local SSD with the NVMe interface to your virtual machine. Unfortunately, you only get a good number of iops (input/output operations per second) if you instantiate a machine with nvme-backports-debian-7-wheezy image; other available distributions on GCE will have a lower number of iops. [content] => <p>Nowadays, in Google Cloud Engine (GCE), it is possible to attach a local SSD with the NVMe interface to your virtual machine. Unfortunately, you only get a good number of iops (input/output operations per second) if you instantiate a machine with nvme-backports-debian-7-wheezy image; other available distributions on GCE will have a lower number of iops.<br />&nbsp;<br />It turns out that Google's Virtual Machine Monitor (aka Hypervisor) implements a custom NVMe command that allows it to increase up to 4 times the number of&nbsp; iops (note: this is from what I've tested so far, but it seems to be possible to get up to 5 times faster according to the original commit message; check the&nbsp;<a href="https://www.blogger.com/blogger.g?blogID=1500489269278275835#techdet" target="_blank">Technical Details sessions</a> to see how this is possible), however the kernel you use needs to support it and this is not yet the case with the mainline kernel.<br />&nbsp;<br />This is not exclusive to GCE as Google released a patch not only to the kernel&nbsp; but also to the qemu and is <a href="https://lists.linuxfoundation.org/pipermail/virtualization/2015-November/030743.html" target="_blank">available here</a>.<br />&nbsp;<br />Collabora has been helping update, refactor and review the patches to the Linux Kernel to send it upstream, however since this is not yet an official nvme standard, it shouldn't be merged into Kernel mainline, as its specification may still receive changes.<br />&nbsp;<br />Seeing as it considerably increases performance, the feature is in the process of being discussed and proposed to the NVMe workgroup with Collabora's help.<br />&nbsp;<br />While the nvmexpress.org seems interested in adding an official extension to stardarize it, as published in the mailing list, nothing has been defined yet, as this is a very recent discussion and it can take up to a year to be ratified by the NVMe workgroup.<br />&nbsp;<br />So, for the time being, you can get a more recent version of the patch and install the driver yourself here: <a href="https://git.collabora.com/cgit/user/koike/linux.git/log/?h=nvme/dev" target="_blank">https://git.collabora.com/cgit/user/koike/linux.git/log/?h=nvme/dev</a><br />&nbsp;</p> <h2>How it works</h2> <h3>Technical details</h3> <p>The NVMe interface basicaly works with command queues. The drive writes a command in a region known to both (driver and device controller) and then updates the tail of the queue, writting to an MMIO register called doorbell.<br />&nbsp;<br />In an environment with several guest OSes on top of a VMM sharing a resource, communication between the guest OS and the real device is usually trapped by the VMM. As an MMIO is usually a syncronous acces to the device, it means that every MMIO access will cause a trap.&nbsp;</p> <table class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;" cellspacing="0" cellpadding="0" align="center"> <tbody> <tr> <td style="text-align: center;"><a style="margin-left: auto; margin-right: auto;" href="https://1.bp.blogspot.com/-Y3A7hSNNvW0/V7y4iYDAt1I/AAAAAAAAOfs/Z1JR13VlVoc7l7vq7xJL-wmmiDZTdQlowCLcB/s1600/nvme%2Bdiagram%2Bcollabora%25281%2529.png"><img src="https://1.bp.blogspot.com/-Y3A7hSNNvW0/V7y4iYDAt1I/AAAAAAAAOfs/Z1JR13VlVoc7l7vq7xJL-wmmiDZTdQlowCLcB/s640/nvme%2Bdiagram%2Bcollabora%25281%2529.png" alt="" width="640" height="360" border="0" /></a></td> </tr> <tr> <td class="tr-caption" style="text-align: center;">Figure 1. Example of emulated device in the VMM</td> </tr> </tbody> </table> <p>&nbsp;</p> <p>The main idea here is to decrease the number of traps to the VMM by reducing the number of writtes to the doorbells.<br />This is achieved in two ways:<br />&nbsp;<br />&nbsp;&nbsp;&nbsp; 1) Batching; or<br />&nbsp;&nbsp;&nbsp; 2) Letting the VMM pull the current doorbell value when it is already in execution.<br /><br />The first one is easy, we can wait X commands to be written in the queue to ring the doorbell.<br />&nbsp;<br />The second one is a bit more complicated. The guest OS needs to inform the emulated device in the VMM where it can pull the doorbell values, and the emulated NVMe device needs to inform the guest OS that it can restart the counter of X.<br />&nbsp;<br />This is what this new feature does:<br />&nbsp;<br />It adds a new command in the NVMe interface where the driver can send to the NVMe device controller two memory buffers:<br /><br />1) A buffer where the real doorbell values are: Instead of writting to the MMIO&nbsp; doorbell, the driver writtes the value in this buffer; and<br />2) Another buffer with a hint from the controller about how many commands the driver can write in the queue without ringing the doorbell.<br />&nbsp;<br />The exact technical details may still change in the future, especially on how to properly implement the second item above. It is also very likely that Google's patches won't be compliant with the future ratified standard.<br />&nbsp;<br />For the time being though, you can use the <a href="https://git.collabora.com/cgit/user/koike/linux.git/log/?h=nvme/dev" target="_blank">Collabora tree</a>. Please let me know if you have any comments/feedback!</p> <p style="text-align: center;"><a href="http://helenfornazier.blogspot.ca/2016/08/increased-performance-of-emulated-nvme.html" target="_blank"><br />Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 55 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076646 [editedby] => 11 [editedon] => 1531505694 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1471982400 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/08/23/increased-performance-of-emulated-nvme-devices/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Helen Fornazier [NewsAndBlogArticle_isFeatured] => No [idx] => 187 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 339 [type] => document [contentType] => text/html [pagetitle] => Thoughts about reviewing large patchsets [longtitle] => [description] => [alias] => thoughts-about-reviewing-large-patchsets [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => I have recently been involved in reviewing some large feature patchsets for a project at work, and thought it might be interesting to discuss some of the principles we have been trying to stick to when going about these reviews. [content] => <div class="entry-content"> <p>I have recently been involved in reviewing some large feature patchsets for a project at work, and thought it might be interesting to discuss some of the principles we have been trying to stick to when going about these reviews.</p> <p>These are just suggestions which will not apply verbatim to every project, but they might provoke some ideas which are relevant to your project. In many cases, a developer might find a checklist is not useful for them &mdash; it is too rigid, or slows down the pace of development too much. Checklists are probably best treated as strong suggestions, rather than strict requirements for a review to pass; developers need to use them as reminders for things they should think about when submitting a patch, rather than a box-ticking exercise. Checklists probably work better in larger projects with lots of infrequent or inexperienced contributors, who may not be aware of all of the conventions of the project.</p> <h3>Overall principles</h3> <p>In order to break a set of reviews down into chunks, there a few key principles to stick to:</p> <ul class="remarkup-list"> <li class="remarkup-list-item">Review patches which are as small as possible, but no smaller (see <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/stable/version-control.html.en#guidelines-for-making-commits" target="_blank" rel="noreferrer">here</a>, <a class="remarkup-link" href="https://crealytics.com/blog/2010/07/09/5-reasons-keeping-git-commits-small/" target="_blank" rel="noreferrer">here</a> and <a class="remarkup-link" href="http://who-t.blogspot.co.uk/2009/12/on-commit-messages.html" target="_blank" rel="noreferrer">here</a>)</li> <li class="remarkup-list-item">Learn from each review so the same review comments do not need to be made more than once</li> <li class="remarkup-list-item">Use automated tools to eliminate many of the repetitive and time consuming parts of patch review and rework</li> <li class="remarkup-list-item">Do high-level API review first, ideally before implementing those APIs, to avoid unnecessary rework</li> </ul> <h3 class="remarkup-header">Pre-submission checklist</h3> <p>(A rationale for each of these points is given in the section below to avoid cluttering this one.)</p> <p>This is the pre-submission checklist we have been using to check patches against before submission for review:</p> <ol class="remarkup-list"> <li class="remarkup-list-item">All new code follows the coding guidelines, especially the <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/namespacing.html.en" target="_blank" rel="noreferrer">namespacing guidelines</a>, <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/memory-management.html.en" target="_blank" rel="noreferrer">memory management guidelines</a>, <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/preconditions.html.en" target="_blank" rel="noreferrer">pre- and post-condition guidelines</a>, and <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/introspection.html.en" target="_blank" rel="noreferrer">introspection guidelines</a> &mdash; some key points from these are pulled out below, but these are not the only points to pay attention to.</li> <li class="remarkup-list-item">All new public API must be <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/namespacing.html.en" target="_blank" rel="noreferrer">namespaced correctly</a>.</li> <li class="remarkup-list-item">All new public API must have a complete and useful <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/documentation.html.en" target="_blank" rel="noreferrer">documentation comment</a>.</li> <li class="remarkup-list-item">All new public API documentation comments must have <a class="remarkup-link" href="https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations/" target="_blank" rel="noreferrer">GObject Introspection annotations</a> where appropriate; <tt class="remarkup-monospaced">g-ir-scanner</tt> (part of the build process) must emit no warnings when run with <tt class="remarkup-monospaced">--warn-all --warn-error</tt> (which should be set by <tt class="remarkup-monospaced">$(WARN_SCANNERFLAGS)</tt> from <a href="http://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html"><tt class="remarkup-monospaced">AX_COMPILER_FLAGS</tt></a>).</li> <li class="remarkup-list-item">All new public methods must have <a class="remarkup-link" href="https://developer.gnome.org/programming-guidelines/unstable/preconditions.html.en" target="_blank" rel="noreferrer">pre- and post-conditions</a> to enforce constraints on the accepted parameter values.</li> <li class="remarkup-list-item">The code must compile without warnings, after ensuring that <a href="http://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html"><tt class="remarkup-monospaced">AX_COMPILER_FLAGS</tt></a> is used <em>and enabled</em> in <tt class="remarkup-monospaced">configure.ac</tt> (if it is correctly enabled, compiling the module should fail if there are any compiler warnings) &mdash; remember to add <tt class="remarkup-monospaced">$(WARN_CFLAGS)</tt>, <tt class="remarkup-monospaced">$(WARN_LDFLAGS)</tt> and <tt class="remarkup-monospaced">$(WARN_SCANNERFLAGS)</tt> to new <tt class="remarkup-monospaced">Makefile.am</tt> targets as appropriate.</li> <li class="remarkup-list-item">The introduction documentation comment for each new object must give a usage example for each of the main ways that object is intended to be used.</li> <li class="remarkup-list-item">All new code must be formatted as per the project&rsquo;s coding guidelines.</li> <li class="remarkup-list-item">If possible, there should be an example program for each new feature or object, which can be used to manually test that functionality &mdash; these examples may be submitted in a separate patch from the object implementation, but must be submitted at the same time as the implementation in order to allow review in parallel. Example programs must be usable when installed or uninstalled, so they can be used during development and on production machines.</li> <li class="remarkup-list-item">There must be automated tests (using the <a class="remarkup-link" href="https://developer.gnome.org/glib/stable/glib-Testing.html" target="_blank" rel="noreferrer"><tt class="remarkup-monospaced">GTest</tt> framework in GLib</a>) for construction of each new object, and for getting and setting each of its properties.</li> <li class="remarkup-list-item">The code coverage of the automated tests must be checked (using <tt class="remarkup-monospaced">make check-code-coverage</tt> and <a href="http://www.gnu.org/software/autoconf-archive/ax_code_coverage.html"><tt>AX_CODE_COVERAGE</tt></a>) before submission, and if it&rsquo;s possible to add more automated tests (and for them to be reliable) to improve the coverage, this should be done; the final code coverage figure for the object should be mentioned in a comment on the patch review, and it would be helpful to have the <tt class="remarkup-monospaced">lcov</tt> reports for the object saved somewhere for analysis as part of the review.</li> <li class="remarkup-list-item">There must be no definite memory leaks reported by Valgrind when running the automated tests under it (using <a href="http://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html"><tt class="remarkup-monospaced">AX_VALGRIND_CHECK</tt></a> and <tt class="remarkup-monospaced">make check-valgrind</tt>).</li> <li class="remarkup-list-item">All automated tests must be installed as <a class="remarkup-link" href="https://wiki.gnome.org/Initiatives/GnomeGoals/InstalledTests" target="_blank" rel="noreferrer">installed-tests</a> so they can be run as integration tests on a production system.</li> <li class="remarkup-list-item"><tt class="remarkup-monospaced">make distcheck</tt> must pass before submission of any patch, especially if it touches the build system.</li> <li class="remarkup-list-item">All new code has been checked to ensure it doesn&rsquo;t contradict review comments from previous reviews of other patches (i.e. we want to avoid making the same review comments on every submitted patch).</li> <li class="remarkup-list-item">Commit messages must <a class="remarkup-link" href="http://chris.beams.io/posts/git-commit/" target="_blank" rel="noreferrer">explain <em>why</em> they make the changes they do</a>.</li> </ol> <h3 class="remarkup-header">Rationales</h3> <ol class="remarkup-list"> <li class="remarkup-list-item">Each coding guideline has its own rationale for why it&rsquo;s useful, and many of them significantly affect the structure of a patch, so are important to get right early on.</li> <li class="remarkup-list-item">Namespacing is important for the correct functioning of a lot of the developer tools (for example, GObject Introspection), and to avoid symbol collisions between libraries &mdash; checking it is a very mechanical process which it is best to not have to spend review time on.</li> <li class="remarkup-list-item">Documentation comments are useful to both the reviewer and to end users of the API &mdash; for the reviewer, they act as an explanation of why a particular API is necessary, how it is meant to be used, and can provide insight into implementation choices. These are questions which the reviewer would otherwise have to ask in the review, so writing them up lucidly in a documentation comment saves time in the long run.</li> <li class="remarkup-list-item">GObject Introspection annotations are a requirement for the platform&rsquo;s language bindings (to JavaScript or Python, for example) to work, so must be added at some point. Fixing the error messages from <tt class="remarkup-monospaced">g-ir-scanner</tt> is sufficient to ensure that the API can be introspected.</li> <li class="remarkup-list-item">Pre- and post-conditions are a form of assertion in the code, which check for programmer errors at runtime. If they are used consistently throughout the code on every API entry point, they can catch programmer errors much nearer their origin than otherwise, which speeds up debugging both during development of the library, and when end users are using the public APIs. They also act as a loose form of documentation of what each API will allow as its inputs and outputs, which helps review (see the comments about documentation above).</li> <li class="remarkup-list-item">The set of compiler warnings enabled by <tt class="remarkup-monospaced">AX_COMPILER_FLAGS</tt> have been chosen to balance <a class="remarkup-link" href="https://en.wikipedia.org/wiki/Type_I_and_type_II_errors" target="_blank" rel="noreferrer">false positives against false negatives</a> in detecting bugs in the code. Each compiler warning typically identifies a single bug in the code which would otherwise have to be fixed later in the life of the library &mdash; fixing bugs later is always more expensive in terms of debugging time.</li> <li class="remarkup-list-item">Usage examples are another form of documentation (as discussed above), which specifically make it clearer to a reviewer how a particular feature is intended to be used. In writing usage examples, the author of a patch can often notice awkwardnesses in their API design, which can then be fixed before review &mdash; this is faster than them being caught in review and sent back for modification.</li> <li class="remarkup-list-item">Well formatted code is a lot easier to read and review than poorly formatted code. It allows the reviewer to think about the function of the code they are reviewing, rather than (for example) which function call a given argument actually applies to, or which block of code a statement is actually part of.</li> <li class="remarkup-list-item">Example programs are a loose form of testing, and also act as usage examples and documentation for the feature (see above). They provide an easy way for the reviewer to test a feature, especially if it affects a UI or has some interactive element; this is very hard to do by simply looking at the code in a patch. Their biggest benefit will be when the feature is modified in future &mdash; the example programs can be used to test changes to the feature and ensure that its behaviour changes (or does not) as expected.</li> <li class="remarkup-list-item">For each unit test for a piece of code, the behaviour checked by that unit test can be guaranteed to be unchanged across modifications to the code in future. This prevents regressions (especially if the unit tests for the project are set up to be run automatically on each commit by a continuous integration system). The value of unit tests when initially implementing a feature is in the way they guide API design to be testable in the first place. It is often the case that an API will be written without unit tests, and later someone will try to add unit tests and find that the API is untestable; typically because it relies on internal state which the test harness cannot affect. By that point, the API is stable and cannot be changed to allow testing.</li> <li class="remarkup-list-item">Looking at code coverage reports is a good way to check that unit tests are actually checking what they are expected to check about the code. Code coverage provides a simple, coarse-grained metric of code quality &mdash; the quality of untested code is unknown.</li> <li class="remarkup-list-item">Every memory leak is a bug, and hence needs to be fixed at some point. Checking for memory leaks in a code review is a very mechanical, time-consuming process. If memory leaks can be detected automatically, by using <tt class="remarkup-monospaced">valgrind</tt> on the unit tests, this reduces the amount of time needed to catch them during review. This is an area where higher code coverage provides immediate benefits. Another way to avoid leaks is to use <a class="remarkup-link" href="https://developer.gnome.org/glib/stable/glib-Miscellaneous-Macros.html#g-autoptr" target="_blank" rel="noreferrer"><tt class="remarkup-monospaced">g_autoptr()</tt></a> to automatically free memory when leaving a control block.</li> <li class="remarkup-list-item">If all automated tests are available, they can be run as part of system-wide integration tests, to check that the project behaviour doesn&rsquo;t change when other system libraries (its dependencies) are changed. This is one of the <a class="remarkup-link" href="https://wiki.gnome.org/Initiatives/GnomeGoals/InstalledTests#Issues_with_.22make_check.22" target="_blank" rel="noreferrer">motivations behind installed-tests</a>. This is a one-time setup needed for your project, and once it&rsquo;s set up, does not need to be done for each commit.</li> <li class="remarkup-list-item"><tt class="remarkup-monospaced">make distcheck</tt> ensures that a tarball can be created successfully from the code, which entails building it, running all the unit tests, and checking that examples compile.</li> <li class="remarkup-list-item">If each patch is updated to learn from the results of previous patch reviews, the amount of time spent making and explaining repeated patch review comments should be significantly reduced, which saves everyone&rsquo;s time.</li> <li class="remarkup-list-item">Commit messages are a form of documentation of the changes being made to a project. They should explain the motivation behind the changes, and clarify any design decisions which the author thinks the reviewer might question. If a commit message is inadequate, the reviewer is going to ask questions in the review which could have been avoided otherwise.</li> </ol> <p style="text-align: center;"><a href="https://tecnocode.co.uk/2016/08/12/thoughts-about-reviewing-large-patchsets/" target="_blank"><br />Original post</a></p> </div> [richtext] => 1 [template] => 15 [menuindex] => 54 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076554 [editedby] => 3 [editedon] => 1476882403 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1471004640 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/08/12/thoughts-about-reviewing-large-patchsets/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 1 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Philip Withnall [NewsAndBlogArticle_isFeatured] => No [idx] => 188 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 338 [type] => document [contentType] => text/html [pagetitle] => OpenGL 4.4 for Intel Linux Drivers [longtitle] => [description] => [alias] => opengl-4.4-for-intel-linux-drivers [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => For years the open source Linux OpenGL drivers have been playing catchup to the proprietary drivers and in the case of Intel hardware to the Windows driver. Recently, a major milestone was reached in bridging this gap with the enablement of OpenGL 4.4 for the Intel Broadwell and Skylake platforms. [content] => <p>For years the open source Linux OpenGL drivers have been playing catchup to the proprietary drivers and in the case of Intel hardware to the Windows driver. Recently, a major milestone was reached in bridging this gap with the <a href="https://cgit.freedesktop.org/mesa/mesa/commit/?id=b463b1d7cce2e9848b5937d1431c74f27e26edb3" target="_blank">enablement of OpenGL 4.4</a> for the Intel Broadwell and Skylake platforms.</p> <p>This puts the Intel Linux driver on par with its Windows equivalent, and makes it the first Open Source Linux driver to enable this version of OpenGL.</p> <p>At Collabora, I recently had the opportunity to implement the <a href="https://www.opengl.org/registry/specs/ARB/enhanced_layouts.txt" target="_blank">ARB_enhanced_layouts</a> extension which was last extension required to enable 4.4 . As described in the extensions overview this extension brings six new enhancements to the GL shader language to improve the development experience for OpenGL developers.</p> <p>To top this off all the extensions required to advertise OpenGL 4.5 have already been implemented and its just a matter fixing some conformance failures before 4.5 can be enabled also. This allows me to focus my time at Collabora in the upcoming months on performance improvements to the driver working on features such as a <a href="https://lists.freedesktop.org/archives/mesa-dev/2016-July/122898.html" target="_blank">shader cache</a>, and improving optimastion passes for the GL shader language compiler such as loop unrolling.</p> <p>I’d like to conclude by congratulating all the developers including past and present Collabora developers who have helped reach this major milestone.</p> [richtext] => 1 [template] => 15 [menuindex] => 53 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076454 [editedby] => 0 [editedon] => 0 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1470403200 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/08/05/opengl-4.4-for-intel-linux-drivers/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 1 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Timothy Arceri [NewsAndBlogArticle_isFeatured] => No [idx] => 189 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 337 [type] => document [contentType] => text/html [pagetitle] => Collabora contributions to Linux Kernel 4.7 [longtitle] => [description] => [alias] => collabora-contributions-to-linux-kernel-4.7 [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => Linux Kernel 4.7 was released this week with a total of 36 contributions from five Collabora engineers. It includes the first contributions from Helen as Collaboran and the first ever contributions on the kernel from Robert Foss. Here are some of the highlights of the work Collabora have done on Linux Kernel 4.7. [content] => <div class="entry-content"> <p>Linux Kernel 4.7 was released this week with a total of 36 contributions from five Collabora engineers. It includes the first contributions from Helen as Collaboran and the first ever contributions on the kernel from Robert Foss. Here are some of the highlights of the work Collabora have done on Linux Kernel 4.7.</p> <p>Enric added support for the Analogix anx78xx DRM Bridge and fixed two SD Card related issues on OMAP igep00x0: fix remove/insert detection and enable support to read the write-protect pin.</p> <p>Gustavo de-staged the sync_file framework (Android Sync framework) that will be used to add explicit fencing support to the graphics pipeline and started a work to clean up usage of legacy vblank helpers.</p> <p>Helen Koike created a separated module for the V4L2 Test Pattern Generator and fixed return errors on the pipeline validation code while Robert Foss improved the DRM documentation and fixed drm/vc4 (Raspberry Pi) when there is already a pending update when calling atomic_commit.</p> <p>Tomeu fixed two Rockchip issues while working on the intel-gpu-tools support for other platforms.</p> <p>Enric Balletbo i Serra (6):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=56c5da00271e656466d34b853d6c2b5f3ce3ee5a">drm/dp: Add define to set 0.5% down-spread in MAX_DOWNSPREAD register</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ae4927ffc7f7090ddb4c833b88f6f09f294502cd">of: Add vendor prefix for Analogix Semiconductor</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6060fd42a24d1c3fd6282659da3b097582dc1bca">devicetree: Add ANX7814 SlimPort transmitter binding</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=0647e7dd3f7ab2e0490691eae185ab0c49fc266f">drm/bridge: Add Analogix anx78xx support</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b44f788cce4086da00fd2f14b6b4d5abcf85f842">ARM: dts: igep00x0: Add SD card-detect.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a1f6ad14176d466c00e6a687f9c78ec6c7ad6bf8">ARM: dts: igep0020: Add SD card write-protect pin.</a></li> </ul> <p>Gustavo Padovan (22):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=560ce1dc7c87ade27faaf07d381a9a5a2ffc9934">drm/i915: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3ed605bc8a0a688d8750a1e2eff39c854418c5cf">kernel.h: add u64_to_user_ptr()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2d75c88fefb228aedfb135228acb6620db8f0e40">staging/android: refactor SYNC IOCTLs</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a64d6a68667e61f34b27df294e25da6a45f31ff2">staging/android: remove redundant comments on sync_merge_data</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=2a7c1db557e111eaeb967baf2d39ecd6e593b767">staging/android: drop sync_file_install() and sync_file_put()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=696f74cf543997732d87956c5a88de6e9bd42605">staging/android: move sync_file functions comments to sync.c</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4dff14e88ea928eacaa5faacd05d966c04bcecac">staging/android: make sync_file_merge() static</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=10e362c387e45f01cc38f62dec8f0bc3f1d676b5">staging/android: make sync_file_fdget() static</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d7c3110c28dee67f6766ae26cac629358233a6b4">staging/android: remove name arg from sync_file_create()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d4cab38e153d62ecd502645390c0289c1b8337df">staging/android: prepare sync_file for de-staging</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c240a714a6ad68458c3caf61ab6216184e52b631">staging/android: improve documentation for sync_file</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=92e06213f11a87effad8bdd4d910958b89eec044">staging/android: style fix: alignment to match the open parenthesis</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=460bfc41fd52959311ed0328163f785e023857af">dma-buf/sync_file: de-stage sync_file headers</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=62304fb1fc0801925568e191261b650e1546ce8c">dma-buf/sync_file: de-stage sync_file</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b996e93aac3d9a26e077df1c9bb581427b216fe">Documentation: include sync_file into DocBook</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c784c82a3fd64b322015b92016fc980be705c176">Documentation: add Sync File doc</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=56286769667c72322d18e9acca3a639213bd4a00">drm/amdgpu: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=eba92811f5c7ad9fadf40f021c1b85ad0de3bcc4">drm/radeon: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6118faea2bc541426c171dbea701d000eb1265fe">drm/msm: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=444435bb54699843f73ed2b97cba0d71c2e097bc">drm/rcar-du: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c05d3d73dbd39b0b88cea62657307bedd5efc9f0">drm/shmobile: use drm_crtc_send_vblank_event()</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=dfebc152b7570df7df76ed31eeb3c81cf84ecb54">drm/tilcdc: use drm_crtc_send_vblank_event()</a></li> </ul> <p>Helen Koike (3):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e07d46e7e0da86c146f199dae76f879096bc436a">[media] tpg: Export the tpg code from vivid as a module</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=47dfdb3a888733ab76702fc2801b6715c9d77937">[media] media: change pipeline validation return error</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1e166c77fdbc71bd237a3d1ac27abef6221e3a5e">[media] DocBook: update error code in videoc-streamon</a></li> </ul> <p>Robert Foss (3):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=346fea63a8d25644a5ad06ecd98d6a4747c63885">include/drm: Reword debug categories comment.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=fcbcb3b0cf9f73742426877ff56d63f12fd92c12">drm/docs: Move &ldquo;scaling mode&rdquo; property.</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e7c31f6f25b84fed961dc0dce6248878527693ae">drm/vc4: Return -EBUSY if there&rsquo;s already a pending flip event.</a></li> </ul> <p>Tomeu Vizoso (2):</p> <ul> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8d7f2d84ed2d44b05e1ce88fa4b74886af46a139">iommu/rockchip: Don&rsquo;t feed NULL res pointers to devres</a></li> <li><a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4dc0dd83603f05dc3ae152af33ecb15104c313f3">spi: rockchip: Signal unfinished DMA transfers</a></li> </ul> <p style="text-align: center;"><a href="http://padovan.org/blog/2016/07/collabora-contributions-to-linux-kernel-4-7/" target="_blank"><br />Original post</a></p> </div> [richtext] => 1 [template] => 15 [menuindex] => 52 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076315 [editedby] => 11 [editedon] => 1531505708 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1469516400 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/07/26/collabora-contributions-to-linux-kernel-4.7/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Gustavo Padovan [NewsAndBlogArticle_isFeatured] => No [idx] => 190 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 336 [type] => document [contentType] => text/html [pagetitle] => GStreamer Echo Canceller [longtitle] => [description] => [alias] => gstreamer-echo-canceller [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => For a long time I believed that echo cancellers had no place inside GStreamer. The theory was that GStreamer was too high level and would never be able to provide accurate enough delay information for any canceller to work. [content] => <div class="entry-content"> <p>For a long time I believed that echo cancellers had no place inside GStreamer. The theory was that GStreamer was too high level and would never be able to provide accurate enough delay information for any canceller to work. With fairly simple test, I could quickly confirm that the reported latency is often off by a period (generally 10ms). This isn&rsquo;t strictly GStreamer&rsquo;s fault and is not in any ways catastrophic for general playback experience.</p> <p>With the apparition of WebRTC in browsers, it most likely became apparent that to be cross-platform browsers needed to have their own canceller. That&rsquo;s exactly what happened in <a href="https://webrtc.org/" target="_blank">libWebRTC</a> (former libjingle, used in both Firefox and Chrome to implement WebRTC). They implemented an echo canceller that accept an approximate delay and this changes everything for GStreamer.</p> <p>At Collabora, I recently had the opportunity to implement this <a href="https://cgit.freedesktop.org/pulseaudio/webrtc-audio-processing/" target="_blank">WebRTC Audio Processing</a> based echo canceller. The main motivation was that the canceller on the hardware DSP we had didn&rsquo;t work due to a hardware bug. A lot of those boards had been produced and no rework was possible. To save these boards, we decided to try with a software echo canceller. Even though it was using a fair amount of CPU, the experiment was a success. I have then clean-up the code and the new elements are now available in <a href="https://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=398f7059fc8eb226f3aa67287ef466328cfd1e94" target="_blank">GStreamer Plugins Bad</a>.</p> <p>How does it work ?</p> <p><a href="http://ndufresne.ca/2016/06/gstreamer-echo-canceller/echo/#main" rel="attachment wp-att-136"><img class="size-full wp-image-136 aligncenter" src="assets/images/blog/Echo.png" alt="Echo" width="493" height="270" /></a></p> <p>The first step is to understand what is the echo. In a phone call with loud speaker, what happens is that your microphone records both your voice and the far end voices. The side effect, is that you are sending to the far end listeners both your voice along with a bad copy of their voices a moment before (the echo). To avoid this echo, you need to monitor the far end stream that you are playing back and &ldquo;subtract&rdquo; it from the recorded stream. In practice, it&rsquo;s much more complex work, since the signal is deteriorated by the speaker and the microphone. You also need to figure-out the delays and hint the canceller, otherwise you may end-up with a terrible startup time or it may simply not work.</p> <p>The implementation was greatly inspired from an experiment <a href="https://git.collabora.com/cgit/user/tester/gst-plugins-farsight-tester.git/tree/ext/speexdsp?h=speexdsp" target="_blank">Olivier Cr&ecirc;te did in 2008</a> using <a href="http://www.speex.org/" target="_blank">Speex DSP</a>. I must admit, I never really understood his way of synchronizing the streams and literally ignored pretty much all the code that wasn&rsquo;t GStreamer specific. The design works this way, you have a DSP element (webrtcdsp) that process the recorded stream and a probe element (webrtcechoprobe) that analyses the far end stream (before playing it back). Due to WebRTC library limitation, those two elements will transform the input buffer into chunk of 10ms. This is done using GstAdapter help. On the probe side, we push buffers in the adapter with timestamp transformed to running time. This time, plus the pipeline latency, gives us the moment in running time when the buffer should be heard by the microphone. We then synchronize the far end data against the recorded data and then let WebRTC Audio Processing library do it&rsquo;s magic. A simple way of testing the element is by using an echo loop.</p> <p><code>&nbsp; gst-launch-1.0 pulsesrc ! webrtcdsp ! webrtcechoprobe ! pulsesink</code></p> <p>Without the canceller, this pipeline would create a lot of echo, and probably end with loud feedback if your microphone volume is high enough. With the canceller, you should instead ear only one echo. It behaves a bit like a sound monitor but with too high latency and the side effect of fading in and out monotonic frequencies. After all, this is not what the algorithm have been design for. Try it in your real audio call application, that&rsquo;s where you will most likely get the best results.</p> <p><a href="http://ndufresne.ca/2016/06/gstreamer-echo-canceller/pipeline-2/#main" rel="attachment wp-att-137"><img class="alignnone wp-image-143 size-large" src="http://ndufresne.ca/blog/wp-content/uploads/2016/06/Pipeline-1-1024x305.png" alt="" width="792" height="236" /></a></p> <p>Before I conclude, there is a good reason why I called the element DSP rather then AEC. WebRTC Audio Processing is much more then just an echo canceller. In fact, it implements a wide variety of filters, noise suppressor, voice activity detection, etc. Currently we enable of subset of it, but I&rsquo;m definitely looking forward enabling more (if not all) features from this library. I also encourage contributions. This works was only possible because of the great effort Arun Raghavan have put into extracting the echo canceller form the WebRTC project, create a standalone library usable by all. If you are interested about what cool feature could be added in the future, have a look at <a href="https://arunraghavan.net/2016/06/beamforming-in-pulseaudio/" target="_blank">Arun&rsquo;s blog</a> about beamforming. And last one, thanks to my colleagues who had to suffer hearing me speak to my computer and listening to my echo for a few weeks.</p> </div> <p style="text-align: center;"><a href="http://ndufresne.ca/2016/06/gstreamer-echo-canceller/" target="_blank"><br />Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 51 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076232 [editedby] => 11 [editedon] => 1531506027 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1467984660 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/07/08/gstreamer-echo-canceller/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => Nicolas Dufresne [NewsAndBlogArticle_isFeatured] => No [idx] => 191 [link] => ) Array ( [plPrefix] => [maxLimit] => 1000 [page] => 16 [pageVarKey] => blogs_page [pageLimit] => 1000 [element] => pdoResources [pageNavVar] => Blogs.nav [pageCountVar] => pageCount [pageLinkScheme] => [tplPage] => @INLINE <li><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageWrapper] => @INLINE <div class="pagination"><ul class="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul></div> [tplPageActive] => @INLINE <li class="active"><a href="[[+href]]">[[+pageNo]]</a></li> [tplPageFirst] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_first]]</a></li> [tplPageLast] => @INLINE <li class="control"><a href="[[+href]]">[[%pdopage_last]]</a></li> [tplPagePrev] => @INLINE <li class="control"><a href="[[+href]]">&laquo;</a></li> [tplPageNext] => @INLINE <li class="control"><a href="[[+href]]">&raquo;</a></li> [tplPageSkip] => @INLINE <li class="disabled"><span>...</span></li> [tplPageFirstEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_first]]</span></li> [tplPageLastEmpty] => @INLINE <li class="disabled"><span>[[%pdopage_last]]</span></li> [tplPagePrevEmpty] => @INLINE <li class="disabled"><span>&laquo;</span></li> [tplPageNextEmpty] => @INLINE <li class="disabled"><span>&raquo;</span></li> [cache] => [cacheTime] => 3600 [cacheAnonymous] => [ajax] => [ajaxMode] => [ajaxElemWrapper] => #pdopage [ajaxElemRows] => #pdopage .rows [ajaxElemPagination] => #pdopage .pagination [ajaxElemLink] => #pdopage .pagination a [ajaxElemMore] => #pdopage .btn-more [ajaxTplMore] => @INLINE <button class="btn btn-default btn-more">[[%pdopage_more]]</button> [ajaxHistory] => [setMeta] => 1 [strictMode] => 1 [elementClass] => modSnippet [includeTVList] => NewsAndBlogArticle_isFeatured,BlogAndNewsArticleSource,BlogAndNewsSummaryImageClass,BlogAndNewsSummaryImage,BlogAuthorName [request] => Array ( [q] => news-and-blog/ [blogs_page] => 16 [newsandevents_page] => 6 [both_page] => 2 ) [setTotal] => 1 [id] => 335 [type] => document [contentType] => text/html [pagetitle] => Introducing GStreamer VR Plug-ins and SPHVR [longtitle] => [description] => [alias] => introducing-gstreamer-vr-plug-ins-and-sphvr [link_attributes] => [published] => 1 [pub_date] => 0 [unpub_date] => 0 [parent] => 32 [isfolder] => 0 [introtext] => The dawn of VR video players demand new features in terms of projection and hardware access. In his recent R&D work, a Collaboran implemented a way to view spherical videos with GStreamer on a Virtual Reality headset. In this article, he gives his thoughts on VR video and how he created SPHVR, a Python / Gtk VR video player. [content] => <p>Three years ago in 2013 I released an OpenGL fragment shader you could use with the GstGLShader element to <a href="https://lubosz.wordpress.com/2013/08/28/view-side-by-side-stereoscopic-video-with-gstreamer-and-oculus-rift/" target="&rdquo;_blank&rdquo;">view Side-By-Side stereoscopical video on the Oculus Rift DK1 in GStreamer</a>. It used the headset only as a stereo viewer and didn&rsquo;t provide any tracking, it was just a quick way to make any use of the DK1 with GStreamer at all. Side-by-side stereoscopic video was becoming very popular, due to &ldquo;3D&rdquo; movies and screen gaining popularity. With it&rsquo;s 1.6 release GStreamer added support for stereoscopic video, I didn&rsquo;t test Side-By-Side stereo with that though.</p> <h2>Why is planar stereoscopic video not 3D?</h2> <p>Stereoscopic video does not provide the full 3D information, since the perspective is always given for a certain view, or <a href="https://en.wikipedia.org/wiki/Parallax" target="&rdquo;_blank&rdquo;">parallax</a>. Mapping the stereo video onto a sphere does not solve this, but at least it stores color information independent of view angle, so its way more immersive and gets described as telepresence experience. A better solution for &ldquo;real 3D&rdquo; video would be of course capturing a point cloud with as many as sensitive sensors as possible, filter it and construct mesh data out of it for rendering, but more on that later.</p> <h2>A brief history of mapping imagery on anything different than a plane</h2> <p>Nowadays mankind projects its imagery mostly onto planes, as seen on most LCD Screens, canvases and Polaroids. Although this seems to be a physical limitation, there are some ways to overcome it, in particular with Curved LCD screens, <a href="https://www.youtube.com/watch?v=ruVCB3LLjYc" target="&rdquo;_blank&rdquo;">fancy projector setups</a> rarely seen in art installations and of course most recently: Virtual Reality Head Mounted Displays.</p> <p>Projecting our images on different shapes than planes in virtual space is not new at all though. Still panoramas have been very commonly projected onto cylinders, not only in modern photo viewer software, but also in monumental paintings like the <a href="https://www.youtube.com/watch?v=tAwHGBHMEK0" target="&rdquo;_blank&rdquo;">Racławice Panorama</a>, which is housed inside a cylinder shaped building.</p> <p><img src="https://lubosz.files.wordpress.com/2016/07/rotundapanoramyraclawickiej.jpg" alt="RotundaPanoramyRaclawickiej" width="100%" /></p> <p>(<a href="https://upload.wikimedia.org/wikipedia/commons/3/3e/RotundaPanoramyRaclawickiej.jpg">Source</a>)</p> <p>But to store information from each angle in 3D space we need a different geometric shape.</p> <h2>The sphere</h2> <p>Sperical projection is used very commonly for example in Google Street View and of course in VR video.</p> <p>As we are in 3D, a regular angle wouldn&rsquo;t be enough to describe all directions on sphere, since 360&deg; can only describe a full circle, a 2D shape. In fact we have 2 angles, <strong>&theta; </strong>and <strong>&phi;</strong>, also called <em>inclination</em> and <em>azimuth.</em></p> <p><img src="https://lubosz.files.wordpress.com/2016/07/coordonneesspheriques.png" alt="CoordonneesSpheriques" width="100%" /></p> <p>(<a href="https://commons.wikimedia.org/wiki/File:CoordonneesSpheriques.png">Source</a>)</p> <p><em>radius r</em>, <em>inclination &theta;</em>, <em>azimuth &phi;</em></p> <p>You can convert between spherical coordinates and Cartesian coordinates like this</p> <p><img class="dontScale" src="https://s0.wp.com/latex.php?latex=x%3Dr+%5C%2C+%5Csin%5Ctheta+%5C%2C+%5Ccos%5Cvarphi&amp;bg=ffffff&amp;fg=000000&amp;s=0" alt="" /><br /><img class="dontScale" src="https://s0.wp.com/latex.php?latex=y%3Dr+%5C%2C+%5Csin%5Ctheta+%5C%2C+%5Csin%5Cvarphi&amp;bg=ffffff&amp;fg=000000&amp;s=0" alt="" /><br /><img class="dontScale" src="https://s0.wp.com/latex.php?latex=z%3Dr+%5C%2C+%5Ccos%5Ctheta&amp;bg=ffffff&amp;fg=000000&amp;s=0" alt="" /></p> <p>For describing the angle on a sphere we can use the <a href="https://en.wikipedia.org/wiki/Solid_angle" target="&rdquo;_blank&rdquo;">solid angle</a> <strong>&Omega;</strong>, calculated by integrating over two angles <strong>&theta; </strong>and <strong>&phi;</strong>.</p> <p><img class="dontScale" src="https://s0.wp.com/latex.php?latex=d%5COmega+%3D+%5Csin%5Ctheta%5C%2Cd%5Ctheta%5C%2Cd%5Cvarphi&amp;bg=ffffff&amp;fg=000000&amp;s=0" alt="" /><br /> <img class="dontScale" src="https://s0.wp.com/latex.php?latex=%5COmega+%3D+%5Ciint%5Climits_S+%5Csin%5Ctheta%5C%2Cd%5Ctheta%5C%2Cd%5Cvarphi&amp;bg=ffffff&amp;fg=000000&amp;s=0" alt="" /></p> <p>The unit for the solid angle is <strong>steradian</strong>, where the full sphere is <strong>4</strong><span class="texhtml"><strong>&pi; sr</strong>, hence the hemisphere <strong>2&pi; sr</strong>.</span></p> <p><img src="https://lubosz.files.wordpress.com/2016/07/solid-angle.png" alt="solid-angle.png" width="100%" /></p> <p>(<a href="http://www.seos-project.eu/modules/laser-rs/laser-rs-c03-s02-p02.html" target="_blank" rel="noopener noreferrer">Source</a>)</p> <p>This is why the term <strong>360&deg; video</strong> does not suite to describe spherical video, since there are other popular shapes for projecting video having &phi; = 360&deg;, like cylinders. 180&deg; video also uses usually a half cylinder. With video half spheres, or hemispheres, you could for example texture a skydome.</p> <h2>So did you implement this sphere?</h2> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-02-12-26-44.png" alt="Sphere" width="100%" /></p> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-02-12-26-13.png" alt="" width="100%" /></p> <p>In Gst3D, which is a small graphics library currently supporting OpenGL 3+ I am providing a sphere built with one triangle strip, which has an <a href="https://en.wikipedia.org/wiki/Equirectangular_projection" target="&rdquo;_blank&rdquo;">equirectangular</a> mapping of UV coordinates, which you can see in yellow to green. You can switch to the wireframe rendering with <em>Tab</em> in the vrtestsrc element.</p> <h3>The <em>vrtestsrc</em> element</h3> <pre>$ gst-launch-1.0 vrtestsrc ! glimagesink</pre> <h2>How do you track the HMD?</h2> <p>For my <a href="https://lubosz.wordpress.com/2014/08/12/hovr-a-blender-game-engine-demo-for-the-oculus-rift-and-the-nintendo-balance-board/" target="&rdquo;_blank&rdquo;">HoVR demo in 2014</a> i made <a href="https://lubosz.wordpress.com/2013/06/26/oculus-rift-support-in-blender-game-engine/" target="&rdquo;_blank&rdquo;">Python bindings for using OpenHMD in Blender</a> game engine and had a good experience with it. Although it&rsquo;s HMD support is very limited, it currently only supports the IMU (<a href="https://en.wikipedia.org/wiki/Inertial_measurement_unit" target="&rdquo;_blank&rdquo;">Inertial Measurement Unit</a>) of the DK2, it is very lightweight since it uses hidapi directly and requires no daemon. In contrast to that the proprietary Oculus driver OVR is very unstable and unsupported, which I used in my demo <a href="https://lubosz.wordpress.com/2016/03/31/holochat-an-holographic-telecommunication-demo/" target="&rdquo;_blank&rdquo;">HoloChat</a> in 2015.</p> <p>This is why I decided to use OpenHMD as a minimal approach for initial VR sensor support in GStreamer. For broader headset support, and because I think it will be adapted as a standard, I will implement support for OSVR in the future of gst-plugins-vr.</p> <h2>What if I do not have an HMD?</h2> <p>No problem, you can view spherical videos and photos anyway. Currently you can compile gst-vr without OpenHMD and can view things with an arcball camera, without stereo. So you can still view spherical video projected correctly and navigate with your mouse. This fallback mode would probably be best done during run time.</p> <h2>But for VR you need stereo rendering and barrel distortion, right?</h2> <p>Right, they are the core components required in a VR renderer. Stereo rendering and projection according to IMU sensor happens in vrcompositor, which can also be used without a HMD with mouse controls.</p> <h3>The <em>hmdwarp</em> element</h3> <p>For computing the HMD lens distortion, or barrel distortion, I use a fragment shader based approach. I know that there are <a href="http://smus.com/vr-lens-distortion/" target="&rdquo;_blank&rdquo;">better methods</a> for doing this, but this seemed like a simple and quick solution, since it does not really eat up much performance.</p> <p>Currently the lens attributes are hardcoded for Oculus DK2, but I will soon support more HMDs, in particular the HTC Vive, and everything else that OSVR support could offer.</p> <pre>$ GST_GL_API=opengl gst-launch-1.0 gltestsrc ! hmdwarp ! glimagesink</pre> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-02-12-52-42.png" alt="Screenshot from 2016-07-02 12-52-42" width="100%" /></p> <h3>The <em>vrcompositor</em> element</h3> <p><img src="https://lubosz.files.wordpress.com/2016/07/gst-plugins-vr-design-11.png" alt="gst-plugins-vr Design (1)" width="100%" /></p> <pre>$ gst-launch-1.0 uridecodebin uri=file:///home/bmonkey/Videos/elephants.mp4 ! \ glupload ! glcolorconvert ! videorate ! vrcompositor ! \ video/x-raw\(memory:GLMemory\), width=1920, height=1080, framerate=75/1 ! \ hmdwarp ! gtkglsink</pre> <p>In this example pipeline I use GtkGLSink which works fine, but only provides a refresh rate of 60Hz, which is not really optimal for VR. This restriction may reside inside Gtk or window management, still need to investigate it, since the restriction also appears using the Gst Overlay API with Gtk.</p> <h2><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-02-12-48-54.png" alt="Screenshot from 2016-07-02 12-48-54" width="100%" /></h2> <h3>Viewing equirectangular projected photos</h3> <p><img src="https://lubosz.files.wordpress.com/2016/07/new.png" alt="new" width="100%" /></p> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-04-18-16-29.png" alt="Screenshot from 2016-07-04 18-16-29" width="100%" /></p> <p>You can just do an<a href="https://www.google.com/search?q=equirectangular&amp;tbm=isch"> image search of equirectangular</a> and will get plenty of images to view. Using imagefreeze in front of vrcompositor makes this possible. Image support is not implemented in SPHVR yet, but you can just run this pipeline:</p> <pre>$ gst-launch-1.0 uridecodebin uri=http://4.bp.blogspot.com/_4ZFfiaaptaQ/TNHjKAwjK6I/AAAAAAAAE30/IG2SO24XrDU/s1600/new.png ! \ imagefreeze ! glupload ! glcolorconvert ! vrcompositor ! \ video/x-raw\(memory:GLMemory\), width=1920, height=1080, framerate=75/1 ! \ hmdwarp ! glimagesink</pre> <h2>Multiple outputs?</h2> <p>In most VR applications a second output window is created to spectate the VR experience on the desktop. In SPHVR I use the tee element for creating 2 GL sinks and put them in 2 Gtk windows via the GStreamer Overlay api, since GtkGLSink still seems to have it&rsquo;s problems with tee.</p> <pre>$ GST_GL_XINITTHREADS=1 \ gst-launch-1.0 filesrc location=~/video.webm ! decodebin ! videoscale ! glupload ! glcolorconvert ! videorate ! vrcompositor ! video/x-raw\(memory:GLMemory\), width=1920, height=1080, framerate=75/1 ! hmdwarp ! tee name=t ! queue ! glimagesink t. ! queue ! glimagesink</pre> <h2>SPHVR</h2> <p><img src="https://lubosz.files.wordpress.com/2016/07/sphvr.png" alt="sphvr" width="100%" /></p> <p>Pronounced sphere, SPHVR is a python video player using gst-plugins-vr. Currently it is capable of opening a url of a equirectangular mapped spherical video.</p> <p>You need to configure your Oculus DK 2 screen to be to be horizontal, since I do not do a roation in SPHVR yet. Other HMDs also may not require this.</p> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-01-16-46-20.png" alt="Screenshot from 2016-07-01 16-46-20" width="100%" /></p> <p>SPHVR detects your DK2 display using GnomeDesktop and Gdk if available and opens a full screen VR window on it.</p> <p>To open a video</p> <pre>$ sphvr file:///home/bmonkey/Videos/elephants.mp4</pre> <h2>Sensors for spherical video</h2> <p>Spherical video sensors range from consumer devices like the <a href="https://theta360.com" target="&rdquo;_blank&rdquo;">Ricoh Theta</a> for $300 to the professional <a href="https://ozo.nokia.com/" target="&rdquo;_blank&rdquo;">Nokia Ozo</a> for $60,000. But in general you can just use 2 wide angle cameras and stitch them together correctly. This functionality is mostly found in photography software like <a href="http://hugin.sourceforge.net/" target="&rdquo;_blank&rdquo;">Hugin</a>, but will need to find a place in GStreamer soon. GSoC anyone?</p> <h2>Why is sphere + stereo still <em>meh</em>?</h2> <p>The other difficulty besides stitching in creating spherical video is of course stereoscopy. The parallax being different for every pixel and eye makes it difficult to be losslessly transformed from the sensor into the intermediate format and to the viewer. Nokia&rsquo;s Ozo records stereo with 8 stereo camera pairs in each direction, adjusted to a horizontal default eye separation assumption for the viewer. This means that rotating your head around the axis you are looking along (for example tilting the head to the right) will still produce a wrong parallax.</p> <p><a href="https://twitter.com/id_aa_carmack/status/563531551304974336" target="&rdquo;_blank&rdquo;">John Carmack stated in a tweet</a> that his best prerendered stereo VR experience was with renderings from Octane, a renderer from OTOY, who also created the well known <a href="https://www.youtube.com/watch?v=pXZ33YoKu9w" target="&rdquo;_blank&rdquo;">Brigate</a>, a path-tracer with real time capabilities. You can find the stereoscopic cube maps <a href="https://render.otoy.com/forum/viewtopic.php?f=98&amp;t=46185" target="&rdquo;_blank&rdquo;">on the internet</a>.</p> <p>So it is apparently possible to encode correct projection in a prerendered stereoscopic cube map, but I still assume that the stereo quality would be highly isotropic. Especially when translating the viewer position.</p> <p>With stereoscopic spherical video also no real depth information is stored, but we could encode our depth information projected spherically around the viewer if you like, so a spherical video + spherical depth texture constructed from whatever sensory, would be more immersive / correct than having 3D information as a plain stereo image. But this solution would lack the ability to move in the room.</p> <p>I think we should use should use a better format for storing 3D video.</p> <h2>Room-scale VR Video</h2> <p>If you want to walk around the stuff in your video, maybe one could call this holographic, you need a point cloud with absolute world positions. This of course could be converted into a vertex mesh with algorithms like <a href="https://en.wikipedia.org/wiki/Marching_tetrahedra" target="&rdquo;_blank&rdquo;">Marching Tetrahedra</a>, compressed and sent over the network.</p> <p>Real 3D sensors like laser scanners, or other time-of-flight cameras like the Kinect v2 are a good start. You can of course reconstruct 3D positions from a stereoscopic camera, and calculate a point cloud out of it, but this will also result in a point cloud.</p> <h3>Point clouds?</h3> <p>In a <a href="https://lubosz.wordpress.com/2016/03/29/viewing-kinect-v2-point-clouds-with-ros-in-arch-linux/" target="&rdquo;_blank&rdquo;">previous post</a> I was describing how to stream point clouds over the network with ROS, which I also did in <a href="https://lubosz.wordpress.com/2016/03/31/holochat-an-holographic-telecommunication-demo/" target="&rdquo;_blank&rdquo;">HoloChat</a>. Porting this functionality to GStreamer was always something that teased me, so I implemented a source for libfreenect2. This work is still pretty unfinished, since I need to implement 16bit float buffers in gst-video to transmit the full depth information from libfreenect2. So the point cloud projection is currently wrong, the color buffer is not currently mapped onto it, also no mesh is currently constructed. The code could also get some performance improving attention as well, but here are my first results.</p> <h3>The <em>freenect2src</em> and <em>pointcloudbuilder</em> elements.</h3> <p><img src="https://lubosz.files.wordpress.com/2016/07/gst-plugins-vr-design.png" alt="gst-plugins-vr Design" width="100%" /></p> <p>Show Kinectv2 infrared image</p> <pre>$ gst-launch-1.0 freenect2src sourcetype=2 ! glimagesink</pre> <p>or color image</p> <pre>$ gst-launch-1.0 freenect2src sourcetype=1 ! glimagesink</pre> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-04-14-48-23.png" alt="Screenshot from 2016-07-04 14-48-23" width="100%" /></p> <p>View a point cloud from the Kinect</p> <pre>$ gst-launch-1.0 freenect2src sourcetype=0 ! glupload ! glcolorconvert ! \ pointcloudbuilder ! video/x-raw\(memory:GLMemory\), width=1920, height=1080 ! \ glimagesink</pre> <p><img src="https://lubosz.files.wordpress.com/2016/07/screenshot-from-2016-07-04-14-50-53.png" alt="Screenshot from 2016-07-04 14-50-53" width="100%" /></p> <p>Since the point cloud is also a Gst3D scene, it can be already viewed with a HMD, and since it&rsquo;s part of GStreamer, it can be transmitted over the network for telepresence, but there is currently no example doing this yet. More to see in the future.</p> <h2>Distribution</h2> <p>You can find the source of <em>gst-plugins-vr</em> on <a href="https://github.com/lubosz/gst-plugins-vr" target="&rdquo;_blank&rdquo;">Github</a>. An Arch Linux package is available on the <a href="https://aur.archlinux.org/packages/gst-plugins-vr-git" target="&rdquo;_blank&rdquo;">AUR</a>. In the future I plan distribution via <a href="http://flatpak.org/" target="&rdquo;_blank&rdquo;">flatpak</a>.</p> <h2>Future</h2> <p>In the future I plan to implement more projections, for example 180&deg; / half cylinder stereo video and stereoscopic equirectangular spherical video. OSVR support, improving point cloud quality and point cloud to mesh construction via marching cubes or similar are also possible things to do. If you are interested to contribute, then feel free to <a href="https://github.com/lubosz/gst-plugins-vr" target="&rdquo;_blank&rdquo;">clone</a>.</p> <p style="text-align: center;"><a href="https://lubosz.wordpress.com/2016/07/04/introducing-gstreamer-vr-plug-ins-and-sphvr/" target="_blank" rel="noopener noreferrer"><br />Original post</a></p> [richtext] => 1 [template] => 15 [menuindex] => 50 [searchable] => 1 [cacheable] => 1 [createdby] => 11 [createdon] => 1473076142 [editedby] => 11 [editedon] => 1564761768 [deleted] => 0 [deletedon] => 0 [deletedby] => 0 [publishedon] => 1467645480 [publishedby] => 3 [menutitle] => [donthit] => 0 [privateweb] => 0 [privatemgr] => 0 [content_dispo] => 0 [hidemenu] => 1 [class_key] => Article [context_key] => web [content_type] => 1 [uri] => news-and-blog/blog/2016/07/04/introducing-gstreamer-vr-plug-ins-and-sphvr/ [uri_override] => 1 [hide_children_in_tree] => 0 [show_in_tree] => 0 [properties] => Array ( [articles] => Array ( [articleTemplate] => 15 [tplArticleRow] => HomepageNewsArticleTpl [updateServicesEnabled] => 1 [articlesRichtext] => 1 [sortBy] => publishedon [sortDir] => DESC [archivesIncludeTVs] => 1 [includeTVsList] => [archivesProcessTVs] => 0 [processTVsList] => [otherGetArchives] => [articleUriTemplate] => %Y/%m/%d/%alias/ [articlesPerPage] => 10 [pageLimit] => 5 [pageNavTpl] => <li[[+classes]]><a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageActiveTpl] => <li[[+activeClasses]]><a[[+activeClasses:default=` class="active"`]][[+title]] href="[[+href]]">[[+pageNo]]</a></li> [pageFirstTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">First</a></li> [pageLastTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">Last</a></li> [pagePrevTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&lt;&lt;</a></li> [pageNextTpl] => <li class="control"><a[[+classes]][[+title]] href="[[+href]]">&gt;&gt;</a></li> [pageOffset] => 0 [pageVarKey] => page [pageTotalVar] => total [pageNavVar] => page.nav [tplArchiveMonth] => row [archiveListingsLimit] => 10 [archiveByMonth] => 1 [archiveCls] => [archiveAltCls] => arc-row-alt [archiveGroupByYear] => 0 [archiveGroupByYearTpl] => sample.ArchiveGroupByYear [tplTagRow] => tag [tagsLimit] => 10 [tagCls] => tl-tag [tagAltCls] => tl-tag-alt [rssAlias] => feed.rss,rss [rssItems] => 10 [tplRssFeed] => sample.ArticlesRss [tplRssItem] => sample.ArticlesRssItem [latestPostsTpl] => sample.ArticlesLatestPostTpl [latestPostsLimit] => 5 [latestPostsOffset] => 0 [otherLatestPosts] => [notifyTwitter] => 0 [notifyTwitterConsumerKey] => [notifyTwitterConsumerKeySecret] => [notifyTwitterTpl] => [notifyTwitterTagLimit] => 3 [shorteningService] => tinyurl [commentsEnabled] => 1 [commentsThreaded] => 1 [commentsReplyResourceId] => 183 [commentsMaxDepth] => 20 [commentsRequirePreview] => 0 [commentsCloseAfter] => 0 [commentsDateFormat] => %b %d, %Y at %I:%M %p [commentsAutoConvertLinks] => 1 [commentsLimit] => 0 [commentsTplComment] => quipComment_JWD-Modal [commentsTplCommentOptions] => quipCommentOptions [commentsTplComments] => quipComments [commentsTplAddComment] => quipAddComment_JW [commentsTplLoginToComment] => quipLoginToComment [commentsTplPreview] => quipPreviewComment [commentsUseCss] => 1 [commentsAltRowCss] => quip-comment-alt [commentsSortDir] => ASC [commentsRequireAuth] => 0 [commentsModerate] => 1 [commentsModerators] => [commentsModeratorGroup] => Administrator [commentsModerateAnonymousOnly] => 0 [commentsModerateFirstPostOnly] => 1 [commentsReCaptcha] => 1 [commentsDisableReCaptchaWhenLoggedIn] => 1 [commentsAllowRemove] => 1 [commentsRemoveThreshold] => 3 [commentsAllowReportAsSpam] => 1 [latestCommentsTpl] => quipLatestComment [latestCommentsLimit] => 10 [latestCommentsBodyLimit] => 300 [latestCommentsRowCss] => quip-latest-comment [latestCommentsAltRowCss] => quip-latest-comment-alt [commentsGravatar] => 0 [commentsGravatarIcon] => identicon [commentsGravatarSize] => 50 [commentsNameField] => name [commentsShowAnonymousName] => 0 [commentsAnonymousName] => Anonymous [notificationServices] => [articlesPublished] => ) ) [BlogAndNewsArticleSource] => Blog [BlogAndNewsSummaryImage] => &amp;amp;amp;amp;amp;amp;nbsp; [BlogAndNewsSummaryImageClass] => DontShowMe [BlogAuthorName] => <a href="[[~[[*parent]]]]author/[[*publishedby:userinfo=`fullname`]]">[[*publishedby:userinfo=`fullname`]]</a> [NewsAndBlogArticle_isFeatured] => No [idx] => 192 [link] => )

Search the newsroom

Upcoming Events

Here are the online events we'll be attending in the coming weeks – join us!

DjangoCon Europe

2-6 June, Online

Live Embedded Event

3 June, Online

Akademy 2021

18-25 June, Online

Open Since 2005 logo

We use cookies on this website to ensure that you get the best experience. By continuing to use this website you are consenting to the use of these cookies. To find out more please follow this link.

Collabora Ltd © 2005-2021. All rights reserved. Privacy Notice. Sitemap.

Collabora Limited is registered in England and Wales. Company Registration number: 5513718. Registered office: The Platinum Building, St John's Innovation Park, Cambridge, CB4 0DS, United Kingdom. VAT number: 874 1630 19.