Commit Graph

85 Commits

Author SHA1 Message Date
sotaro
9e2c6afa08 Bug 1727511 - Add mozlog around WebRenderBridgeParent and RenderThread r=gfx-reviewers,jrmuizel,aosmond
Differential Revision: https://phabricator.services.mozilla.com/D123616
2021-09-01 22:27:15 +00:00
criss
7bdf12d8cb Backed out changeset 25acfe977062 (bug 1727511) for causing valgrind build bustages. CLOSED TREE 2021-08-27 18:24:28 +03:00
sotaro
8d3454c2ea Bug 1727511 - Add mozlog around WebRenderBridgeParent and RenderThread r=gfx-reviewers,jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D123616
2021-08-27 06:37:32 +00:00
Nicolas Silva
dfc9df51f1 Bug 1711648 - Move all device rects to the Box2D representations. r=jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D116401
2021-06-02 12:47:03 +00:00
Csoregi Natalia
7ed99ffc26 Backed out 3 changesets (bug 1713544, bug 1711648) for valgrind failures. CLOSED TREE
Backed out changeset 9449ea40b4fd (bug 1713544)
Backed out changeset 3d51bfaa0d8d (bug 1711648)
Backed out changeset c6c83dc97cbb (bug 1711648)
2021-06-02 10:43:16 +03:00
Nicolas Silva
f5d56e52c1 Bug 1711648 - Move all device rects to the Box2D representations. r=jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D116401

Depends on D116266
2021-06-01 21:25:19 +00:00
Butkovits Atila
4743378987 Backed out 2 changesets (bug 1711648) for causing wrench bustages. CLOSED TREE
Backed out changeset 7f1ae1fdd305 (bug 1711648)
Backed out changeset 71807d4e6302 (bug 1711648)
2021-06-02 01:28:29 +03:00
Nicolas Silva
fec70994ee Bug 1711648 - Move all device rects to the Box2D representations. r=jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D116401
2021-06-01 21:25:19 +00:00
Butkovits Atila
4678b0836d Backed out 2 changesets (bug 1711648) for causing failures at grid-max-sizing-flex-002.html. CLOSED TREE
Backed out changeset 9cf4e612dbac (bug 1711648)
Backed out changeset 7d8bba559407 (bug 1711648)
2021-06-01 21:07:34 +03:00
Nicolas Silva
91ac17f69b Bug 1711648 - Move all device rects to the Box2D representations. r=jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D116401
2021-06-01 16:30:36 +00:00
Robert Mader
59e46e798f Bug 1707943 - webrender_bindings: Fix warnings and apply suggestions form static analysis, r=gfx-reviewers,lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D113603
2021-04-28 12:33:55 +00:00
sotaro
dd7550af55 Bug 1700524 - Rename aWebRender of CreateForCompositorWidget() to aHardwareWebRender r=jgilbert
Differential Revision: https://phabricator.services.mozilla.com/D109570
2021-04-07 07:04:43 +00:00
sotaro
cc4e95e6f8 Bug 1699001 - Rename RenderThread::SharedGL() to SingletonGL() r=nical
Name of Singleton is commonly used in gecko.

Name of SharedGL is confusing. It looks like "shared context", but it is not. The GL context is actually a singleton GLContext that is used by all WebRender. Each window creates one EGLSurface for each window. EGLSurface is switched for each window rendering.

Differential Revision: https://phabricator.services.mozilla.com/D108714
2021-03-17 10:51:45 +00:00
Lee Salzman
f2b951d560 Bug 1690216 - Report whether to redraw on invalidation to WR. r=mattwoodrow
This requires us to plumb CompositorCapabilities to support the extra field.
This is complicated by the fact that since it is a Rust struct, it has no
default constructor that can pass through to C++ via bindings, so every
one of our RenderCompositors was forced to manually initialize fields. To
get around this brittle footgun, instead the structure is initialized on
the Rust side, and RenderCompositor's are encouraged to only change fields
that actually diverge from the defaults as passed in via pointer.

