Closed Bug 1654723 Opened 1 year ago Closed 1 year ago

Scrolling is very laggy on image gallery on drive.google.com

Categories

(Core :: Graphics, defect, P2)

80 Branch
Unspecified
Android
defect

Tracking

()

RESOLVED FIXED
82 Branch
Webcompat Priority ?
Tracking Status
firefox80 --- wontfix
firefox81 --- wontfix
firefox82 --- fixed

People

(Reporter: karlcow, Assigned: jnicol)

References

(Depends on 1 open bug, Blocks 2 open bugs, )

Details

(Keywords: regressionwindow-wanted)

Attachments

(3 files)

  1. Go to https://drive.google.com/drive/mobile/folders/1VLwoS_eViWx8e3IQ8lUWTK88pkacwIM2
  2. Scroll

Expected:
smooth scroll

Actual:
Super laggy (This is smooth in Chrome Canary)

Performance profile.
https://share.firefox.dev/39i20gq

The initial reporter seems to say that it is not reproducible in beta.

about:support

Application Basics
------------------

Name: Firefox Nightly
Version: 80.0a1
Build ID: 20200720094507
Distribution ID:
User Agent: Mozilla/5.0 (Android 10; Mobile; rv:80.0) Gecko/80.0 Firefox/80.0
OS: Linux 29 #1 SMP PREEMPT Sat May 9 01:12:48 UTC 2020
Multiprocess Windows: 0/0 Enabled by default
Remote Processes: 1
Google Location Service Key: Found
Google Safebrowsing Key: Found
Mozilla Location Service Key: Found
Safe Mode: false

Crash Reports for the Last 3 Days
---------------------------------

Nightly Features
----------------

Remote Processes
----------------

Type: Web Content
Count: 1 / 1

Add-ons
-------

Name: Mozilla Android Components - Ads
Type: extension
Version: 51.0.20200721130108.0722061304
Enabled: true
ID: ads@mozac.org

Name: Mozilla Android Components - Browser Icons
Type: extension
Version: 51.0.20200721130108.0721130510
Enabled: true
ID: icons@mozac.org

Name: Mozilla Android Components - Cookies
Type: extension
Version: 51.0.20200721130108.0722061304
Enabled: true
ID: cookies@mozac.org

Name: Mozilla Android Components - Firefox Accounts WebChannel
Type: extension
Version: 51.0.20200721130108.0721130519
Enabled: true
ID: fxa@mozac.org

Name: Mozilla Android Components - ReaderView
Type: extension
Version: 51.0.20200721130108.0721130511
Enabled: true
ID: readerview@mozac.org

Name: Web Compat
Type: extension
Version: 12.0.0
Enabled: true
ID: webcompat@mozilla.org

Name: WebCompat Reporter
Type: extension
Version: 1.3.0
Enabled: true
ID: webcompat-reporter@mozilla.org

Graphics
--------

