Performance issues uploading data using bufferSubData

66 views
Skip to first unread message

Philip Taylor

unread,
Aug 1, 2022, 12:09:51 PMAug 1
to webgl-d...@googlegroups.com
Hi WebGL devs, I'm hoping someone out there could give me some feedback on an issue I am struggling with in our engine. 

We develop and engine oriented around CAD data visualization and performance. Our engine can handle loading and rendering large CAD datasets in the browser.

A key to the performance is we allocate large GPU buffers for the geometries and pack all the thousands of small geoms into this large buffer, which we can render to screen using just a few multi-draw calls. 

Recently we've been working on a new stream loading feature which populates these large buffers gradually over time as the user interacts with the scene.

This has highlighted a performance issue that we hadn't noticed before. Calls to 'bufferSubData' are causing irregular pauses of up to 100 millisons as the data is uploaded. My guess is that the browser is doing some kind of validation when we call 'bufferSubData', or that this call is triggering validation of data previously uploaded.

I know the indices in the index buffer have to be validated that they are within range of the attributes at some point, which is what I am suspicious of. Because we have a few very large buffers, the index buffer becomes very large and therefore probably needs to be continually validated.

gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, offsetInBytes, offsettedIndices)

As a sanity check, the engine can instead load all geometries into separate buffers, each of which are bound and rendered independently. This approach addresses the pauses we see during loading, but has the downside that final rendering performance drops by more than 50%.

Anything I could try? Anything I may not be looking at that I should be?

My wish would be that when we upload a new chunk of the index buffer using 'bufferSubData', it would be that only those new indices are then validated, instead of the entire buffer. (I may be speculating too much here).

Thanks
Phil




--
Philip TAYLOR
CTO, Zea Inc.
Montréal, Québec

The contents of this e-mail are confidential with all rights reserved to the author. It is illegal to use or divulge this information without authorization. If you have received this e-mail by mistake, please notify me immediately by replying to the e-mail. 

Kelsey Gilbert