Finally, we can then do what we need to do, which is just to send the
ForceRedraw message that needs to happen based on what we know about
CompositorCapabilities.

Differential Revision: https://phabricator.services.mozilla.com/D106246
2021-02-24 14:15:02 +00:00
Andreea Pavel
3c934f9d83 Backed out changeset 45b36995cfd6 (bug 1690216) for build bustages at rules.mk on a CLOSED TREE 2021-02-24 12:03:14 +02:00
Lee Salzman
67c54b658a Bug 1690216 - Report whether to redraw on invalidation to WR. r=mattwoodrow
This requires us to plumb CompositorCapabilities to support the extra field.
This is complicated by the fact that since it is a Rust struct, it has no
default constructor that can pass through to C++ via bindings, so every
one of our RenderCompositors was forced to manually initialize fields. To
get around this brittle footgun, instead the structure is initialized on
the Rust side, and RenderCompositor's are encouraged to only change fields
that actually diverge from the defaults as passed in via pointer.

Finally, we can then do what we need to do, which is just to send the
ForceRedraw message that needs to happen based on what we know about
CompositorCapabilities.

Differential Revision: https://phabricator.services.mozilla.com/D106246
2021-02-24 09:18:33 +00:00
Andi-Bogdan Postelnicu
e108aea832 Bug 1683551 - Make gfx buildable outside of unified-build environment. r=sg,jgilbert
Differential Revision: https://phabricator.services.mozilla.com/D100209
2021-01-04 14:20:17 +00:00
Andrew Osmond
e429a54b27 Bug 1677165 - Add support for partial present to GLX. r=kvark,jgilbert
This adds support for GLX_EXT_buffer_age if available to minimize how
much must be redrawn when using GLX.

Differential Revision: https://phabricator.services.mozilla.com/D93098
2020-11-13 18:41:41 +00:00
Jamie Nicol
865bdbc9b6 Bug 1670014 - Delay querying buffer age until it is actually needed. r=sotaro
Currently we query the backbuffer age in
RenderCompositor::BeginFrame(). Querying the age on android requires
the driver to dequeue a new backbuffer. By doing this right at the
start of the frame, we may cause the driver to block until a buffer is
ready.

We don't actually need the buffer age until part way through
rendering, in Renderer::composite_simple(), by which point there is a
better chance the buffer is available. So move the query to there instead.

Differential Revision: https://phabricator.services.mozilla.com/D92950
2020-10-09 08:25:43 +00:00
Jamie Nicol
a11b105e44 Bug 1575765 - Implement KHR_partial_update for webrender. r=sotaro,jgilbert
KHR_partial_update allows us to avoid rerendering the entire
backbuffer every frame, and instead only render what has changed on
the current frame, as well as the difference between the current
backbuffer and the current frontbuffer. It works similarily to
EXT_buffer_age, which we already support, with the additional
requirement that we must call eglSetDamageRegion each frame before
rendering to the backbuffer.

Modify GLContextEGL::GetBufferAge() so that it queries the age if
either EXT_buffer_age or KHR_partial_update are available. This will
now automatically be queried by webrender through the
PartialPresentCompositor trait. Add a new function to that trait,
set_buffer_damage_region(), whose RenderCompositorEGL implementation
calls eglSetDamageRegion(). Call this from composite_simple(), once
the damage rect has been calculated but before rendering to the
backbuffer.

Additionally, change both RenderCompositorEGL and
RenderCompositorOGL's implementations of
ShouldDrawPreviousPartialPresentRegions() to unconditionally return
true, rather than checking for the existence of EXT_buffer_age (or
adding a new check for KHR_partial_update). The lack of these
extensions does not mean that webrender is able to skip rendering
previous frames' damage. Rather the opposite, it means we cannot
render *only* the previous frames' damage, and must instead always
render the entire buffer.