Features
Compositing: WebRender
Asynchronous Pan/Zoom: touch input enabled; autoscroll enabled; smooth pinch-zoom enabled
WebGL 1 Driver WSI Info: EGL_VENDOR: Android EGL_VERSION: 1.5 Android META-EGL EGL_EXTENSIONS: EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time EGL_KHR_swap_buffers_with_damage EGL_ANDROID_get_native_client_buffer EGL_ANDROID_front_buffer_auto_refresh EGL_ANDROID_get_frame_timestamps EGL_EXT_surface_SMPTE2086_metadata EGL_EXT_surface_CTA861_3_metadata EGL_KHR_image EGL_KHR_image_base EGL_EXT_image_gl_colorspace EGL_KHR_lock_surface EGL_KHR_gl_colorspace EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_create_context EGL_KHR_surfaceless_context EGL_EXT_create_context_robustness EGL_ANDROID_image_native_buffer EGL_KHR_wait_sync EGL_ANDROID_recordable EGL_KHR_partial_update EGL_EXT_pixel_format_float EGL_KHR_create_context_no_error EGL_KHR_mutable_render_buffer EGL_EXT_yuv_surface EGL_EXT_protected_content EGL_IMG_context_priority EGL_KHR_no_config_context
WebGL 1 Driver Renderer: Qualcomm -- Adreno (TM) 540
WebGL 1 Driver Version: OpenGL ES 3.2 V@385.0 (GIT@bc00834, I609ab310b2) (Date:04/11/19)
WebGL 1 Driver Extensions: GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_OES_texture_compression_astc GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_read_format_bgra GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_EXT_texture_format_sRGB_override GL_OES_element_index_uint GL_EXT_copy_image GL_EXT_geometry_shader GL_EXT_tessellation_shader GL_OES_texture_stencil8 GL_EXT_shader_io_blocks GL_OES_shader_image_atomic GL_OES_sample_variables GL_EXT_texture_border_clamp GL_EXT_EGL_image_external_wrap_modes GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_OES_shader_multisample_interpolation GL_EXT_texture_cube_map_array GL_EXT_draw_buffers_indexed GL_EXT_gpu_shader5 GL_EXT_robustness GL_EXT_texture_buffer GL_EXT_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_OES_texture_storage_multisample_2d_array GL_OES_sample_shading GL_OES_get_program_binary GL_EXT_debug_label GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_QCOM_tiled_rendering GL_ANDROID_extension_pack_es31a GL_EXT_primitive_bounding_box GL_OES_standard_derivatives GL_OES_vertex_array_object GL_EXT_disjoint_timer_query GL_KHR_debug GL_EXT_YUV_target GL_EXT_sRGB_write_control GL_EXT_texture_norm16 GL_EXT_discard_framebuffer GL_OES_surfaceless_context GL_OVR_multiview GL_OVR_multiview2 GL_EXT_texture_sRGB_R8 GL_KHR_no_error GL_EXT_debug_marker GL_OES_EGL_image_external_essl3 GL_OVR_multiview_multisampled_render_to_texture GL_EXT_buffer_storage GL_EXT_external_buffer GL_EXT_blit_framebuffer_params GL_EXT_clip_cull_distance GL_EXT_protected_textures GL_EXT_shader_non_constant_global_initializers GL_QCOM_texture_foveated GL_QCOM_shader_framebuffer_fetch_noncoherent GL_QCOM_shader_framebuffer_fetch_rate GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_EGL_image_array GL_NV_shader_noperspective_interpolation GL_KHR_robust_buffer_access_behavior GL_EXT_EGL_image_storage GL_EXT_blend_func_extended GL_EXT_clip_control GL_OES_texture_view GL_EXT_fragment_invocation_density
WebGL 1 Extensions: ANGLE_instanced_arrays EXT_blend_minmax EXT_color_buffer_half_float EXT_float_blend EXT_sRGB EXT_texture_filter_anisotropic MOZ_debug OES_element_index_uint OES_fbo_render_mipmap OES_standard_derivatives OES_texture_float OES_texture_float_linear OES_texture_half_float OES_texture_half_float_linear OES_vertex_array_object WEBGL_color_buffer_float WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_depth_texture WEBGL_lose_context
WebGL 2 Driver WSI Info: EGL_VENDOR: Android EGL_VERSION: 1.5 Android META-EGL EGL_EXTENSIONS: EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time EGL_KHR_swap_buffers_with_damage EGL_ANDROID_get_native_client_buffer EGL_ANDROID_front_buffer_auto_refresh EGL_ANDROID_get_frame_timestamps EGL_EXT_surface_SMPTE2086_metadata EGL_EXT_surface_CTA861_3_metadata EGL_KHR_image EGL_KHR_image_base EGL_EXT_image_gl_colorspace EGL_KHR_lock_surface EGL_KHR_gl_colorspace EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_create_context EGL_KHR_surfaceless_context EGL_EXT_create_context_robustness EGL_ANDROID_image_native_buffer EGL_KHR_wait_sync EGL_ANDROID_recordable EGL_KHR_partial_update EGL_EXT_pixel_format_float EGL_KHR_create_context_no_error EGL_KHR_mutable_render_buffer EGL_EXT_yuv_surface EGL_EXT_protected_content EGL_IMG_context_priority EGL_KHR_no_config_context
WebGL 2 Driver Renderer: Qualcomm -- Adreno (TM) 540
WebGL 2 Driver Version: OpenGL ES 3.2 V@385.0 (GIT@bc00834, I609ab310b2) (Date:04/11/19)
WebGL 2 Driver Extensions: GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_OES_texture_compression_astc GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_read_format_bgra GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_EXT_texture_format_sRGB_override GL_OES_element_index_uint GL_EXT_copy_image GL_EXT_geometry_shader GL_EXT_tessellation_shader GL_OES_texture_stencil8 GL_EXT_shader_io_blocks GL_OES_shader_image_atomic GL_OES_sample_variables GL_EXT_texture_border_clamp GL_EXT_EGL_image_external_wrap_modes GL_EXT_multisampled_render_to_texture GL_EXT_multisampled_render_to_texture2 GL_OES_shader_multisample_interpolation GL_EXT_texture_cube_map_array GL_EXT_draw_buffers_indexed GL_EXT_gpu_shader5 GL_EXT_robustness GL_EXT_texture_buffer GL_EXT_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_OES_texture_storage_multisample_2d_array GL_OES_sample_shading GL_OES_get_program_binary GL_EXT_debug_label GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_QCOM_tiled_rendering GL_ANDROID_extension_pack_es31a GL_EXT_primitive_bounding_box GL_OES_standard_derivatives GL_OES_vertex_array_object GL_EXT_disjoint_timer_query GL_KHR_debug GL_EXT_YUV_target GL_EXT_sRGB_write_control GL_EXT_texture_norm16 GL_EXT_discard_framebuffer GL_OES_surfaceless_context GL_OVR_multiview GL_OVR_multiview2 GL_EXT_texture_sRGB_R8 GL_KHR_no_error GL_EXT_debug_marker GL_OES_EGL_image_external_essl3 GL_OVR_multiview_multisampled_render_to_texture GL_EXT_buffer_storage GL_EXT_external_buffer GL_EXT_blit_framebuffer_params GL_EXT_clip_cull_distance GL_EXT_protected_textures GL_EXT_shader_non_constant_global_initializers GL_QCOM_texture_foveated GL_QCOM_shader_framebuffer_fetch_noncoherent GL_QCOM_shader_framebuffer_fetch_rate GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_EGL_image_array GL_NV_shader_noperspective_interpolation GL_KHR_robust_buffer_access_behavior GL_EXT_EGL_image_storage GL_EXT_blend_func_extended GL_EXT_clip_control GL_OES_texture_view GL_EXT_fragment_invocation_density
WebGL 2 Extensions: EXT_color_buffer_float EXT_float_blend EXT_texture_filter_anisotropic MOZ_debug OES_texture_float_linear OVR_multiview2 WEBGL_compressed_texture_astc WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context
Uses Tiling: true
Uses Tiling (Content): true
Target Frame Rate: 60
GPU #1
Active: Yes
Description: Model: Pixel 2, Product: walleye, Manufacturer: Google, Hardware: walleye, OpenGL: Qualcomm -- Adreno (TM) 540 -- OpenGL ES 3.2 V@385.0 (GIT@bc00834, I609ab310b2) (Date:04/11/19)
Vendor ID: Qualcomm
Device ID: Adreno (TM) 540
Driver Version: OpenGL ES 3.2 V@385.0 (GIT@bc00834, I609ab310b2) (Date:04/11/19)
RAM: 0