unread,
Aug 1, 2022, 2:22:54 PMAug 1
to webgl-d...@googlegroups.com
Which browser?
Can you take a profile?
In Firefox this is via perfht.ml (aka https://profiler.firefox.com/)
For WebGL stuff you will want the "Graphics" preset.

In Firefox we invalidate at upload time (and make a cpu-side copy):
...and validate at draw call time, with a (pretty naive) cache:

--
You received this message because you are subscribed to the Google Groups "WebGL Dev List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to webgl-dev-lis...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/webgl-dev-list/CAC7g9xQLhO4xyQUPaShtgSkEG5LTJN66xonPx3g7T-uXFxm3Bg%40mail.gmail.com.

Philip Taylor

unread,
Aug 1, 2022, 2:42:31 PMAug 1
to webgl-d...@googlegroups.com
Thanks Kelsey, I will take a look at the Firefox profiling tools to see if it points me at the problem more clearly. 
One of my challenges is that this performance issue only really occurs when loading quite large datasets. The chrome profiling tools were unable to point me at any specific function call. I spent a bunch of time manually isolating where these spikes in processing were coming from.


Ken Russell

unread,
Aug 1, 2022, 8:18:35 PMAug 1
to WebGL Dev List
Hi Philip,

Could you additionally provide the GPU information from the affected machines? about:gpu on Chrome ("Copy Report to Clipboard"), about:support on Firefox ("Copy text to clipboard"). Here it is from my machine.

In Chrome you can open a tab to about:tracing, start a "Javascript and Rendering" trace, and then load the large dataset - the time-based events might provide more insight. A test case would be ideal.

It's certainly possible that the browser's index cache validation is causing the slowdown. In Chrome also this cache is only supposed to be revalidated during draw calls, as Kelsey pointed out in Firefox.

-Ken



about-gpu-m1.txt

Philip Taylor

unread,
Aug 16, 2022, 2:07:39 PMAug 16
to webgl-d...@googlegroups.com
Hi Kelsey, the Firefox profiler app is pretty awesome. 
I've recorded a short spin round of a large model that loads progressively as we move. 

Here is a recording of a profiling session in Chrome.

I see lots of performance issues, but they don't point me at code to investigate.
I am hoping someone can take a quick look and point me at something I haven't noticed.

image.png


Application Basics

Name Firefox
Version 103.0.2
Build ID 20220808125904
Distribution ID
Update Channel release
User Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
OS Windows_NT 10.0 19044
Launcher Process Enabled
Multiprocess Windows 1/1
Fission Windows 1/1 Enabled by default
Remote Processes 11
Enterprise Policies Inactive
Google Location Service Key Found
Google Safebrowsing Key Found
Mozilla Location Service Key Found
Safe Mode false
Memory Size (RAM) 16.0 GB
Disk Space Available 25.8 GB

Crash Reports for the Last 3 Days

Report ID Submitted

Firefox Features

Name Version ID
DoH Roll-Out2.0.0doh-r...@mozilla.org
Firefox Screenshots39.0.1scree...@mozilla.org
Form Autofill1.0.1formau...@mozilla.org
Picture-In-Picture1.0.0picturei...@mozilla.org
Web Compatibility Interventions103.0.0webc...@mozilla.org
WebCompat Reporter1.5.0webcompat...@mozilla.org

Remote Features

rollout-monitor-v2-1505837active

Remote Processes

Type Count
Web Content1 / 8
Extension1
Privileged About1
Isolated Web Content3
Preallocated3
GPU1
Socket1

Add-ons

Name Type Version Enabled ID
Add-ons Search Detectionextension2.0.0trueaddons-sear...@mozilla.com
Amazon.co.ukextension1.9trueama...@search.mozilla.org
Amazon.comextension1.3trueamazon...@search.mozilla.org
Bingextension1.3truebi...@search.mozilla.org
DuckDuckGoextension1.1trued...@search.mozilla.org
eBayextension1.3trueeb...@search.mozilla.org
Googleextension1.2truegoo...@search.mozilla.org
Wikipedia (en)extension1.1truewiki...@search.mozilla.org

Security Software

Type Name
Antivirus Microsoft Defender Antivirus
Antispyware
Firewall Windows Firewall

Graphics

Features
CompositingWebRender
Asynchronous Pan/Zoomwheel input enabled; scrollbar drag enabled; keyboard enabled; autoscroll enabled; smooth pinch-zoom enabled
WebGL 1 Driver WSI InfoEGL_VENDOR: Google Inc. (NVIDIA) EGL_VERSION: 1.5 (ANGLE 2.1.15727 git hash: 23851a53779d) EGL_EXTENSIONS: EGL_EXT_create_context_robustness EGL_ANGLE_d3d_share_handle_client_buffer EGL_ANGLE_d3d_texture_client_buffer EGL_ANGLE_surface_d3d_texture_2d_share_handle EGL_ANGLE_query_surface_pointer EGL_ANGLE_window_fixed_size EGL_ANGLE_keyed_mutex EGL_ANGLE_surface_orientation EGL_ANGLE_direct_composition EGL_NV_post_sub_buffer EGL_KHR_create_context EGL_KHR_image EGL_KHR_image_base EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_get_all_proc_addresses EGL_KHR_stream EGL_KHR_stream_consumer_gltexture EGL_NV_stream_consumer_gltexture_yuv EGL_ANGLE_flexible_surface_compatibility EGL_ANGLE_stream_producer_d3d_texture EGL_ANGLE_create_context_webgl_compatibility EGL_CHROMIUM_create_context_bind_generates_resource EGL_CHROMIUM_sync_control EGL_EXT_pixel_format_float EGL_KHR_surfaceless_context EGL_ANGLE_display_texture_share_group EGL_ANGLE_display_semaphore_share_group EGL_ANGLE_create_context_client_arrays EGL_ANGLE_program_cache_control EGL_ANGLE_robust_resource_initialization EGL_ANGLE_create_context_extensions_enabled EGL_ANDROID_blob_cache EGL_ANDROID_recordable EGL_ANGLE_image_d3d11_texture EGL_ANGLE_create_context_backwards_compatible EGL_KHR_create_context_no_error EGL_KHR_reusable_sync EGL_EXTENSIONS(nullptr): EGL_EXT_client_extensions EGL_EXT_device_query EGL_EXT_platform_base EGL_EXT_platform_device EGL_ANGLE_platform_angle EGL_ANGLE_platform_angle_d3d EGL_ANGLE_platform_angle_d3d11on12 EGL_ANGLE_device_creation EGL_ANGLE_device_creation_d3d11 EGL_ANGLE_experimental_present_path EGL_KHR_client_get_all_proc_addresses EGL_KHR_debug EGL_ANGLE_explicit_context EGL_ANGLE_feature_control IsWebglOutOfProcessEnabled: 1
WebGL 1 Driver RendererGoogle Inc. (NVIDIA) -- ANGLE (NVIDIA, NVIDIA GeForce RTX 2080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)
WebGL 1 Driver VersionOpenGL ES 2.0.0 (ANGLE 2.1.15727 git hash: 23851a53779d)
WebGL 1 Driver ExtensionsGL_ANGLE_base_vertex_base_instance GL_ANGLE_client_arrays GL_ANGLE_depth_texture GL_ANGLE_explicit_context GL_ANGLE_explicit_context_gles1 GL_ANGLE_framebuffer_blit GL_ANGLE_framebuffer_multisample GL_ANGLE_get_serialized_context_string GL_ANGLE_get_tex_level_parameter GL_ANGLE_instanced_arrays GL_ANGLE_lossy_etc_decode GL_ANGLE_memory_size GL_ANGLE_multi_draw GL_ANGLE_multiview_multisample GL_ANGLE_pack_reverse_row_order GL_ANGLE_program_cache_control GL_ANGLE_provoking_vertex GL_ANGLE_request_extension GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ANGLE_texture_usage GL_ANGLE_translated_shader_source GL_CHROMIUM_bind_generates_resource GL_CHROMIUM_bind_uniform_location GL_CHROMIUM_color_buffer_float_rgb GL_CHROMIUM_color_buffer_float_rgba GL_CHROMIUM_copy_compressed_texture GL_CHROMIUM_copy_texture GL_CHROMIUM_lose_context GL_CHROMIUM_sync_query GL_EXT_EGL_image_external_wrap_modes GL_EXT_blend_func_extended GL_EXT_blend_minmax GL_EXT_color_buffer_half_float GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers GL_EXT_draw_elements_base_vertex GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_multisampled_render_to_texture GL_EXT_occlusion_query_boolean GL_EXT_read_format_bgra GL_EXT_robustness GL_EXT_sRGB GL_EXT_shader_texture_lod GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc_srgb GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_storage GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_no_error GL_KHR_parallel_shader_compile GL_KHR_robust_buffer_access_behavior GL_NV_EGL_stream_consumer_external GL_NV_fence GL_NV_pack_subimage GL_NV_pixel_buffer_object GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_compressed_EAC_R11_signed_texture GL_OES_compressed_EAC_R11_unsigned_texture GL_OES_compressed_EAC_RG11_signed_texture GL_OES_compressed_EAC_RG11_unsigned_texture GL_OES_compressed_ETC2_RGB8_texture GL_OES_compressed_ETC2_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture GL_OES_compressed_ETC2_sRGB8_alpha8_texture GL_OES_compressed_ETC2_sRGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_draw_elements_base_vertex GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_border_clamp GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_vertex_array_object GL_WEBGL_video_texture
WebGL 1 ExtensionsANGLE_instanced_arrays EXT_blend_minmax EXT_color_buffer_half_float EXT_float_blend EXT_frag_depth EXT_shader_texture_lod EXT_sRGB EXT_texture_compression_bptc EXT_texture_compression_rgtc 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_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_depth_texture WEBGL_draw_buffers WEBGL_lose_context
WebGL 2 Driver WSI InfoEGL_VENDOR: Google Inc. (NVIDIA) EGL_VERSION: 1.5 (ANGLE 2.1.15727 git hash: 23851a53779d) EGL_EXTENSIONS: EGL_EXT_create_context_robustness EGL_ANGLE_d3d_share_handle_client_buffer EGL_ANGLE_d3d_texture_client_buffer EGL_ANGLE_surface_d3d_texture_2d_share_handle EGL_ANGLE_query_surface_pointer EGL_ANGLE_window_fixed_size EGL_ANGLE_keyed_mutex EGL_ANGLE_surface_orientation EGL_ANGLE_direct_composition EGL_NV_post_sub_buffer EGL_KHR_create_context EGL_KHR_image EGL_KHR_image_base EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_get_all_proc_addresses EGL_KHR_stream EGL_KHR_stream_consumer_gltexture EGL_NV_stream_consumer_gltexture_yuv EGL_ANGLE_flexible_surface_compatibility EGL_ANGLE_stream_producer_d3d_texture EGL_ANGLE_create_context_webgl_compatibility EGL_CHROMIUM_create_context_bind_generates_resource EGL_CHROMIUM_sync_control EGL_EXT_pixel_format_float EGL_KHR_surfaceless_context EGL_ANGLE_display_texture_share_group EGL_ANGLE_display_semaphore_share_group EGL_ANGLE_create_context_client_arrays EGL_ANGLE_program_cache_control EGL_ANGLE_robust_resource_initialization EGL_ANGLE_create_context_extensions_enabled EGL_ANDROID_blob_cache EGL_ANDROID_recordable EGL_ANGLE_image_d3d11_texture EGL_ANGLE_create_context_backwards_compatible EGL_KHR_create_context_no_error EGL_KHR_reusable_sync EGL_EXTENSIONS(nullptr): EGL_EXT_client_extensions EGL_EXT_device_query EGL_EXT_platform_base EGL_EXT_platform_device EGL_ANGLE_platform_angle EGL_ANGLE_platform_angle_d3d EGL_ANGLE_platform_angle_d3d11on12 EGL_ANGLE_device_creation EGL_ANGLE_device_creation_d3d11 EGL_ANGLE_experimental_present_path EGL_KHR_client_get_all_proc_addresses EGL_KHR_debug EGL_ANGLE_explicit_context EGL_ANGLE_feature_control IsWebglOutOfProcessEnabled: 1
WebGL 2 Driver RendererGoogle Inc. (NVIDIA) -- ANGLE (NVIDIA, NVIDIA GeForce RTX 2080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)
WebGL 2 Driver VersionOpenGL ES 3.0.0 (ANGLE 2.1.15727 git hash: 23851a53779d)
WebGL 2 Driver ExtensionsGL_ANGLE_base_vertex_base_instance GL_ANGLE_client_arrays GL_ANGLE_copy_texture_3d GL_ANGLE_depth_texture GL_ANGLE_explicit_context GL_ANGLE_explicit_context_gles1 GL_ANGLE_framebuffer_blit GL_ANGLE_framebuffer_multisample GL_ANGLE_get_serialized_context_string GL_ANGLE_get_tex_level_parameter GL_ANGLE_instanced_arrays GL_ANGLE_lossy_etc_decode GL_ANGLE_memory_size GL_ANGLE_multi_draw GL_ANGLE_multiview_multisample GL_ANGLE_pack_reverse_row_order GL_ANGLE_program_cache_control GL_ANGLE_provoking_vertex GL_ANGLE_request_extension GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ANGLE_texture_multisample GL_ANGLE_texture_usage GL_ANGLE_translated_shader_source GL_CHROMIUM_bind_generates_resource GL_CHROMIUM_bind_uniform_location GL_CHROMIUM_copy_compressed_texture GL_CHROMIUM_copy_texture GL_CHROMIUM_lose_context GL_CHROMIUM_sync_query GL_EXT_EGL_image_external_wrap_modes GL_EXT_blend_func_extended GL_EXT_blend_minmax GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_multisampled_render_to_texture GL_EXT_occlusion_query_boolean GL_EXT_read_format_bgra GL_EXT_robustness GL_EXT_sRGB GL_EXT_shader_texture_lod GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc_srgb GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_norm16 GL_EXT_texture_rg GL_EXT_texture_storage GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_no_error GL_KHR_parallel_shader_compile GL_KHR_robust_buffer_access_behavior GL_NV_EGL_stream_consumer_external GL_NV_fence GL_NV_pack_subimage GL_NV_pixel_buffer_object GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_image_external_essl3 GL_OES_compressed_EAC_R11_signed_texture GL_OES_compressed_EAC_R11_unsigned_texture GL_OES_compressed_EAC_RG11_signed_texture GL_OES_compressed_EAC_RG11_unsigned_texture GL_OES_compressed_ETC2_RGB8_texture GL_OES_compressed_ETC2_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture GL_OES_compressed_ETC2_sRGB8_alpha8_texture GL_OES_compressed_ETC2_sRGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_border_clamp GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_vertex_array_object GL_OVR_multiview GL_OVR_multiview2 GL_WEBGL_video_texture
WebGL 2 ExtensionsEXT_color_buffer_float EXT_float_blend EXT_texture_compression_bptc EXT_texture_compression_rgtc EXT_texture_filter_anisotropic MOZ_debug OES_texture_float_linear OVR_multiview2 WEBGL_compressed_texture_s3tc WEBGL_compressed_texture_s3tc_srgb WEBGL_debug_renderer_info WEBGL_debug_shaders WEBGL_lose_context
Direct2Dtrue
Target Frame Rate60
DirectWritetrue (10.0.19041.1566)
GPU #1
ActiveYes
DescriptionNVIDIA GeForce RTX 2080 Ti
Vendor ID0x10de
Device ID0x1e07
Driver Version27.21.14.5751
Driver Date11-22-2020
DriversC:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumdx.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumdx.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumdx.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumdx.dll C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumd.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumd.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumd.dll,C:\WINDOWS\System32\DriverStore\FileRepository\nvmd.inf_amd64_1408eaf9a25ed64f\nvldumd.dll
Subsys ID37111462
RAM11264
GPU #2
ActiveNo
RAM0
Diagnostics
AzureCanvasBackenddirect2d 1.1
AzureCanvasBackend (UI Process)skia
AzureContentBackendskia
AzureContentBackend (UI Process)skia
AzureFallbackCanvasBackend (UI Process)skia
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
Display01920x1080@60Hz scales:1.000000|1.000000
DisplayCount1
HardwareStretchingboth=0 window-only=0 full-screen-only=1 none=0 error=0
GPUProcessPid28228
ClearType ParametersGamma: 1.8 Pixel Structure: RGB ClearType Level: 100 Enhanced Contrast: 50
Decision Log
HW_COMPOSITING
available by default
D3D11_COMPOSITING
available by default
DIRECT2D
available by default
D3D11_HW_ANGLE
available by default
GPU_PROCESS
available by default
WEBRENDER
available by default
WEBRENDER_QUALIFIED
available by default
WEBRENDER_COMPOSITOR
available by default
WEBRENDER_PARTIAL
available by default
WEBRENDER_SHADER_CACHE
available by default
WEBRENDER_OPTIMIZED_SHADERS
available by default
WEBRENDER_ANGLE
available by default
WEBRENDER_DCOMP_PRESENT
available by default
WEBRENDER_SOFTWARE
available by default
WEBGPU
disabled by default: Disabled by default
blocked by runtime: WebGPU cannot be enabled in release or beta
WINDOW_OCCLUSION
available by default
VIDEO_OVERLAY
blocked by default: Blocklisted by gfxInfo
HW_DECODED_VIDEO_ZERO_COPY
blocked by default: Blocklisted by gfxInfo
VP8_HW_DECODE
available by default
VP9_HW_DECODE
available by default
REUSE_DECODER_DEVICE
blocked by default: Blocklisted by gfxInfo
Crash Guard Disabled Features
Workarounds
Failure Log
(#0) GP+[GFX1-]: Disable native compositor for async screenshot

Media

Audio Backendwasapi
Max Channels2
Preferred Sample Rate48000
Roundtrip latency (standard deviation)NaNms (NaN)
Output Devices
Name Group Vendor State Preferred Format Channels Rate Latency
Headphones (Oculus Virtual Audio Device)ROOT\MEDIA\0000EnabledNonedefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 48000144 - 480
Headphones (Bose PC Desktop Controller)USB\VID_05A7&PID_4040&MI_00\6&3469e8a3&0&0000EnabledAlldefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 48000144 - 480
Speakers (Realtek High Definition Audio)HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104320A0&REV_1003\4&18c854d7&0&0001UnpluggedNonedefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 480000 - 0
Input Devices
Name Group Vendor State Preferred Format Channels Rate Latency
Microphone (Bose PC Desktop Controller)USB\VID_05A7&PID_4040&MI_00\6&3469e8a3&0&0000EnabledAlldefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 48000144 - 480
Microphone (Realtek High Definition Audio)HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104320A0&REV_1003\4&18c854d7&0&0001UnpluggedNonedefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 480000 - 0
Line In (Realtek High Definition Audio)HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_104320A0&REV_1003\4&18c854d7&0&0001UnpluggedNonedefault: F32LE, support: S16LE F32LE2default: 48000, support: 48000 - 480000 - 0
Headset Microphone (Oculus Virtual Audio Device)ROOT\MEDIA\0000EnabledNonedefault: F32LE, support: S16LE F32LE1default: 48000, support: 48000 - 48000144 - 480
Media Capabilities

Environment Variables

MOZ_CRASHREPORTER_DATA_DIRECTORYC:\Users\ASUS Droid\AppData\Roaming\Mozilla\Firefox\Crash Reports
MOZ_CRASHREPORTER_EVENTS_DIRECTORYC:\Users\ASUS Droid\AppData\Roaming\Mozilla\Firefox\Crash Reports\events
MOZ_CRASHREPORTER_PING_DIRECTORYC:\Users\ASUS Droid\AppData\Roaming\Mozilla\Firefox\Pending Pings
MOZ_CRASHREPORTER_RESTART_ARG_0C:\Program Files\Mozilla Firefox\firefox.exe
MOZ_CRASHREPORTER_STRINGS_OVERRIDEC:\Program Files\Mozilla Firefox\browser\crashreporter-override.ini

Experimental Features

about:home startup cache (browser.startup.homepage.abouthome_cache.enabled)false
Cookies: SameSite=Lax by default (network.cookie.sameSite.laxByDefault)false
Cookies: SameSite=None requires secure attribute (network.cookie.sameSite.noneRequiresSecure)false
Cookies: Schemeful SameSite (network.cookie.sameSite.schemeful)false
CSS: Masonry Layout (layout.css.grid-template-masonry-value.enabled)false
Developer Tools: Compatibility Panel (devtools.inspector.compatibility.enabled)true
Developer Tools: Service Worker debugging (devtools.debugger.features.windowless-service-workers)false
Media: JPEG XL (image.jxl.enabled)false
Text Recognition (dom.text-recognition.enabled)false
Address Bar: show results during IME composition (browser.urlbar.keepPanelOpenDuringImeComposition)false
Web API: WebGPU (dom.webgpu.enabled)false
WebRTC Global Mute Toggles (privacy.webrtc.globalMuteToggles)false

Remote Experiments

TCP rollout, Phase III (TCP on by default for 50% EXISTING Release profiles)control

Important Modified Preferences

accessibility.typeaheadfind.flashBar0
browser.cache.disk.amount_written42717
browser.cache.disk.capacity1048576
browser.cache.disk.filesystem_reported1
browser.cache.disk.smart_size.first_runfalse
browser.contentblocking.categorystandard
browser.search.regionCA
browser.sessionstore.upgradeBackup.latestBuildID20220808125904
browser.startup.homepage_override.buildID20220808125904
browser.startup.homepage_override.mstone103.0.2
browser.startup.homepage_override.once{"message_id":"WNP_MOMENTS_13","url":"https://www.mozilla.org/firefox/welcome/13","expire":1640908800000}
browser.urlbar.placeholderNameGoogle
browser.urlbar.quicksuggest.migrationVersion2
browser.urlbar.quicksuggest.scenariohistory
browser.urlbar.resultBuckets{"children":[{"maxResultCount":1,"children":[{"group":"heuristicTest"},{"group":"heuristicExtension"},{"group":"heuristi
browser.urlbar.resultGroups{"children":[{"maxResultCount":1,"children":[{"group":"heuristicTest"},{"group":"heuristicExtension"},{"group":"heuristi
browser.urlbar.timesBeforeHidingSuggestionsHint0
browser.urlbar.tipShownCount.searchTip_onboard2
doh-rollout.balrog-migration-donetrue
doh-rollout.doneFirstRuntrue
doh-rollout.doorhanger-decisionUIOk
doh-rollout.home-regionCA
doh-rollout.mode2
doh-rollout.self-enabledtrue
doh-rollout.urihttps://private.canadianshield.cira.ca/dns-query
dom.forms.autocomplete.formautofilltrue
extensions.lastAppVersion103.0.2
gfx.crash-guard.status.wmfvpxvideo2
gfx.crash-guard.wmfvpxvideo.appVersion89.0.2
gfx.crash-guard.wmfvpxvideo.deviceID0x1e07
gfx.crash-guard.wmfvpxvideo.driverVersion27.21.14.5751
idle.lastDailyNotification1660598408
layers.mlgpu.sanity-test-failedfalse
media.gmp-gmpopenh264.abix86_64-msvc-x64
media.gmp-gmpopenh264.lastUpdate1660597213
media.gmp-gmpopenh264.version1.8.1.2
media.gmp-manager.buildID20220808125904
media.gmp-manager.lastCheck1660658368
media.gmp-manager.lastEmptyCheck1660658368
media.gmp-widevinecdm.abix86_64-msvc-x64
media.gmp-widevinecdm.lastUpdate1660597215
media.gmp-widevinecdm.version4.10.2449.0
media.gmp.storage.version.observed1
media.hardware-video-decoding.failedfalse
network.predictor.cleaned-uptrue
network.trr.blocklist_cleanup_donetrue
places.database.lastMaintenance1660598408
places.history.expiration.transient_current_max_pages112348
plugin.disable_full_page_plugin_for_typesapplication/pdf
privacy.purge_trackers.date_in_cookie_database0
privacy.purge_trackers.last_purge1660598408163
privacy.sanitize.pending[{"id":"newtab-container","itemsToClear":[],"options":{}}]
security.remote_settings.crlite_filters.checked1660655065
security.remote_settings.intermediates.checked1660655065
security.sandbox.content.tempDirSuffix{c0cb41ad-317d-4a00-8e8e-4537de9b27e2}
security.sandbox.plugin.tempDirSuffix{dc38d911-9563-4aee-a856-548eace610ec}
services.sync.engine.addresses.availabletrue
signon.importedFromSqlitetrue
storage.vacuum.last.index0
storage.vacuum.last.places.sqlite1660598408
ui.osk.debug.keyboardDisplayReasonIKPOS: Touch screen not found.

Important Locked Preferences

fission.autostart.sessiontrue

Places Database

Accessibility

Activated false
Prevent Accessibility 0
Accessible Handler Used true
Accessibility Instantiator

Library Versions

Expected minimum versionVersion in use
NSPR4.344.34
NSS3.803.80
NSSSMIME3.803.80
NSSSSL3.803.80
NSSUTIL3.803.80

Sandbox

Content Process Sandbox Level6
Effective Content Process Sandbox Level6
Win32k Lockdown State for Content ProcessWin32k Lockdown enabled -- default value is true

Startup Cache

Disk Cache Path C:\Users\ASUS Droid\AppData\Local\Mozilla\Firefox\Profiles\766mr9an.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"]
Available Locales ["en-US"]
App Locales ["en-US"]
Regional Preferences ["en-CA"]
Default Locale "en-US"
Operating System
System Locales ["en-CA","en-US","fr-CA"]
Regional Preferences ["en-CA"]

Remote Debugging (Chromium Protocol)

Accepting Connections false
URL

Printing

Modified print settings




Graphics Feature Status

  • Canvas: Hardware accelerated
  • Canvas out-of-process rasterization: Enabled
  • Direct Rendering Display Compositor: Disabled
  • Compositing: Hardware accelerated
  • Multiple Raster Threads: Enabled
  • OpenGL: Enabled
  • Rasterization: Hardware accelerated
  • Raw Draw: Disabled
  • Video Decode: Hardware accelerated
  • Video Encode: Hardware accelerated
  • Vulkan: Disabled
  • WebGL: Hardware accelerated
  • WebGL2: Hardware accelerated
  • WebGPU: Hardware accelerated

Driver Bug Workarounds

  • clear_uniforms_before_first_program_use
  • decode_encode_srgb_for_generatemipmap
  • disable_delayed_copy_nv12
  • disable_vp_super_resolution
  • enable_webgl_timer_query_extensions
  • exit_on_context_lost
  • disabled_extension_GL_KHR_blend_equation_advanced
  • disabled_extension_GL_KHR_blend_equation_advanced_coherent

Problems Detected

ANGLE Features

  • allowCompressedFormats (Frontend workarounds)Enabled: true
    Allow compressed formats
  • disableAnisotropicFiltering (Frontend workarounds)Disabled
    Disable support for anisotropic filtering
  • disableProgramBinary (Frontend features) anglebug:5007Disabled
    Disable support for GL_OES_get_program_binary
  • disableProgramCachingForTransformFeedback (Frontend workarounds)Disabled
    On some GPUs, program binaries don't contain transform feedback varyings
  • enableCaptureLimits (Frontend features) anglebug:5750Disabled
    Set the context limits like frame capturing was enabled
  • enableCompressingPipelineCacheInThreadPool (Frontend workarounds) anglebug:4722Disabled: false
    Enable compressing pipeline cache in thread pool.
  • enableProgramBinaryForCapture (Frontend features) anglebug:5658Disabled
    Even if FrameCapture is enabled, enable GL_OES_get_program_binary
  • forceDepthAttachmentInitOnClear (Frontend workarounds) anglebug:7246Disabled: isAMD
    Force depth attachment initialization on clear ops
  • forceInitShaderVariables (Frontend features)Disabled
    Force-enable shader variable initialization
  • forceRobustResourceInit (Frontend features) anglebug:6041Disabled
    Force-enable robust resource init
  • loseContextOnOutOfMemory (Frontend workarounds)Enabled: true
    Some users rely on a lost context notification if a GL_OUT_OF_MEMORY error occurs
  • scalarizeVecAndMatConstructorArgs (Frontend workarounds) 1165751Disabled: false
    Always rewrite vec/mat constructors to be consistent
  • addMockTextureNoRenderTarget (D3D workarounds) anglebug:2152Disabled: isIntel && capsVersion >= IntelDriverVersion(160000) && capsVersion < IntelDriverVersion(164815)
    On some drivers when rendering with no render target, two bugs lead to incorrect behavior
  • allowClearForRobustResourceInit (D3D workarounds) 941620Enabled: true
    Some drivers corrupt texture data when clearing for robust resource initialization.
  • allowES3OnFL100 (D3D workarounds)Disabled: false
    Allow ES3 on 10.0 devices
  • allowTranslateUniformBlockToStructuredBuffer (D3D workarounds) anglebug:3682Enabled: IsWin10OrGreater()
    There is a slow fxc compile performance issue with dynamic uniform indexing if translating a uniform block with a large array member to cbuffer.
  • callClearTwice (D3D workarounds) 655534Disabled: isIntel && isSkylake && capsVersion >= IntelDriverVersion(160000) && capsVersion < IntelDriverVersion(164771)
    Using clear() may not take effect
  • depthStencilBlitExtraCopy (D3D workarounds) anglebug:1452Disabled: (part1 <= 13u && part2 < 6881) && isNvidia && driverVersionValid
    Bug in some drivers triggers a TDR when using CopySubresourceRegion from a staging texture to a depth/stencil
  • disableB5G6R5Support (D3D workarounds)Disabled: (isIntel && capsVersion >= IntelDriverVersion(150000) && capsVersion < IntelDriverVersion(154539)) || isAMD
    Textures with the format DXGI_FORMAT_B5G6R5_UNORM have incorrect data
  • emulateIsnanFloat (D3D workarounds) 650547Disabled: isIntel && isSkylake && capsVersion >= IntelDriverVersion(160000) && capsVersion < IntelDriverVersion(164542)
    Using isnan() on highp float will get wrong answer
  • emulateTinyStencilTextures (D3D workarounds)Disabled: isAMD && !(deviceCaps.featureLevel < D3D_FEATURE_LEVEL_10_1)
    1x1 and 2x2 mips of depth/stencil textures aren't sampled correctly
  • expandIntegerPowExpressions (D3D workarounds)Enabled: true
    The HLSL optimizer has a bug with optimizing 'pow' in certain integer-valued expressions
  • flushAfterEndingTransformFeedback (D3D workarounds)Enabled: isNvidia
    Some drivers sometimes write out-of-order results to StreamOut buffers when transform feedback is used to repeatedly write to the same buffer positions
  • forceAtomicValueResolution (D3D workarounds) anglebug:3246Enabled: isNvidia
    On some drivers the return value from RWByteAddressBuffer.InterlockedAdd does not resolve when used in the .yzw components of a RWByteAddressBuffer.Store operation
  • getDimensionsIgnoresBaseLevel (D3D workarounds)Enabled: isNvidia
    Some drivers do not take into account the base level of the texture in the results of the HLSL GetDimensions builtin
  • mrtPerfWorkaround (D3D workarounds)Enabled: true
    Some drivers have a bug where they ignore null render targets
  • preAddTexelFetchOffsets (D3D workarounds)Disabled: isIntel
    HLSL's function texture.Load returns 0 when the parameter Location is negative, even if the sum of Offset and Location is in range
  • rewriteUnaryMinusOperator (D3D workarounds)Disabled: isIntel && (isBroadwell || isHaswell) && capsVersion >= IntelDriverVersion(150000) && capsVersion < IntelDriverVersion(154624)
    Evaluating unary minus operator on integer may get wrong answer in vertex shaders
  • selectViewInGeometryShader (D3D workarounds)Disabled: !deviceCaps.supportsVpRtIndexWriteFromVertexShader
    The viewport or render target slice will be selected in the geometry shader stage for the ANGLE_multiview extension
  • setDataFasterThanImageUpload (D3D workarounds)Enabled: !(isIvyBridge || isBroadwell || isHaswell)
    Set data faster than image upload
  • skipVSConstantRegisterZero (D3D workarounds)Enabled: isNvidia
    In specific cases the driver doesn't handle constant register zero correctly
  • useInstancedPointSpriteEmulation (D3D workarounds)Disabled: isFeatureLevel9_3
    Some D3D11 renderers do not support geometry shaders for pointsprite emulation
  • useSystemMemoryForConstantBuffers (D3D workarounds) 593024Disabled: isIntel
    Copying from staging storage to constant buffer storage does not work
  • zeroMaxLodWorkaround (D3D workarounds)Disabled: isFeatureLevel9_3
    Missing an option to disable mipmaps on a mipmapped texture

DAWN Info


    <Discrete GPU> D3D12 backend - NVIDIA GeForce RTX 2080 Ti
    [Default Toggle Names]
  • lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
  • use_d3d12_resource_heap_tier2: https://crbug.com/dawn/27: Enable support for resource heap tier 2. Resource heap tier 2 allows mixing of texture and buffers in the same heap. This allows better heap re-use and reduces fragmentation.
  • use_d3d12_render_pass: https://crbug.com/dawn/36: Use the D3D12 render pass API introduced in Windows build 1809 by default. On versions of Windows prior to build 1809, or when this toggle is turned off, Dawn will emulate a render pass.
  • use_d3d12_residency_management: https://crbug.com/dawn/193: Enable residency management. This allows page-in and page-out of resource heaps in GPU memory. This component improves overcommitted performance by keeping the most recently used resources local to the GPU. Turning this component off can cause allocation failures when application memory exceeds physical device memory.
  • disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
  • d3d12_split_buffer_texture_copy_for_rows_per_image_paddings: https://crbug.com/dawn/1289: D3D12 requires more buffer storage than it should when rowsPerImage is greater than copyHeight, which means there are pure padding row(s) on each image. In this situation, the buffer used for B2T/T2B copy might be big enough according to WebGPU's spec but it doesn't meet D3D12's requirement, then we need to workaround it via split the copy operation into two copies, in order to make B2T/T2B copy being done correctly on D3D12.
  • [WebGPU Forced Toggles - enabled]
  • disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
  • [Supported Features]
  • texture-compression-bc
  • pipeline-statistics-query
  • timestamp-query
  • depth24unorm-stencil8
  • depth32float-stencil8
  • indirect-first-instance
  • dawn-internal-usages
  • multiplanar-formats
  • dawn-native

  • <CPU> D3D12 backend - Microsoft Basic Render Driver
    [Default Toggle Names]
  • lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
  • use_d3d12_resource_heap_tier2: https://crbug.com/dawn/27: Enable support for resource heap tier 2. Resource heap tier 2 allows mixing of texture and buffers in the same heap. This allows better heap re-use and reduces fragmentation.
  • use_d3d12_render_pass: https://crbug.com/dawn/36: Use the D3D12 render pass API introduced in Windows build 1809 by default. On versions of Windows prior to build 1809, or when this toggle is turned off, Dawn will emulate a render pass.
  • use_d3d12_residency_management: https://crbug.com/dawn/193: Enable residency management. This allows page-in and page-out of resource heaps in GPU memory. This component improves overcommitted performance by keeping the most recently used resources local to the GPU. Turning this component off can cause allocation failures when application memory exceeds physical device memory.
  • disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
  • d3d12_split_buffer_texture_copy_for_rows_per_image_paddings: https://crbug.com/dawn/1289: D3D12 requires more buffer storage than it should when rowsPerImage is greater than copyHeight, which means there are pure padding row(s) on each image. In this situation, the buffer used for B2T/T2B copy might be big enough according to WebGPU's spec but it doesn't meet D3D12's requirement, then we need to workaround it via split the copy operation into two copies, in order to make B2T/T2B copy being done correctly on D3D12.
  • [WebGPU Forced Toggles - enabled]
  • disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
  • [Supported Features]
  • texture-compression-bc
  • pipeline-statistics-query
  • timestamp-query
  • depth24unorm-stencil8
  • depth32float-stencil8
  • indirect-first-instance
  • dawn-internal-usages
  • multiplanar-formats
  • dawn-native

  • <Discrete GPU> Vulkan backend - GeForce RTX 2080 Ti
    [Default Toggle Names]
  • lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
  • use_temporary_buffer_in_texture_to_texture_copy: https://crbug.com/dawn/42: Split texture-to-texture copy into two copies: copy from source texture into a temporary buffer, and copy from the temporary buffer into the destination texture when copying between compressed textures that don't have block-aligned sizes. This workaround is enabled by default on all Vulkan drivers to solve an issue in the Vulkan SPEC about the texture-to-texture copies with compressed formats. See #1005 (https://github.com/KhronosGroup/Vulkan-Docs/issues/1005) for more details.
  • vulkan_use_d32s8: https://crbug.com/dawn/286: Vulkan mandates support of either D32_FLOAT_S8 or D24_UNORM_S8. When available the backend will use D32S8 (toggle to on) but setting the toggle to off will make it use the D24S8 format when possible.
  • vulkan_use_s8: https://crbug.com/dawn/666: Vulkan has a pure stencil8 format but it is not universally available. When this toggle is on, the backend will use S8 for the stencil8 format, otherwise it will fallback to D32S8 or D24S8.
  • disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
  • [WebGPU Forced Toggles - enabled]
  • disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
  • [Supported Features]
  • texture-compression-bc
  • pipeline-statistics-query
  • timestamp-query
  • depth-clamping
  • depth24unorm-stencil8
  • depth32float-stencil8
  • indirect-first-instance
  • dawn-internal-usages
  • dawn-native

  • <CPU> Vulkan backend - SwiftShader Device (Subzero)
    [Default Toggle Names]
  • lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
  • use_temporary_buffer_in_texture_to_texture_copy: https://crbug.com/dawn/42: Split texture-to-texture copy into two copies: copy from source texture into a temporary buffer, and copy from the temporary buffer into the destination texture when copying between compressed textures that don't have block-aligned sizes. This workaround is enabled by default on all Vulkan drivers to solve an issue in the Vulkan SPEC about the texture-to-texture copies with compressed formats. See #1005 (https://github.com/KhronosGroup/Vulkan-Docs/issues/1005) for more details.
  • vulkan_use_d32s8: https://crbug.com/dawn/286: Vulkan mandates support of either D32_FLOAT_S8 or D24_UNORM_S8. When available the backend will use D32S8 (toggle to on) but setting the toggle to off will make it use the D24S8 format when possible.
  • vulkan_use_s8: https://crbug.com/dawn/666: Vulkan has a pure stencil8 format but it is not universally available. When this toggle is on, the backend will use S8 for the stencil8 format, otherwise it will fallback to D32S8 or D24S8.
  • disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
  • use_vulkan_zero_initialize_workgroup_memory_extension: https://crbug.com/dawn/1302: Initialize workgroup memory with OpConstantNull on Vulkan when the Vulkan extension VK_KHR_zero_initialize_workgroup_memory is supported.
  • [WebGPU Forced Toggles - enabled]
  • disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
  • [Supported Features]
  • texture-compression-bc
  • texture-compression-etc2
  • texture-compression-astc
  • timestamp-query
  • depth-clamping
  • depth32float-stencil8
  • indirect-first-instance
  • dawn-internal-usages
  • dawn-native

Version Information

Data exported
2022-08-16T14:53:41.506Z
Chrome version
Chrome/104.0.5112.81
Operating system
Windows NT 10.0.19044
Software rendering list URL
Driver bug list URL
ANGLE commit id
2693b03eba82
2D graphics backend
Skia/104 5a4dbb2e97302f7e574f0ba962ac4d8b3a62a36e
Command Line
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-features --disable-features --flag-switches-begin --allow-insecure-localhost --force-webxr-runtime=openxr --flag-switches-end

Driver Information

Initialization time
198
In-process GPU
false
Passthrough Command Decoder
true
Sandboxed
true
GPU0
VENDOR= 0x10de, DEVICE=0x1e07, SUBSYS=0x37111462, REV=161, LUID={0,59810}, DRIVER_VENDOR=NVIDIA, DRIVER_VERSION=27.21.14.5751 *ACTIVE*
GPU1
VENDOR= 0x1414, DEVICE=0x008c, LUID={0,62865}, DRIVER_VERSION=10.0.19041.546
Optimus
false
AMD switchable
false
Desktop compositing
Aero Glass
Direct composition
true
Supports overlays
true
YUY2 overlay support
SOFTWARE
NV12 overlay support
SCALING
BGRA8 overlay support
SOFTWARE
RGB10A2 overlay support
SOFTWARE
Diagonal Monitor Size of \\.\DISPLAY1
31.5"
Driver D3D12 feature level
D3D 12.1
Driver Vulkan API version
Vulkan API 1.3.0
GPU CUDA compute capability major version
0
Pixel shader version
5.0
Vertex shader version
5.0
Max. MSAA samples
8
Machine model name
Machine model version
GL_VENDOR
Google Inc. (NVIDIA)
GL_RENDERER
ANGLE (NVIDIA, NVIDIA GeForce RTX 2080 Ti Direct3D11 vs_5_0 ps_5_0, D3D11-27.21.14.5751)
GL_VERSION
OpenGL ES 2.0.0 (ANGLE 2.1.18844 git hash: 2693b03eba82)
GL_EXTENSIONS
GL_AMD_performance_monitor GL_ANGLE_base_vertex_base_instance GL_ANGLE_base_vertex_base_instance_shader_builtin GL_ANGLE_client_arrays GL_ANGLE_depth_texture GL_ANGLE_framebuffer_blit GL_ANGLE_framebuffer_multisample GL_ANGLE_get_serialized_context_string GL_ANGLE_get_tex_level_parameter GL_ANGLE_instanced_arrays GL_ANGLE_lossy_etc_decode GL_ANGLE_memory_size GL_ANGLE_multi_draw GL_ANGLE_pack_reverse_row_order GL_ANGLE_program_cache_control GL_ANGLE_provoking_vertex GL_ANGLE_request_extension GL_ANGLE_robust_client_memory GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ANGLE_texture_usage GL_ANGLE_translated_shader_source GL_CHROMIUM_bind_generates_resource GL_CHROMIUM_bind_uniform_location GL_CHROMIUM_color_buffer_float_rgb GL_CHROMIUM_color_buffer_float_rgba GL_CHROMIUM_copy_compressed_texture GL_CHROMIUM_copy_texture GL_CHROMIUM_lose_context GL_CHROMIUM_sync_query GL_EXT_EGL_image_external_wrap_modes GL_EXT_blend_func_extended GL_EXT_blend_minmax GL_EXT_clip_control GL_EXT_color_buffer_half_float GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers GL_EXT_draw_elements_base_vertex GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_multi_draw_indirect GL_EXT_multisampled_render_to_texture GL_EXT_occlusion_query_boolean GL_EXT_read_format_bgra GL_EXT_robustness GL_EXT_sRGB GL_EXT_shader_texture_lod GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc_srgb GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_norm16 GL_EXT_texture_rg GL_EXT_texture_storage GL_EXT_texture_type_2_10_10_10_REV GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_parallel_shader_compile GL_NV_EGL_stream_consumer_external GL_NV_fence GL_NV_framebuffer_blit GL_NV_pack_subimage GL_NV_pixel_buffer_object GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_compressed_EAC_R11_signed_texture GL_OES_compressed_EAC_R11_unsigned_texture GL_OES_compressed_EAC_RG11_signed_texture GL_OES_compressed_EAC_RG11_unsigned_texture GL_OES_compressed_ETC2_RGB8_texture GL_OES_compressed_ETC2_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture GL_OES_compressed_ETC2_sRGB8_alpha8_texture GL_OES_compressed_ETC2_sRGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_draw_elements_base_vertex GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_border_clamp GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_vertex_array_object GL_WEBGL_video_texture
Disabled Extensions
GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent
Disabled WebGL Extensions
Window system binding vendor
Google Inc. (NVIDIA)
Window system binding version
1.5 (ANGLE 2.1.18844 git hash: 2693b03eba82)
Window system binding extensions
EGL_EXT_create_context_robustness EGL_ANGLE_d3d_share_handle_client_buffer EGL_ANGLE_d3d_texture_client_buffer EGL_ANGLE_surface_d3d_texture_2d_share_handle EGL_ANGLE_query_surface_pointer EGL_ANGLE_window_fixed_size EGL_ANGLE_keyed_mutex EGL_ANGLE_surface_orientation EGL_ANGLE_direct_composition EGL_NV_post_sub_buffer EGL_KHR_create_context EGL_KHR_image EGL_KHR_image_base EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_get_all_proc_addresses EGL_KHR_stream EGL_KHR_stream_consumer_gltexture EGL_NV_stream_consumer_gltexture_yuv EGL_ANGLE_stream_producer_d3d_texture EGL_ANGLE_create_context_webgl_compatibility EGL_CHROMIUM_create_context_bind_generates_resource EGL_CHROMIUM_sync_control EGL_EXT_pixel_format_float EGL_KHR_surfaceless_context EGL_ANGLE_display_texture_share_group EGL_ANGLE_display_semaphore_share_group EGL_ANGLE_create_context_client_arrays EGL_ANGLE_program_cache_control EGL_ANGLE_robust_resource_initialization EGL_ANGLE_create_context_extensions_enabled EGL_ANDROID_blob_cache EGL_ANDROID_recordable EGL_ANGLE_image_d3d11_texture EGL_ANGLE_create_context_backwards_compatible EGL_KHR_no_config_context EGL_KHR_create_context_no_error EGL_KHR_reusable_sync
Direct rendering version
unknown
Reset notification strategy
0x8252
GPU process crash count
0
gfx::BufferFormats supported for allocation and texturing
R_8: not supported, R_16: not supported, RG_88: not supported, RG_1616: not supported, BGR_565: not supported, RGBA_4444: not supported, RGBX_8888: not supported, RGBA_8888: not supported, BGRX_8888: not supported, BGRA_1010102: not supported, RGBA_1010102: not supported, BGRA_8888: not supported, RGBA_F16: not supported, YVU_420: not supported, YUV_420_BIPLANAR: not supported, P010: not supported

Compositor Information

Tile Update Mode
One-copy
Partial Raster
Enabled

GpuMemoryBuffers Status

R_8
Software only
R_16
Software only
RG_88
Software only
RG_1616
Software only
BGR_565
Software only
RGBA_4444
Software only
RGBX_8888
GPU_READ, SCANOUT
RGBA_8888
GPU_READ, SCANOUT
BGRX_8888
Software only
BGRA_1010102
Software only
RGBA_1010102
Software only
BGRA_8888
Software only
RGBA_F16
Software only
YVU_420
Software only
YUV_420_BIPLANAR
GPU_READ, SCANOUT
P010
Software only

Display(s) Information

Info
Display[2528732444] bounds=[0,0 1920x1080], workarea=[0,0 1920x1080], scale=1, rotation=0, panel_rotation=0 external.
Color space (sRGB/no-alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (sRGB/no-alpha)
BGRX_8888
Color space (sRGB/alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (sRGB/alpha)
BGRA_8888
Color space (WCG/no-alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (WCG/no-alpha)
BGRX_8888
Color space (WCG/alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (WCG/alpha)
BGRA_8888
Color space (HDR/no-alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (HDR/no-alpha)
BGRX_8888
Color space (HDR/alpha)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (HDR/alpha)
BGRA_8888
SDR white level in nits
203
HDR relative maximum luminance
1
Bits per color component
8
Bits per pixel
24
Refresh Rate in Hz
60

Video Acceleration Information

Decoding
Decode h264 baseline
64x64 to 4096x4096 pixels
Decode h264 main
64x64 to 4096x4096 pixels
Decode h264 high
64x64 to 4096x4096 pixels
Decode vp9 profile0
64x64 to 8192x8192 pixels
Decode vp9 profile2
64x64 to 8192x8192 pixels
Encoding
Encode h264 baseline
0x0 to 1920x1088 pixels, and/or 30.000 fps
Encode h264 main
0x0 to 1920x1088 pixels, and/or 30.000 fps
Encode h264 high
0x0 to 1920x1088 pixels, and/or 30.000 fps

Vulkan Information

Device Performance Information

Total Physical Memory (Gb)
15
Total Disk Space (Gb)
237
Hardware Concurrency
8
System Commit Limit (Gb)
31
D3D11 Feature Level
12_1
Has Discrete GPU
yes
Software Rendering
No

Diagnostics

Log Messages

  • Removed

Philip Taylor

unread,
Aug 16, 2022, 2:22:22 PMAug 16
to webgl-d...@googlegroups.com
And just one thing to point out is that I am seeing the same behaviour across a range of devices. 
I am also testing on a Microsoft Surface and see the same performance issues. 
The real target is mobile devices, but I try to polish a bit more on desktop before making the transition to mobile.

Kelsey Gilbert

unread,
Aug 16, 2022, 3:40:33 PMAug 16
to webgl-d...@googlegroups.com
In that Firefox profile, nothing initially jumps out as super obvious.


In "Flame Graph", we can see that probably the most suspect thing is that ~22% of the time, the "Compositor" thread (where actual GL calls are executed) is idle.
In Firefox, you might try using requestPostAnimationFrame-style render loops, with the polyfill here: https://hackmd.io/@jgilbert/HkwAQHKRr?type=view#Use-requestPostAnimationFrame-not-requestAnimationFrame
Firefox is not as good at doing workload compensation for requestAnimationFrame, so Firefox is prone to triggering requestAnimationFrame later than your non-trivial webgl workloads would like.
However, Chrome both does better at workload compensation for requestAnimationFrame, and simultaneously behaves *worse* if you try something like requestPostAnimationFrame, at least last I checked. (That's why this recommendation was removed from the "official" best practices list at https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices )


The other thing I see is that ~42% of the non-idle time in "Compositor" is spent in `rx::StateManager11::updateState` within the ANGLE GL driver.
19% of the non-idle time is with that in `rx::VertexDataManager::StoreStaticAttrib`, which seems to be making a copy of a buffer with different formatting for vertex attribs. My guess is that d3d doesn't natively support the vertexAttribPointer formats you're asking for, causing the ANGLE GL driver to have to do a copy as a translation. If you can instead avoid this copy/reformat/translation, you should get better perf.
Specifically, we can see in that profile the two copy functions, which actually have template params which kinda tell us what's being translated:
* `rx::CopyNativeVertexData<signed char,3,4,1>`
* `rx::CopyNativeVertexData<unsigned short,3,4,15360>`
If you right click on these and "look up the function name in Searchfox", you can find the implementation:
You can see that the declaration is:
```
template <typename T,
size_t inputComponentCount,
size_t outputComponentCount,
uint32_t alphaDefaultValueBits>
inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
```
It looks like CopyNativeVertexData<signed char,3,4,1> is converting gl.BYTE[3] {x, y, z} to [4]{x, y, z, 0x01}, and CopyNativeVertexData<unsigned short,3,4,15360> is converting gl.HALF_FLOAT[3] {x, y, z} to [4]{x, y, z, 0x3c00} (float16(1.0)=0x3c00=15360).
You can probably eliminate this overhead by using size=4 instead of size=3 in gl,vertexAttribPointer. (or vertexAttribIPointer for the non-normalized BYTE one?)

This is actually probably what's causing your issue with bufferSubData updates, though this is attrib data updates, not index buffers. When the attrib buffer is changed, ANGLE's GL driver needs to *retranslate* these size=3 attribs to size=4 for D3D.
In general you really do want to avoid using 3-channel anywhere, since in almost all cases, it's padded out to 4-channel anyway, sometimes at painful cost, like we can see here.


Hopefully some of that helps, but it's always hard to say for sure! :)

-Kelsey

Kelsey Gilbert

unread,
Aug 16, 2022, 3:43:29 PMAug 16
to webgl-d...@googlegroups.com
Oops, I'll mention that there's still a chance this is caused by index buffer updates, because ANGLE may be trying to be lazy about which attrib buffers to translate, and each new index buffer update might invalidate the cached translated vertex buffers. The fix would still be to have your attributes in a layout that doesn't need translation though. If this ends up being the issue, I'd like to add this to the MDN WebGL Best Practices doc. :)

Philip Taylor

unread,
Aug 29, 2022, 11:54:29 AMAug 29
to webgl-d...@googlegroups.com
Hi Kelsey, first I must apologize for the late reply. I did see this come in, but my time got totally swamped with other projects. 
And, also thank you for such a deep and thorough response. For us developers wanting to push the limits of WebGL, getting to peek under the hood in ways you have shown here, it is very enlightening. 

I have investigated the various paints you have raised.
I have tested the  requestPostAnimationFrame and it only provided nominal improvement, but I do understand the reasoning behind this API call. I had been thinking that it would be more efficient to run the WebGL renderer as early in the JAvaScript event loop as possible. In some of our scenes, where we do a lot of updates to the GL context, it could have a bigger improvement, so I am going to keep it in.

The next point, which appears to shine a light on something we can fix, is to avoid using 3-channel vertex buffers. What I had incorrectly thought was that the padding to 4-channel occurred in the GPU on the fly, rather than during upload. This is the kind of info that would be quite helpful in the WebGL best practices document. 
It is fairly easy to update our code to avoid using 3-channel buffers, and I will work on that right away. 
My intuition was making me think that it was the re-validation of the index buffer that was causing pauses after uploading more geometry data, but actually re-formatting the 3-channel values to 4-channel would be far more expensive than the index buffer validation.

If it is possible that 'CopyNativeVertexData' is invoked lazilly, then that would explain why my manual timing of my JS code was leading me nowhere. 

A final note: The non-normalized BYTE attribute is our normals, that we normalize in the fragment shader after vertex shader interpolation.

Thanks again for taking the time to look at this issue on my behalf.  


Reply all
Reply to author
Forward
0 new messages