Differential Revision: https://phabricator.services.mozilla.com/D91203
2020-10-02 10:23:56 +00:00
Jamie Nicol
1b8073d86c Bug 1656533 - Handle buffer ages other than 2 for EGL_EXT_buffer_age. r=sotaro,gw
Add a trait PartialPresentCompositor with a function get_buffer_age(),
and allow gecko to pass an implementation to webrender during
initialization. This allows webrender to query the age of the current
backbuffer during compositing.

Make webrender track the previous 2 frame's dirty rects, rather than
just the previous 1 frame's, allowing it to calculate the total damage
rect for buffer ages of up to 3. If the age is greater than 3, treat
the entire buffer as invalid. Also handle special cases of ages 0 and
1, 0 meaning the entire buffer is invalid, and 1 meaning the entire
buffer is valid. Make gecko stop requesting a full render for buffer
ages other than 2, as webrender can now handle these cases itself.

Differential Revision: https://phabricator.services.mozilla.com/D91202
2020-10-02 10:23:49 +00:00
Razvan Maries
9356bf347d Backed out 3 changesets (bug 1656533, bug 1575765) for WebRender bustages. CLOSED TREE
Backed out changeset 84c31fd9ff82 (bug 1575765)
Backed out changeset 48c1532d1d9d (bug 1575765)
Backed out changeset ed9075d9319b (bug 1656533)
2020-10-02 12:51:55 +03:00
Jamie Nicol
22e1801c99 Bug 1575765 - Implement KHR_partial_update for webrender. r=sotaro,jgilbert
KHR_partial_update allows us to avoid rerendering the entire
backbuffer every frame, and instead only render what has changed on
the current frame, as well as the difference between the current
backbuffer and the current frontbuffer. It works similarily to
EXT_buffer_age, which we already support, with the additional
requirement that we must call eglSetDamageRegion each frame before
rendering to the backbuffer.

Modify GLContextEGL::GetBufferAge() so that it queries the age if
either EXT_buffer_age or KHR_partial_update are available. This will
now automatically be queried by webrender through the
PartialPresentCompositor trait. Add a new function to that trait,
set_buffer_damage_region(), whose RenderCompositorEGL implementation
calls eglSetDamageRegion(). Call this from composite_simple(), once
the damage rect has been calculated but before rendering to the
backbuffer.

Additionally, change both RenderCompositorEGL and
RenderCompositorOGL's implementations of
ShouldDrawPreviousPartialPresentRegions() to unconditionally return
true, rather than checking for the existence of EXT_buffer_age (or
adding a new check for KHR_partial_update). The lack of these
extensions does not mean that webrender is able to skip rendering
previous frames' damage. Rather the opposite, it means we cannot
render *only* the previous frames' damage, and must instead always
render the entire buffer.

Differential Revision: https://phabricator.services.mozilla.com/D91203
2020-10-02 08:38:29 +00:00
Jamie Nicol
58f32d6db4 Bug 1656533 - Handle buffer ages other than 2 for EGL_EXT_buffer_age. r=sotaro,gw
Add a trait PartialPresentCompositor with a function get_buffer_age(),
and allow gecko to pass an implementation to webrender during
initialization. This allows webrender to query the age of the current
backbuffer during compositing.

Make webrender track the previous 2 frame's dirty rects, rather than
just the previous 1 frame's, allowing it to calculate the total damage
rect for buffer ages of up to 3. If the age is greater than 3, treat
the entire buffer as invalid. Also handle special cases of ages 0 and
1, 0 meaning the entire buffer is invalid, and 1 meaning the entire
buffer is valid. Make gecko stop requesting a full render for buffer
ages other than 2, as webrender can now handle these cases itself.

Differential Revision: https://phabricator.services.mozilla.com/D91202
2020-10-02 09:04:09 +00:00
Jamie Nicol
fa23276919 Bug 1640858 - Fix damage region calculation for eglSwapBuffersWithDamage. r=sotaro
Webrender provides dirty rects with a top-left origin, whereas EGL
requires bottom-left. We also clamp the region to the framebuffer size
prior to passing it to EGL. There was a bug in this calculation when
the dirty rect had a negative y-offset and a height greater than the
framebuffer's height. This was causing too little of the screen to be
updated in some circumstances, resulting in stale content.