Diagnostics
AzureCanvasBackend: skia
AzureContentBackend: skia
AzureFallbackCanvasBackend: none
CMSOutputProfile: Empty profile data
Display0: 1080x1920
DisplayCount: 1
TileHeight: 512
TileWidth: 512
Device Reset: Trigger Device Reset
Decision Log
HW_COMPOSITING:
available by default
force_enabled by user: Force-enabled by pref
OPENGL_COMPOSITING:
available by default
force_enabled by user: Force-enabled by pref
WEBRENDER:
opt-in by default: WebRender is an opt-in feature
available by user: Qualified enabled by pref
WEBRENDER_QUALIFIED:
available by default
WEBRENDER_COMPOSITOR:
disabled by default: Disabled by default
WEBRENDER_ANGLE:
opt-in by default: WebRender ANGLE is an opt-in feature
WEBRENDER_DCOMP_PRESENT:
opt-in by default: WebRender DirectComposition is an opt-in feature
OMTP:
disabled by default: Disabled by default
WEBGPU:
disabled by default: Disabled by default




Media
-----

Audio Backend: opensl
Max Channels: 2
Preferred Sample Rate: 48000
Roundtrip latency (standard deviation): ...
Output Devices
Name: Group
:
Input Devices
Name: Group
:
Media Capabilities
Enumerate database

Important Modified Preferences
------------------------------

browser.cache.disk.amount_written: 1248456
browser.cache.disk.capacity: 524288
browser.cache.disk.filesystem_reported: 1
browser.cache.disk.telemetry_report_ID: 1
dom.presentation.device.name: Pixel 2
dom.w3c_pointer_events.enabled: true
extensions.lastAppVersion: 80.0a1
general.useragent.updates.lastupdated: 1575879162516
idle.lastDailyNotification: 1595473302
media.gmp.storage.version.observed: 1
network.predictor.cleaned-up: true
privacy.purge_trackers.date_in_cookie_database: 0
privacy.purge_trackers.last_purge: 1595473302351
security.remote_settings.intermediates.checked: 1559684719
storage.vacuum.last.index: 0

Important Locked Preferences
----------------------------

dom.ipc.processCount.webIsolated: 1

Accessibility
-------------

Activated: false
Prevent Accessibility: 0

Library Versions
----------------

NSPR
Expected minimum version: 4.27 Beta
Version in use: 4.27 Beta

NSS
Expected minimum version: 3.55 Beta
Version in use: 3.55 Beta

NSSSMIME
Expected minimum version: 3.55 Beta
Version in use: 3.55 Beta

NSSSSL
Expected minimum version: 3.55 Beta
Version in use: 3.55 Beta

NSSUTIL
Expected minimum version: 3.55 Beta
Version in use: 3.55 Beta

Startup Cache
-------------

Disk Cache Path: /data/user/0/org.mozilla.fenix/files/mozilla/whh5xto2.default/startupCache/startupCache.8.little
Ignore Disk Cache: false
Found Disk Cache on Init: false
Wrote to Disk Cache: true

Internationalization & Localization
-----------------------------------

Application Settings
Requested Locales: ["en-US","ja-JP"]
Available Locales: ["en-US"]
App Locales: ["en-US"]
Regional Preferences: ["en-US","ja-JP"]
Default Locale: "en-US"
Operating System
System Locales: ["en-US","ja-JP"]
Regional Preferences: ["en-US","ja-JP"]

There are some very long Composite bars in the Renderer thread. Moving this to Graphics.

Component: Layout: Scrolling and Overflow → Graphics

Can you get a profile with screenshots disabled? Screenshots cause extra graphics work.

Flags: needinfo?(kdubost)
Flags: needinfo?(kdubost)

Maybe :gw can make more sense out of that profile?
It looks pretty empty to me, though there seem to be some real long >1.0s APZ/present payload bars?

Flags: needinfo?(gwatson)

Bug 1655102 sounds related then.

There's nothing obvious in that profile to me - jnicol might have some ideas or the right mobile hardware to try and reproduce?

Flags: needinfo?(gwatson) → needinfo?(jnicol)

Can reproduce, this is bad!

Not sure why those profiles haven't captured anything on the renderer thread, but here's a better one: https://share.firefox.dev/338yPv9

glBufferData() called from draw_instanced_batch() is the culprit. I'm seeing >7000 draw calls in some (very laggy) frames!

Flags: needinfo?(jnicol)

The severity field is not set for this bug.
:ktaeleman, could you have a look please?

For more information, please visit auto_nag documentation.

Flags: needinfo?(ktaeleman)
Blocks: wr-81, wr-perf
Severity: -- → S2
Flags: needinfo?(ktaeleman) → needinfo?(dmalyshau)
Priority: -- → P2