Note that this is only an issue when
gfx.webrender.max-partial-present-rects != 0.

Differential Revision: https://phabricator.services.mozilla.com/D91714
2020-09-30 12:53:13 +00:00
Andrew Osmond
4293d9970a Bug 1664560 - Expose yet more WebRender initialization failure error messages to telemetry. r=kvark
Differential Revision: https://phabricator.services.mozilla.com/D89966
2020-09-11 22:40:40 +00:00
sotaro
2484fe1c65 Bug 1661197 - Initialize mBufferAge at constructor r=jnicol
Differential Revision: https://phabricator.services.mozilla.com/D88246
2020-08-26 10:50:44 +00:00
Robert Mader
0523f63aec Bug 1656472 - [X11] Drop CopySubBufferMESA and add SwapBuffersWithDamage support, r=nical
This largely reverts D81868, only keeping what's needed to make SwapBuffersWithDamage
work, and also adds BufferAge support to RenderCompositorOGL.

Differential Revision: https://phabricator.services.mozilla.com/D85565
2020-07-31 16:13:54 +00:00
Nicolas Silva
93393da106 Bug 1625070 - Use glxCopySubBufferMESA when available if partial present and WebRender are enabled on GLX. r=jgilbert
Differential Revision: https://phabricator.services.mozilla.com/D81868
2020-07-16 14:44:41 +00:00
Narcis Beleuzu
adf20db9a5 Backed out changeset 74a508f9bac4 (bug 1625070) for wr failure on position-sticky-scroll-reposition.html . CLOSED TREE 2020-07-16 13:03:13 +03:00
Nicolas Silva
ffa2bf2ba3 Bug 1625070 - Use glxCopySubBufferMESA when available if partial present and WebRender are enabled on GLX. r=jgilbert
Differential Revision: https://phabricator.services.mozilla.com/D81868
2020-07-15 18:20:48 +00:00
Lee Salzman
5bb34e3cdb Bug 1646835 - refactor RenderCompositorOGL into RenderCompositorNative. r=mstange
RenderCompositorOGL currently has many responsibilities including supporting
OpenGL compositor for Linux, whole-window compositing for Mac NativeLayerCA,
and per-cache-tile compositing for Mac NativeLayerCA. With the addition of
support for SWGL, this becomes even further complicated.

It becomes advantageous to separate out RenderCompositorOGL specifically as
only the basic OpenGL compositing case, as that naturally yields a simple and
isolated RenderCompositor.

What is left over becomes RenderCompositorNative, a basis for implementing
NativeLayer-based RenderCompositors. To cleanly isolate state and details of
when HW compositing or SW compositing is being used, these are further split
off into RCNativeOGL and RCNativeSWGL versions that deal with specific
isolated details of OpenGL and SWGL respectively.

RCNativeOGL deals with just setting up OpenGL FBOs for NativeLayers.

RCNativeSWGL's new task is just to deal mapping NativeLayers and providing
SWGL FBOs for them without involving OpenGL.

Differential Revision: https://phabricator.services.mozilla.com/D80270
2020-06-23 23:54:24 +00:00
Lee Salzman
0c0cce07b5 Bug 1646835 - add MapTile/UnmapTile hooks to the WR compositor. r=mstange
RenderCompositors for SWGL that wish to provide accelerated compositing need to
subvert the existing Bind/Unbind hooks in the WR compositor. These compositors
need to keep track of their HW tiles without actually binding an OpenGL FBO
for WR to render picture cache tiles. SWGL needs to intervene and get a backing
buffer for tile from the RenderCompositor so that it can create a SWGL FBO for
WR to render the picture cache tile to.