The number of draw calls would indeed cause havoc on the smooth scrolling. Trying to reproduce this on Linux, no luck: the number of draw calls doesn't exceed 200 no matter how hard I scroll. We need some sort of WR capture, or even a GPU capture (APItrace? anything, really) of those bad frames. Jamie, is any of this available on mobile?

Flags: needinfo?(dmalyshau) → needinfo?(jnicol)

Here's a capture, hope it helps!

I made it so we automatically enabled capture on startup and disable it on app minimise, so the first scenes are probably from about:blank until I opened google drive.

Scrolling was so slow on google drive that there might only have been a few rendered frames.

I saw lots of webrender::resource_cache: Tiled blob images aren't supported yet warnings, not sure if they're relevant.

Flags: needinfo?(jnicol) → needinfo?(dmalyshau)

Thanks, Jamie! The capture has scenes, but it doesn't have frames, and it doesn't have enough data to even rebuild ones (i.e. "backend.ron" is missing from scene, and similar). Perhaps, when making this capture you haven't turned on the proper flags? SCENE + FRAME would be ideal

Flags: needinfo?(dmalyshau) → needinfo?(jnicol)

I can reproduce this on Linux as long as a set my user agent to android. I use this addon to do that, selecting the android item in the drop down menu. Then open the google drive page, and you can see that scrolling is very laggy. If you enable the webrender profiler, you can see there are thousands of draw calls

Flags: needinfo?(jnicol)
Attached file gdrive.html

Here is a somewhat reduced testcase (taken on desktop with an Android UA, saved with SingleFIle, then reduced by hand). It reproduces the bug on desktop.

The problem appears to come from the info icons in the bottom right corner of each card. These are svgs, and have overflow: visible set. Rather than creating a small blob image (the size of the visible icon) for each icon, for some reason we create a giant blob image for each one.

The blob images then get tiled, and there are lots of tiles. We allocate many texture arrays in the texture cache, and the tiles for each blob image get fragmented across multiple texture arrays. Because the giant blobs all overlap with each other, and the tiles use different textures, batching is atrocious.

So the main thing to figure out is why we're creating giant blobs instead of small ones. But additionally it might make sense to:

  • detect when a blob image tile is transparent, and don't upload or render it in that case
  • if a blob image requires a large number of tiles, use a standalone texture for it

Nical might have some thoughts.

Blocks: blob-perf
No longer blocks: wr-perf

Bug 1583879 might help here. I wrote a patch a while ago that was failing some tests and moved on before finishing it. It'd be worth rebasing it and seeing if it helps.

Depends on: 1583879

Bug 1583879 unfortunately doesn't help. Webrender believes the blob is being painted to every tile, so cannot mark tiles as transparent, causing the texture cache and batching problems.

Here is one of the SVG elements that are causing the issues:

<svg style="overflow: visible;" x="0px" y="0px" width="22px" height="22px" viewBox="0 0 24 24" enable-background="new 0 0 24 24"
    xml:space="preserve">
    <g id="Header">
        <g>
            <rect x="-618" y="-3256" fill="none" width="1400" height="3600"></rect>
        </g>
    </g>
    <g id="Label"></g>
    <g id="Icon">
        <g>
            <rect fill="none" width="24" height="24"></rect>
            <path fill="#757575"
                d="M12,2C6.5,2,2,6.5,2,12s4.5,10,10,10c5.5,0,10-4.5,10-10S17.5,2,12,2z M13,17h-2v-6h2V17z M13,9h-2V7h2V9z">
            </path>
        </g>
    </g>
    <g id="Grid" display="none">
        <g display="inline"></g>
    </g>
</svg>

The <rect x="-618" y="-3256" fill="none" width="1400" height="3600"></rect> element is the cause of the large size, and because of the overflow: visible I don't think we can clip it. But the fill="none" (and default stroke) leads me to believe we can probably safely skip it somehow.

Matt, do you know whether we could eliminate the fill="none" element, either at display list building time or when recording the blob image? If so, could you point me in the direction of where to do that? (I don't know my way around SVG code at all!)

Nical, I think you mentioned something in the daily about handling more SVG elements natively in webrender? If we did that for a subset of rects could that help here?

Flags: needinfo?(nical.bugzilla)
Flags: needinfo?(matt.woodrow)

Nical, I think you mentioned something in the daily about handling more SVG elements natively in webrender? If we did that for a subset of rects could that help here?

Probably. I am in the process of wrapping my head around the logic that attemps to use regular WR display items inside SVG's. Some svg items are promoted to active WR display items in some cases when nsSVGGeometryFrame::CreateWebRenderCommands(..., aDryRun) returns true. It would be worth implementing it for more types of SVG content (I think that it is only implemented for images at the moment).

If we do it for rects we'll want to double check what is the proper behavior for pixel snapping SVG rects (axis-aligned non-SVG rects are always snapped I think, not sure about SVG ones).

Flags: needinfo?(nical.bugzilla)

(In reply to Nicolas Silva [:nical] from comment #17)

Nical, I think you mentioned something in the daily about handling more SVG elements natively in webrender? If we did that for a subset of rects could that help here?
If we do it for rects we'll want to double check what is the proper behavior for pixel snapping SVG rects (axis-aligned non-SVG rects are always snapped I think, not sure about SVG ones).

The other case to consider is SVG generated by tools that have a large number of sibling geometry elements (like info graphics with 10k circles over a map).

If we start handling those as WR display items, then we'll have a lot more time spent in DL serialization, scene building, frame building etc.

For pathological cases like this, it's almost certainly better to just raster into a blob.

SVG is a real pain, where we have incredibly diverse use cases, a giant set of static content, or smaller animated content.

(In reply to Jamie Nicol [:jnicol] from comment #16)

Matt, do you know whether we could eliminate the fill="none" element, either at display list building time or when recording the blob image? If so, could you point me in the direction of where to do that? (I don't know my way around SVG code at all!)

I think part of the issue is noted here: https://searchfox.org/mozilla-central/rev/73a14f1b367948faa571ed2fe5d7eb29460787c1/gfx/layers/wr/WebRenderCommandBuilder.cpp#1428

We use the bounds of the container display item for the svg (nsDisplayOuterSVG) to compute the size of the group, which causes issues when we split into multiple subgroups, and also when part of the SVG doesn't actually paint anything.

I think we'd need to change that to accumulate a rect from the items actually added to a given group.

I suspect there's a second issue here: https://searchfox.org/mozilla-central/rev/73a14f1b367948faa571ed2fe5d7eb29460787c1/layout/svg/SVGGeometryFrame.cpp#207

As far as I can see, nothing prevents us from creating the DisplaySVGGeometry item when the fill style is none. I think we'd want a check for 'will paint anything' (combining fill style, markers, stroke etc), and skip adding the display item if so.

Flags: needinfo?(matt.woodrow)
No longer blocks: wr-81

Except for SVGImageFrames, where the fill property should be ignored.

Assignee: nobody → jnicol
Status: NEW → ASSIGNED
Attachment #9172742 - Attachment description: Bug 1654723 - Skip building DisplaySVGGeometry items if fill, stroke and markers are none. r?jwatt,mattwoodrow → Bug 1654723 - Skip building DisplaySVGGeometry items if fill, stroke and markers are none. r?jwatt
Pushed by jnicol@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/5070c4765faf
Skip building DisplaySVGGeometry items if fill, stroke and markers are none. r=jwatt
Status: ASSIGNED → RESOLVED
Closed: 1 year ago
Resolution: --- → FIXED
Target Milestone: --- → 82 Branch

Since the status are different for nightly and release, what's the status for beta?
For more information, please visit auto_nag documentation.

Flags: qe-verify+

Verified as fixed on the latest Nightly from 19/10 Nightly 201019 05:02 (Build #2015770537)AC: 63.0.20201016221440, acd9d4c70GV: 83.0a1-20201016094031AS: 63.0.0.
Note that there are no issues regarding scrolling in Gdrive.

You need to log in before you can comment on or make changes to this bug.