To that end, this adds MapTile/UnmapTile as a replacement for Bind/Unbind for
those scenarios. This is done in a way that it affects only the WrCompositor of
webrender_bindings without actually altering WR's Compositor interface. This is
beneficial because WR does not have to understand the details of SWGL
integration and also so as not to complicate other users of WR such as Servo
who are not currently utilizing SWGL at all.

RenderCompositorOGL is initially modified to use these hooks in this patch. It
later became more convenient to restructure that in a follow-up patch.

Differential Revision: https://phabricator.services.mozilla.com/D80269
2020-06-23 23:55:11 +00:00
Markus Stange
704a42045c Bug 1646066 - Make partial valid rects work properly in NativeLayerCA. r=jrmuizel
This moves the clipping responsibility into the layer. It also brings back
assertions that make sure that no invalid content reaches the screen.
On the layer side I'm renaming validRect to displayRect, because at the time
NextSurface* is called, that rect is not yet valid.
This implementation also allows having valid content outside of the display
rect. So, for example, if you grow and shrink the display rect multiple times
but most of the outer parts are transparent, in theory this allows you to paint
the transparent pixels only once rather than every time the display rect
expands.

Differential Revision: https://phabricator.services.mozilla.com/D79842
2020-06-18 22:15:22 +00:00
sotaro
48ed857758 Bug 1633303 - Add glDebugCallback support to non shared gl context with WebRender r=gw
Bug 1632096 added the capability to shared gl context with WebRender. This bug extends the support to non shared gl context.

Differential Revision: https://phabricator.services.mozilla.com/D72579
2020-04-27 02:51:48 +00:00
Glenn Watson
feb7241c8d Bug 1620147 - Fix virtual surface coords being outside bounds. r=Bert,sotaro
This adds support for tracking and invalidating tiles based on a
movable virtual offset.

Differential Revision: https://phabricator.services.mozilla.com/D65687
2020-03-10 02:17:35 +00:00
Emilio Cobos Álvarez
193e6c4f14 Bug 1616395 - Remove FfiVec. r=jrmuizel
Use ThinVec instead, which is compatible with nsTArray, and makes stuff much
harder to misuse.

Differential Revision: https://phabricator.services.mozilla.com/D63256
2020-02-19 18:34:51 +00:00
Glenn Watson
1c92506217 Bug 1608717 - Support per-tile clip (valid) region for native compositor implementations. r=sotaro,mstange
For Draw (non-native) and CA modes, we include the per-tile
valid rect in the clip rect from the surface.

For DC (non-virtual) mode, a per-tile clip rect is set on the
visual for each tile, separate from the overall clip rect that
is set on the surface visual.

For DC (virtual) mode, the Trim API is used to remove pixels
in the virtual tile area that are outside the valid / clipped
region.

Note: Although the valid rect is now applied in the native
compositors, it's currently only based on the overall picture
cache bounding rect. Thus, with this patch there isn't any
noticeable performance improvement. Once this lands and is
working correctly, the follow up patch to calculate a smaller
valid region per-tile is a small amount of work.

Differential Revision: https://phabricator.services.mozilla.com/D61424
2020-02-12 04:27:15 +00:00
Markus Stange
d00b7da1b7 Bug 1606608 - Fix mTotalPixelCount bug and do some cleanup. r=gw
This fixes RenderCompositorOGL::DestroySurface to update mTotalPixelCount as needed when there are still tiles in the surface that's getting removed.

I'm also adding a few asserts and performing some minor cleanup.

Differential Revision: https://phabricator.services.mozilla.com/D58518
2020-01-08 16:30:18 +00:00
Glenn Watson
c1ef1223d7 Bug 1604684 - Make opacity a compositor surface property rather than a tile property. r=sotaro
This will allow use of the DirectComposition virtual surface API. If
it turns out that some pages recreate surfaces a lot due to opacity
changing, we can add some extra logic to avoid recreating surfaces
as often, and making use of per-tile opacity in some cases.

Differential Revision: https://phabricator.services.mozilla.com/D57592
2020-01-06 20:11:21 +00:00
Markus Stange
0c0f36a79b Bug 1592026 - When using the OS compositor with WebRender on macOS, use NativeLayerRootSnapshotter for reftest readback. r=jrmuizel
Differential Revision: https://phabricator.services.mozilla.com/D57070
2019-12-29 12:41:58 +00:00
Markus Stange
e549fcf3d8 Bug 1592026 - Move NativeLayerRoot::CommitToScreen call from PostRender into the compositors. r=jrmuizel
This makes it more similar to how SwapBuffers was used.
This patch also makes us call glFlush directly when using native layers, rather than going through the misleadingly-named GLContext::SwapBuffers method.

Differential Revision: https://phabricator.services.mozilla.com/D57062
2019-12-29 12:41:04 +00:00
Markus Stange
abf4ee301e Bug 1592044 - Reduce the frequency of IOSurface and framebuffer creation and destruction with the help of a surface pool. r=jgilbert
There are multiple SurfacePools: Main thread painting and the non-WebRender compositors create a new pool per window, and WebRender creates one shared pool across all windows. The non-WebRender users set the pool size limit to zero, i.e. no recycling across paints. This preserves the pre-existing behavior.
WebRender's pool size is configurable with the gfx.webrender.compositor.surface-pool-size pref.
Every window holds on to a SurfacePoolHandle. A SurfacePoolHandle has an owning reference to the pool, via a surface pool wrapper. Once all handles are gone, the surface pool goes away, too.
The SurfacePool holds on to IOSurfaces and MozFramebuffers. Both are created on demand, independently, but are associated with each other.
A given NativeLayer uses only one surface pool handle during its lifetime. The native layer no longer influences which GLContext its framebuffers are created for; the GL context is now managed by the surface pool handle.
As a result, a NativeLayer can no longer change which GLContext its framebuffers are created by.
So in the future, if we ever need to migrate a window frome one GLContext to another, we will need to recreate the NativeLayers inside it. I think that's ok.

Differential Revision: https://phabricator.services.mozilla.com/D54859
2019-12-18 21:01:51 +00:00
Glenn Watson
3c9d5805ca Bug 1604383 - Refactor the Compositor trait to allow support for DC virtual surface API. r=mstange,sotaro
Differential Revision: https://phabricator.services.mozilla.com/D57415
2019-12-17 21:44:03 +00:00
sotaro
51826b950c Bug 1603676 - Move picture caching check for WR compositor to Feature::WEBRENDER_COMPOSITOR check r=gw
about:support could have an information that WR compositor is disabled by disabling picture caching.

Differential Revision: https://phabricator.services.mozilla.com/D57266
2019-12-16 03:50:31 +00:00
Glenn Watson
f7d16b45ba Bug 1603207 - Only enable native compositor if picture caching enabled. r=sotaro
Differential Revision: https://phabricator.services.mozilla.com/D56817
2019-12-12 00:08:38 +00:00
sotaro
297852b92e Bug 1602511 - Blacklist webrender compositor on Intel HD 520 r=gw
Differential Revision: https://phabricator.services.mozilla.com/D56535
2019-12-10 19:16:13 +00:00
Markus Stange
2f496f307d Bug 1599609 - Add mTotalPixelCount to get accurate memory usage reporting in WR OS comppositor profiler markers. r=sotaro
Differential Revision: https://phabricator.services.mozilla.com/D54857
2019-11-27 23:07:26 +00:00
Markus Stange
b6fde88d32 Bug 1599609 - Change printf to a profiler text marker. r=sotaro
Differential Revision: https://phabricator.services.mozilla.com/D54856
2019-11-27 23:07:51 +00:00
Markus Stange
65b339e028 Bug 1599605 - Crash when DestroySurface is called with an unknown ID. r=gw
Differential Revision: https://phabricator.services.mozilla.com/D54854
2019-11-27 02:38:49 +00:00