-
-
Notifications
You must be signed in to change notification settings - Fork 35.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Texture: Performance issues with hardware sRGB decode. #26183
Comments
Do you see similar performance issues on macOS or other OS as well? There was an issue with Chromium on Windows but it has been fixed for quite a while now: https://bugs.chromium.org/p/chromium/issues/detail?id=1256340 Can you also make a test with Firefox? |
On my laptop (MacBook Pro, Apple M1 Pro, Chromium-based browser) I don't see a difference, would be curious for the result in Firefox on Windows as well. |
@Mugen87 @donmccurdy i'm not familiar with Firefox devTool, it's hard to tell but i would say it's not as obvious as Chrome |
I see the difference using MacBook air M1 2020 but less compared to Windows |
I also see a massive performance drop on my M1 macbook air between these two versions on Chrome. I wonder if this is related to sRGB -> Linear encoding. I recently ran into an issue with updating a CanvasTexture animation and can only get reasonable performance if I set the texture encoding to Linear. Here's a minimal example: |
@toddka I see no FPS difference no matter using sRGB or linear-srgb. I'm on Chrome 114.0.5735.90, macOS 13.4 and a M2 Pro. Can you please quantify the difference in performance so we can compare your FPS values? |
I'm on Chrome 114.0.5735.90, M1 2020 Macbook Air, MacOS Ventura 13.0.1. Canvas width and height seem significant. If I decrease the canvas size FPS increases. I'm seeing the FPS drop from stable 60 FPS to 23-28 FPS when switching to Let me know if I can provide anything more concrete in terms of performance numbers or repro. I'm also not sure if the issue in my sandbox is related to this, so happy to create another issue if requested! I've run into OP's video performance issue as well. |
I've made a more intense test case and now I can confirm performance issues with hardware sRGB decode in Chrome. The following fiddles update a 4096x4096 canvas texture per frame: (A) (A) runs with 60 FPS, (B) with 7 FPS. The entire tab becomes quite slow with (B). I don't see this kind of performance difference with Firefox. Both fiddles run with 23 FPS. Safari slows down from 15 to 8 FPS. @donmccurdy Can you reproduce on your MacBook? |
Chrome/114.0.5735.90 Linux ANGLE (AMD, AMD Radeon RX 460 Graphics (polaris11 LLVM 16.0.4), OpenGL 4.6 (Core Profile) Mesa 23.0.3) (A) 60 FPS |
DEV Chrome/115.0.5790.3 Linux ANGLE (AMD, Vulkan 1.3.238 (AMD Radeon RX 460 Graphics (RADV POLARIS11) (0x000067EF)), radv-23.0.3)], DRIVER_VENDOR=AMD, DRIVER_VERSION=23.0.3 (A) 60 FPS |
Interesting. I've made a test with Chrome Canary (116.0.5809.0) and both fiddles run with 60 FPS! |
So it seems that the issue was fixed in Chrome 115? |
I'm still seeing this issue across wide variety of hardware, browser and OS versions, including Chrome 116: Tested both of @Mugen87's fiddles:
This issue is currently blocking us from shipping a new feature, let us know how we can help. |
For what it's worth: Tested both of @Mugen87's fiddles again: Firefox performs bad, but consistently bad, no difference between those fiddles: Firefox 109, Mac OS Ventura, M1 Max, 16 inch:
Firefox 109, Mac OS Catalina, Intel i9, AMD Radeon Pro 5500M 8GB
Firefox 109, Windows 10, Intel i5, Nvidia GTX 1650:
Safari 16.3, Ventura M1 Max 16 inch:
Safari 13.1.3, Catalina, Intel i9, AMD Radeon Pro 5500M 8GB:
|
|
Nothing broke. Here is the fiddle using the deprecated |
It is strange that Chrome >= 115 fixes the issue for some setups, but not for all. Probably worth reporting the issue to the Chromium bug tracker. |
@Mugen87 ah you're right, forgot about the name change |
Is it possible to check if the ANGLE WebGL backend is enabled or disabled? |
@dfeehrer Do you mind typing |
Here's the report for the M1 Max Mac, Chrome 115: GPU reportGraphics 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 Skia Graphite: Disabled Video Decode: Hardware accelerated Video Encode: Hardware accelerated WebGL: Hardware accelerated WebGL2: Hardware accelerated WebGPU: Hardware accelerated Driver Bug Workarounds adjust_src_dst_region_for_blitframebuffer clamp_texture_base_level_and_max_level decode_encode_srgb_for_generatemipmap disable_2d_canvas_auto_flush enable_webgl_timer_query_extensions get_frag_data_info_bug pack_parameters_workaround_with_pack_buffer regenerate_struct_names remove_dynamic_indexing_of_swizzled_vector remove_invariant_and_centroid_for_essl3 set_zero_level_before_generating_mipmap unfold_short_circuit_as_ternary_operation unpack_alignment_workaround_with_unpack_buffer use_intermediary_for_copy_texture_image use_unused_standard_shared_blocks disabled_extension_GL_KHR_blend_equation_advanced disabled_extension_GL_KHR_blend_equation_advanced_coherent disabled_extension_GL_MESA_framebuffer_flip_y Problems Detected Unfold short circuit on Mac OS X: [307751](http://crbug.com/307751) Applied Workarounds: unfold_short_circuit_as_ternary_operation Mac drivers handle struct scopes incorrectly: [403957](http://crbug.com/403957) Applied Workarounds: regenerate_struct_names glGenerateMipmap fails if the zero texture level is not set on some Mac drivers: [560499](http://crbug.com/560499) Applied Workarounds: set_zero_level_before_generating_mipmap Pack parameters work incorrectly with pack buffer bound: [563714](http://crbug.com/563714) Applied Workarounds: pack_parameters_workaround_with_pack_buffer Alignment works incorrectly with unpack buffer bound: [563714](http://crbug.com/563714) Applied Workarounds: unpack_alignment_workaround_with_unpack_buffer copyTexImage2D fails when reading from IOSurface on multiple GPU types.: [581777](http://crbug.com/581777) Applied Workarounds: use_intermediary_for_copy_texture_image glGetFragData{Location|Index} works incorrectly on Max: [638340](http://crbug.com/638340) Applied Workarounds: get_frag_data_info_bug Decode and encode before generateMipmap for srgb format textures on macosx: [634519](http://crbug.com/634519) Applied Workarounds: decode_encode_srgb_for_generatemipmap Insert statements to reference all members in unused std140/shared blocks on Mac: [618464](http://crbug.com/618464) Applied Workarounds: use_unused_standard_shared_blocks adjust src/dst region if blitting pixels outside framebuffer on Mac: [644740](http://crbug.com/644740) Applied Workarounds: adjust_src_dst_region_for_blitframebuffer Mac driver GL 4.1 requires invariant and centroid to match between shaders: [639760](http://crbug.com/639760), [641129](http://crbug.com/641129) Applied Workarounds: remove_invariant_and_centroid_for_essl3 Disable KHR_blend_equation_advanced until cc shaders are updated: [661715](http://crbug.com/661715) Applied Workarounds: disable(GL_KHR_blend_equation_advanced), disable(GL_KHR_blend_equation_advanced_coherent) Expose WebGL's disjoint_timer_query extensions on platforms with site isolation: [808744](http://crbug.com/808744), [870491](http://crbug.com/870491) Applied Workarounds: enable_webgl_timer_query_extensions glFlush error on Mac: [841755](http://crbug.com/841755) Applied Workarounds: disable_2d_canvas_auto_flush Clamp texture's BASE_LEVEL/MAX_LEVEL for GenerateMipmap: [913301](http://crbug.com/913301) Applied Workarounds: clamp_texture_base_level_and_max_level Disable GL_MESA_framebuffer_flip_y for desktop GL: [964010](http://crbug.com/964010) Applied Workarounds: disable(GL_MESA_framebuffer_flip_y) Remove dynamic indexing for swizzled vectors on Mac: [709351](http://crbug.com/709351) Applied Workarounds: remove_dynamic_indexing_of_swizzled_vector ANGLE Features allowCompressedFormats (Frontend workarounds): Enabled: true Allow compressed formats cacheCompiledShader (Frontend features) [anglebug:7036](http://anglebug.com/7036): Disabled Enable to cache compiled shaders disableAnisotropicFiltering (Frontend workarounds): Disabled Disable support for anisotropic filtering disableDrawBuffersIndexed (Frontend features) [anglebug:7724](http://anglebug.com/7724): Disabled Disable support for OES_draw_buffers_indexed and EXT_draw_buffers_indexed disableProgramBinary (Frontend features) [anglebug:5007](http://anglebug.com/5007): Disabled: IsPowerVrRogue(functions) Disable support for GL_OES_get_program_binary disableProgramCaching (Frontend features) [anglebug:1423136](http://anglebug.com/1423136): Disabled Disables saving programs to the cache disableProgramCachingForTransformFeedback (Frontend workarounds): Disabled: !isMesa && isQualcomm On some GPUs, program binaries don't contain transform feedback varyings dumpShaderSource (Frontend features) [anglebug:7760](http://anglebug.com/7760): Disabled Write shader source to temp directory emulatePixelLocalStorage (Frontend features) [anglebug:7279](http://anglebug.com/7279): Enabled: true Emulate ANGLE_shader_pixel_local_storage using shader images enableCaptureLimits (Frontend features) [anglebug:5750](http://anglebug.com/5750): Disabled Set the context limits like frame capturing was enabled enableProgramBinaryForCapture (Frontend features) [anglebug:5658](http://anglebug.com/5658): Disabled Even if FrameCapture is enabled, enable GL_OES_get_program_binary enableShaderSubstitution (Frontend workarounds) [anglebug:7761](http://anglebug.com/7761): Disabled Check the filesystem for shaders to use instead of those provided through glShaderSource forceDepthAttachmentInitOnClear (Frontend workarounds) [anglebug:7246](https://anglebug.com/7246): Disabled Force depth attachment initialization on clear ops forceGlErrorChecking (Frontend features) https://issuetracker.google.com/220069903: Disabled Force GL error checking (i.e. prevent applications from disabling error checking forceInitShaderVariables (Frontend features): Disabled Force-enable shader variable initialization forceRobustResourceInit (Frontend features) [anglebug:6041](http://anglebug.com/6041): Disabled 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) [1165751](http://crbug.com/1165751): Disabled: false Always rewrite vec/mat constructors to be consistent singleThreadedTextureDecompression (Frontend workarounds): Disabled Disables multi-threaded decompression of compressed texture formats RGBA4IsNotSupportedForColorRendering (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isIntel GL_RGBA4 is not color renderable RGBDXT1TexturesSampleZeroAlpha (OpenGL workarounds) [anglebug:3729](http://anglebug.com/3729): Enabled: IsApple() Sampling BLACK texels from RGB DXT1 textures returns transparent black on Mac. addAndTrueToLoopCondition (OpenGL workarounds): Disabled: IsApple() && isIntel Calculation of loop conditions in for and while loop has bug adjustSrcDstRegionForBlitFramebuffer (OpenGL workarounds) [830046](http://crbug.com/830046): Disabled: IsLinux() || (IsAndroid() && isNvidia) || (IsWindows() && isNvidia) || (IsApple() && functions->standard == STANDARD_GL_ES) Many platforms have issues with blitFramebuffer when the parameters are large. allowAstcFormats (OpenGL workarounds): Enabled: !isMesa || isIntel && (Is9thGenIntel(device) || IsGeminiLake(device) || IsCoffeeLake(device) || Is11thGenIntel(device) || Is12thGenIntel(device)) Enable ASTC on desktop OpenGL allowClearForRobustResourceInit (OpenGL workarounds) [848952](https://crbug.com/848952%20http://crbug.com/883276): Enabled: IsApple() Using glClear for robust resource initialization is buggy on some drivers and leads to texture corruption. Default to data uploads except on MacOS where it is very slow. allowETCFormats (OpenGL workarounds): Disabled: isIntel && !IsSandyBridge(device) && !IsIvyBridge(device) && !IsHaswell(device) Enable ETC2/EAC on desktop OpenGL alwaysCallUseProgramAfterLink (OpenGL workarounds) [110263](http://crbug.com/110263): Enabled: true Always call useProgram after a successful link to avoid a driver bug alwaysUnbindFramebufferTexture2D (OpenGL workarounds) [anglebug:5536](https://anglebug.com/5536): Disabled: isNvidia && (IsWindows() || IsLinux()) Force unbind framebufferTexture2D before binding renderbuffer to work around driver bug. avoid1BitAlphaTextureFormats (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isAMD Issue with 1-bit alpha framebuffer formats bindFramebufferForTimerQueries (OpenGL workarounds) [1356053](https://crbug.com/1356053): Disabled: IsMali(functions) Some drivers require a non-zero framebuffer when beginQuery for TimeElapsed orTimestampis called. bindTransformFeedbackBufferBeforeBindBufferRange (OpenGL workarounds) [anglebug:5140](https://anglebug.com/5140): Enabled: IsApple() Bind transform feedback buffers to the generic binding point before calling glBindBufferBase or glBindBufferRange. clampArrayAccess (OpenGL workarounds) [anglebug:2978](http://anglebug.com/2978): Enabled: IsAndroid() || isAMD || !functions->hasExtension("GL_KHR_robust_buffer_access_behavior") Clamp uniform array access to avoid reading invalid memory. clampFragDepth (OpenGL workarounds): Disabled: isNvidia gl_FragDepth is not clamped correctly when rendering to a floating point depth buffer clampMscRate (OpenGL workarounds) [1042393](https://crbug.com/1042393): Disabled: IsLinux() && IsWayland() Some drivers return bogus values for GetMscRate, so we clamp it to 30Hz clampPointSize (OpenGL workarounds): Disabled: IsAndroid() || isNvidia The point size range reported from the API is inconsistent with the actual behavior clearToZeroOrOneBroken (OpenGL workarounds) [710443](https://crbug.com/710443): Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 6) Clears when the clear color is all zeros or ones do not work. clipSrcRegionForBlitFramebuffer (OpenGL workarounds) [830046](http://crbug.com/830046): Enabled: IsApple() || (IsLinux() && isAMD) Issues with blitFramebuffer when the parameters don't match the framebuffer size. decodeEncodeSRGBForGenerateMipmap (OpenGL workarounds) [anglebug:4646](http://anglebug.com/4646): Enabled: IsApple() Decode and encode before generateMipmap for srgb format textures. disableBaseInstanceVertex (OpenGL workarounds) [anglebug:8172](http://anglebug.com/8172): Disabled: IsMaliValhall(functions) Some Mali drivers have buggy implementations of glDraw*BaseVertex*. disableBlendFuncExtended (OpenGL workarounds) [anglebug:1085](http://anglebug.com/1085): Disabled: (!isMesa && isQualcomm) || (IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 14, 0)) ARB_blend_func_extended does not pass the tests disableClipControl (OpenGL features) [1434317](http://crbug.com/1434317): Disabled: IsMaliG72OrG76(functions) Some ARM Mali devices genenerate errors when querying the clip control state. disableDrawBuffersIndexed (OpenGL workarounds): Disabled: IsWindows() && isAMD Disable OES_draw_buffers_indexed extension. disableGPUSwitchingSupport (OpenGL workarounds) [1091824](https://crbug.com/1091824): Disabled: isDualGPUMacWithNVIDIA Disable GPU switching support (use only the low-power GPU) on older MacBook Pros. disableMultisampledRenderToTexture (OpenGL workarounds) [anglebug:2894](http://anglebug.com/2894): Disabled: isAdreno4xxOnAndroidLessThan51 || isAdreno4xxOnAndroid70 || isAdreno5xxOnAndroidLessThan70 || isAdreno5xxOnAndroid71 || isLinuxVivante || IsAndroid() Many drivers have bugs when using GL_EXT_multisampled_render_to_texture disableNativeParallelCompile (OpenGL workarounds) [1094869](http://crbug.com/1094869): Disabled: isTSANBuild && IsLinux() && isNvidia Do not use native KHR_parallel_shader_compile even when available. disableSemaphoreFd (OpenGL workarounds) [1046462](https://crbug.com/1046462): Disabled: IsLinux() && isAMD && isMesa && mesaVersion < (std::array{19, 3, 5}) Disable GL_EXT_semaphore_fd extension disableSyncControlSupport (OpenGL workarounds) [1137851](https://crbug.com/1137851): Disabled: IsLinux() && isIntel && isMesa && mesaVersion[0] == 20 Speculative fix for issues on Linux/Wayland where exposing GLX_OML_sync_control renders Chrome unusable disableTextureClampToBorder (OpenGL workarounds) [anglebug:7405](https://anglebug.com/7405): Disabled: isImagination Imagination devices generate INVALID_ENUM when setting the texture border color. disableTimestampQueries (OpenGL workarounds) [811661](https://crbug.com/811661): Disabled: (IsLinux() && isVMWare) || (IsAndroid() && isNvidia) || (IsAndroid() && GetAndroidSdkLevel() < 27 && IsAdreno5xxOrOlder(functions)) || (!isMesa && IsMaliT8xxOrOlder(functions)) || (!isMesa && IsMaliG31OrOlder(functions)) Disable GL_EXT_disjoint_timer_query extension disableWorkerContexts (OpenGL workarounds) [849576](http://crbug.com/849576): Disabled: (IsWindows() && (isIntel || isAMD)) || (IsLinux() && isNvidia) || IsIOS() || IsAndroid() || IsAndroidEmulator(functions) Some tests have been seen to fail using worker contexts doWhileGLSLCausesGPUHang (OpenGL workarounds) [644669](http://crbug.com/644669): Disabled: IsApple() && functions->standard == STANDARD_GL_DESKTOP && GetMacOSVersion() < OSVersion(10, 11, 0) Some GLSL constructs involving do-while loops cause GPU hangs doesSRGBClearsOnLinearFramebufferAttachments (OpenGL workarounds): Disabled: isIntel || isAMD Issue clearing framebuffers with linear attachments when GL_FRAMEBUFFER_SRGB is enabled dontInitializeUninitializedLocals (OpenGL workarounds) [anglebug:2046](http://anglebug.com/2046): Disabled: !isMesa && isQualcomm Initializing uninitialized locals caused odd behavior in a few WebGL 2 tests dontRelinkProgramsInParallel (OpenGL workarounds) [anglebug:3045](http://anglebug.com/3045): Disabled: IsAndroid() || (IsWindows() && isIntel) Relinking a program in parallel is buggy dontUseLoopsToInitializeVariables (OpenGL workarounds) [809422](http://crbug.com/809422): Disabled: (!isMesa && isQualcomm) || (isIntel && IsApple()) For loops used to initialize variables hit native GLSL compiler bugs emulateAbsIntFunction (OpenGL workarounds) [642227](http://crbug.com/642227): Disabled: IsApple() && isIntel abs(i) where i is an integer returns unexpected result emulateAtan2Float (OpenGL workarounds) [672380](http://crbug.com/672380): Disabled: isNvidia atan(y, x) may return a wrong answer emulateClipDistanceState (OpenGL workarounds): Disabled: isQualcomm Some drivers ignore GL_CLIP_DISTANCEi_EXT state. emulateCopyTexImage2D (OpenGL workarounds): Enabled: isApple Replace CopyTexImage2D with TexImage2D + CopyTexSubImage2D. emulateCopyTexImage2DFromRenderbuffers (OpenGL workarounds) [anglebug:4674](https://anglebug.com/4674): Disabled: IsApple() && functions->standard == STANDARD_GL_ES && !(isAMD && IsWindows()) CopyTexImage2D spuriously returns errors on iOS when copying from renderbuffers. emulateImmutableCompressedTexture3D (OpenGL workarounds) [1060012](https://crbug.com/1060012): Disabled: isQualcomm Use non-immutable texture allocation to work around a driver bug. emulateIsnanFloat (OpenGL workarounds) [650547](http://crbug.com/650547): Disabled: isIntel && IsApple() && IsSkylake(device) && GetMacOSVersion() < OSVersion(10, 13, 2) Using isnan() on highp float will get wrong answer emulateMaxVertexAttribStride (OpenGL workarounds) [anglebug:1936](http://anglebug.com/1936): Disabled: IsLinux() && functions->standard == STANDARD_GL_DESKTOP && isAMD Some drivers return 0 when MAX_VERTEX_ATTRIB_STRIED queried emulatePackSkipRowsAndPackSkipPixels (OpenGL workarounds) [anglebug:4849](https://anglebug.com/4849): Enabled: IsApple() GL_PACK_SKIP_ROWS and GL_PACK_SKIP_PIXELS are ignored in Apple's OpenGL driver. emulatePrimitiveRestartFixedIndex (OpenGL workarounds) [anglebug:3997](http://anglebug.com/3997): Enabled: functions->standard == STANDARD_GL_DESKTOP && functions->isAtLeastGL(gl::Version(3, 1)) && !functions->isAtLeastGL(gl::Version(4, 3)) When GL_PRIMITIVE_RESTART_FIXED_INDEX is not available, emulate it with GL_PRIMITIVE_RESTART and glPrimitiveRestartIndex. emulateRGB10 (OpenGL workarounds) [1300575](https://crbug.com/1300575): Enabled: functions->standard == STANDARD_GL_DESKTOP Emulate RGB10 support using RGB10_A2. finishDoesNotCauseQueriesToBeAvailable (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isNvidia glFinish doesn't cause all queries to report available result flushBeforeDeleteTextureIfCopiedTo (OpenGL workarounds) [anglebug:4267](http://anglebug.com/4267): Disabled: IsApple() && isIntel Some drivers track CopyTex{Sub}Image texture dependencies incorrectly. Flush before glDeleteTextures in this case flushOnFramebufferChange (OpenGL workarounds) [1181068](http://crbug.com/1181068): Disabled: IsApple() && Has9thGenIntelGPU(systemInfo) Switching framebuffers without a flush can lead to crashes on Intel 9th Generation GPU Macs. initFragmentOutputVariables (OpenGL workarounds) [1171371](http://crbug.com/1171371): Disabled: IsAdreno42xOr3xx(functions) No init gl_FragColor causes context lost initializeCurrentVertexAttributes (OpenGL workarounds): Disabled: isNvidia During initialization, assign the current vertex attributes to the spec-mandated defaults keepBufferShadowCopy (OpenGL workarounds): Disabled: !CanMapBufferForRead(functions) Maintain a shadow copy of buffer data when the GL API does not permit reading data back. limitMax3dArrayTextureSizeTo1024 (OpenGL workarounds) [927470](http://crbug.com/927470): Disabled: limitMaxTextureSize Limit max 3d texture size and max array texture layers to 1024 to avoid system hang limitMaxMSAASamplesTo4 (OpenGL workarounds) [797243](http://crbug.com/797243): Disabled: IsAndroid() || (IsApple() && (isIntel || isAMD || isNvidia)) Various rendering bugs have been observed when using higher MSAA counts limitWebglMaxTextureSizeTo4096 (OpenGL workarounds) [927470](http://crbug.com/927470): Disabled: IsAndroid() || limitMaxTextureSize Limit webgl max texture size to 4096 to avoid frequent out-of-memory errors packLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) [anglebug:1512](http://anglebug.com/1512): Enabled: IsApple() || isNvidia When uploading textures from an pack buffer, some drivers count an extra row padding packOverlappingRowsSeparatelyPackBuffer (OpenGL workarounds): Disabled: isNvidia In the case of packing to a pixel pack buffer, pack overlapping rows row by row passHighpToPackUnormSnormBuiltins (OpenGL workarounds) [anglebug:7527](http://anglebug.com/7527): Disabled: isQualcomm packUnorm4x8 fails on Pixel 4 if it is not passed a highp vec4. preAddTexelFetchOffsets (OpenGL workarounds) [642605](http://crbug.com/642605): Disabled: IsApple() && isIntel Intel Mac drivers mistakenly consider the parameter position of nagative vaule as invalid even if the sum of position and offset is in range, so we need to add workarounds by rewriting texelFetchOffset(sampler, position, lod, offset) into texelFetch(sampler, position + offset, lod). promotePackedFormatsTo8BitPerChannel (OpenGL workarounds) [anglebug:5469](http://anglebug.com/5469): Disabled: IsApple() && hasAMD Packed color formats are buggy on Macs with AMD GPUs queryCounterBitsGeneratesErrors (OpenGL workarounds) [anglebug:3027](http://anglebug.com/3027): Disabled: IsNexus5X(vendor, device) Drivers generate errors when querying the number of bits in timer queries readPixelsUsingImplementationColorReadFormatForNorm16 (OpenGL workarounds) [anglebug:4214](http://anglebug.com/4214): Disabled: !isIntel && functions->standard == STANDARD_GL_ES && functions->isAtLeastGLES(gl::Version(3, 1)) && functions->hasGLESExtension("GL_EXT_texture_norm16") Quite some OpenGL ES drivers don't implement readPixels for RGBA/UNSIGNED_SHORT from EXT_texture_norm16 correctly reapplyUBOBindingsAfterUsingBinaryProgram (OpenGL workarounds) [anglebug:1637](http://anglebug.com/1637): Disabled: isAMD || IsAndroid() Some drivers forget about UBO bindings when using program binaries regenerateStructNames (OpenGL workarounds) [403957](http://crbug.com/403957): Enabled: IsApple() All Mac drivers do not handle struct scopes correctly. This workaround overwrites a structname with a unique prefix. removeDynamicIndexingOfSwizzledVector (OpenGL workarounds) [709351](http://crbug.com/709351): Enabled: IsApple() || IsAndroid() || IsWindows() Dynamic indexing of swizzled l-values doesn't work correctly on various platforms. removeInvariantAndCentroidForESSL3 (OpenGL workarounds): Enabled: functions->isAtMostGL(gl::Version(4, 1)) || (functions->standard == STANDARD_GL_DESKTOP && isAMD) Fix spec difference between GLSL 4.1 or lower and ESSL3 resetTexImage2DBaseLevel (OpenGL workarounds) [705865](https://crbug.com/705865): Disabled: IsApple() && isIntel && GetMacOSVersion() >= OSVersion(10, 12, 4) Reset texture base level before calling glTexImage2D to work around pixel comparison failure. rewriteFloatUnaryMinusOperator (OpenGL workarounds) [308366](http://crbug.com/308366): Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 0) Using '-' will get wrong answer rewriteRepeatedAssignToSwizzled (OpenGL workarounds): Disabled: isNvidia Repeated assignment to swizzled values inside a GLSL user-defined function have incorrect results rewriteRowMajorMatrices (OpenGL workarounds) [anglebug:2273](http://anglebug.com/2273): Disabled: false Rewrite row major matrices in shaders as column major as a driver bug workaround sanitizeAMDGPURendererString (OpenGL workarounds) [1181193](http://crbug.com/1181193): Disabled: IsLinux() && hasAMD Strip precise kernel and DRM version information from amdgpu renderer strings. setPrimitiveRestartFixedIndexForDrawArrays (OpenGL workarounds) [anglebug:3997](http://anglebug.com/3997): Disabled: features->emulatePrimitiveRestartFixedIndex.enabled && IsApple() && isIntel Some drivers discard vertex data in DrawArrays calls when the fixed primitive restart index is within the number of primitives being drawn. setZeroLevelBeforeGenerateMipmap (OpenGL workarounds): Enabled: IsApple() glGenerateMipmap fails if the zero texture level is not set on some Mac drivers. shiftInstancedArrayDataWithOffset (OpenGL workarounds) [1144207](http://crbug.com/1144207): Disabled: IsApple() && IsIntel(vendor) && !IsHaswell(device) glDrawArraysInstanced is buggy on certain new Mac Intel GPUs supportsFragmentShaderInterlockARB (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->isAtLeastGL(gl::Version(4, 5)) && functions->hasGLExtension("GL_ARB_fragment_shader_interlock") Backend GL context supports ARB_fragment_shader_interlock extension supportsFragmentShaderInterlockNV (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->isAtLeastGL(gl::Version(4, 3)) && functions->hasGLExtension("GL_NV_fragment_shader_interlock") Backend GL context supports NV_fragment_shader_interlock extension supportsFragmentShaderOrderingINTEL (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->isAtLeastGL(gl::Version(4, 4)) && functions->hasGLExtension("GL_INTEL_fragment_shader_ordering") Backend GL context supports GL_INTEL_fragment_shader_ordering extension supportsShaderFramebufferFetchEXT (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->hasGLESExtension("GL_EXT_shader_framebuffer_fetch") Backend GL context supports EXT_shader_framebuffer_fetch extension supportsShaderFramebufferFetchNonCoherentEXT (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->hasGLESExtension("GL_EXT_shader_framebuffer_fetch_non_coherent") Backend GL context supports EXT_shader_framebuffer_fetch_non_coherent extension supportsShaderPixelLocalStorageEXT (OpenGL features) [anglebug:7279](http://anglebug.com/7279): Disabled: functions->hasGLESExtension("GL_EXT_shader_pixel_local_storage") Backend GL context supports EXT_shader_pixel_local_storage extension syncVertexArraysToDefault (OpenGL workarounds) [anglebug:5577](http://anglebug.com/5577): Disabled: !nativegl::SupportsVertexArrayObjects(functions) Only use the default VAO because of missing support or driver bugs unbindFBOBeforeSwitchingContext (OpenGL workarounds) [1181193](http://crbug.com/1181193): Disabled: IsPowerVR(vendor) Imagination GL drivers are buggy with context switching. unfoldShortCircuits (OpenGL workarounds) [anglebug:482](http://anglebug.com/482): Enabled: IsApple() Mac incorrectly executes both sides of && and || expressions when they should short-circuit. unpackLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) [anglebug:1512](http://anglebug.com/1512): Enabled: IsApple() || isNvidia When uploading textures from an unpack buffer, some drivers count an extra row padding unpackOverlappingRowsSeparatelyUnpackBuffer (OpenGL workarounds): Disabled: isNvidia In the case of unpacking from a pixel unpack buffer, unpack overlapping rows row by row unsizedSRGBReadPixelsDoesntTransform (OpenGL workarounds) [550292](http://crbug.com/550292%20http://crbug.com/565179): Disabled: !isMesa && isQualcomm Drivers returning raw sRGB values instead of linearized values when calling glReadPixels on unsized sRGB texture formats uploadTextureDataInChunks (OpenGL workarounds) [1181068](http://crbug.com/1181068): Enabled: IsApple() Upload texture data in <120kb chunks to work around Mac driver hangs and crashes. useUnusedBlocksWithStandardOrSharedLayout (OpenGL workarounds): Enabled: (IsApple() && functions->standard == STANDARD_GL_DESKTOP) || (IsLinux() && isAMD) Unused std140 or shared uniform blocks will be treated as inactive vertexIDDoesNotIncludeBaseVertex (OpenGL workarounds): Disabled: IsApple() && isAMD gl_VertexID in GLSL vertex shader doesn't include base vertex value DAWN Info Metal backend - Apple M1 Max Metal backend - Apple M1 Max Vulkan backend - SwiftShader Device (LLVM 10.0.0) Vulkan backend - SwiftShader Device (LLVM 10.0.0) |
on Chrome/116.0.5803.2 on Linux Vulcan is enabled as default on this system when i disable vulkan with chrome://flags [ANGLE (AMD, AMD Radeon RX 460 Graphics (polaris11 LLVM 16.0.4), OpenGL 4.6 (Core Profile) Mesa 23.1.1)], DRIVER_VENDOR=Mesa, DRIVER_VERSION=23.1.1 ACTIVE |
Another data point. Windows 11. Chrome Version 116.0.5809.2 (Official Build) canary (64-bit). 3070 with Ryzen 5 5600x. Measured GPU and CPU load with HWiNFO. Only 4-7 fps on the sRGB texture example. 165 fps on linear. Increased CPU and GPU load. Is it possible the color conversion is happening on the CPU? That seems unlikely but CPU load increases by a larger percentage compared to GPU load. |
On the M1 Mac this issue only shows up in the default OpenGL ANGLE backend, not in the Metal ANGLE backend |
@dfeehrer @toddka Would one of you be willing to report this issue at the Chromium bug tracker instead? You can use my fiddles from above for reproduction test cases. It would be good if someone reports the issue who has still issues with Chrome 115/116. The URL is: https://bugs.chromium.org/p/chromium/issues/list BTW: When filing the issue, please add the |
Chromium bug report: https://bugs.chromium.org/p/chromium/issues/detail?id=1451195 |
Thanks! I've added a comment to highlight that the issue is related to the WebGL format |
@Mugen87 awesome thanks! Really appreciate all of the helping addressing this. This seems like it would be a fairly common use case. I wonder how many people are running projects on Metal or Vulcan and are unaware that their users are hitting this performance issue. Is there a workaround we could suggest for the time being given that browser bugs may take a long time to fix? One idea I have is to write a custom shader for the canvas texture that does the linear -> sRGB encoding. I'm not sure if this is possible or nontrivial (I'm a complete WebGL/GLSL noob), but I'd be willing to work on it and post a solution here for others while we wait for a Chromium fix. |
I think the overhead only becomes a problem if you updating texture data per frame. TBH, I would like to wait for the feedback of the Chromium team first and see how fast it can be fixed. I would prefer to not add inline decoding back. Devs how still want it can keep their textures in linear-srgb and implement the inline decode via |
I'm experiencing this issue with video textures and WebGPU renderer on Chrome Windows. cpu usage 20%. On Firefox cpu usage is 1% and gpu 2-3% it was surprising the difference. . On Canary 3-5% cpu but 20-40% gpu. I have to set the colorspace to LinearSRGBColorSpace to fix a gamma problem when using webgpu. https://danrossi.github.io/three-webgpu-renderer/tests/webgpu_video_panorama_equirectangular.html |
My issue #26266 is related to this for WebGLRenderer but it might be causing the same problem for WebGPURenderer. WebGPURenderer is 20% cpu usage, the use of Video textures for WebGL has to be set to THREE.SRGBColorSpace. Unless this function is disabled in the shader. `linearToOutputTexel which I've done so in a shadermaterial |
I've recently come across this issue when trying to render a 4K video in Three.js VR using an Oculus Quest 1. Both my Windows Chrome browser and the Oculus browser (which is Chromium based) were running at a max of 15fps. The quick solution was to set the Three.js WebGLRenderer outputColorSpace to |
That is the one. Mine is cpu related than dropping frames. I have even higher cpu issues with WebGPU and drops frames every 30 seconds of playback and fan ramps up. With WebGL using LinearSRGBColorSpace produces a wierd gamma issue because of a conversion in the shader. It requires srgb colorspace setting like webgpu does now. One of my usages is a video grid rendering multiple video textures so performance is needed. Here is my work around for now. Using a shadermaterial with the shader function causing the gamma issue removed when using linearsrgb I was constantly advised my problem was not related so made a new ticket. Its when SRGB8_ALPHA8 is used as the internal format for the video texture. https://bugs.chromium.org/p/chromium/issues/detail?id=1456882&q=SRGB8_ALPHA8&can=2 three.js/src/renderers/webgl/WebGLTextures.js Line 172 in aef2151
|
It would be great when affected users could stare the Chromium bug so it becomes more visible (and hopefully gets a higher priority). https://bugs.chromium.org/p/chromium/issues/detail?id=1451195 |
Here is a live example that implements the workaround: https://jsfiddle.net/em6vasdg/3/ |
I've updated my test and seems to work. No color issue using linear colorspace. https://github.com/danrossi/three-webgpu-renderer/blob/master/tests/webgl_video_panorama_equirectangular_nosrgb.html#L121 They are looking at my own ticket which is not frame dropping related but cpu. https://bugs.chromium.org/p/chromium/issues/detail?id=1456882&q=SRGB8_ALPHA8&can=2 |
/ping @rcabanier |
WebGPU issue is much worse in the other ticket. The chrome people reported 35-40% cpu but my Ryzen produces 20% cpu. And not sure if it's a chrome problem yet With WebGL Oh no this isn't good. I just rechecked firefox and producing the same cpu usage with srgb as Chrome. And low cpu usage with the linear work around. So maybe I wasted my time reporting it to Chrome. I'll try and make a vanilla webgl texture test to see what is going on with the format. high cpu in Firefox - https://danrossi.github.io/three-webgpu-renderer/tests/webgl_video_panorama_equirectangular.html |
My chrome issue got merged into the one referenced here as its the same problem. I found a work around but for video. I'm about to make vanilla webgl texture tests with the different formats set. If you use video callback instead of 60fps animation it uses less cpu. I have a throttled animation frame solution as fallback in my animation UPDATE: I made a bunch of vanilla webgl tests. SRGB format at 30fps is 1-5%. at 60fps its 14% and chrome freezes. I have to update chrome ticket. https://danrossi.github.io/three-webgpu-renderer/tests/webgl_vanilla_srgb.html with the other non srgb format its low cpu at 60fps https://danrossi.github.io/three-webgpu-renderer/tests/webgl_vanilla_nosrgb_60fps.html |
Is it worth considering adding this shader decoding (back) into the ThreeJS codebase? Without it, most new and existing users aren't going to know that they need to add an obscure shader found in this issue, in order to make sure videos have acceptable performance in ThreeJS. |
Claims to have been fixed in Chrome Canary on Jul 9th. Need to check it now. Update:.Nothing changed. I just checked Chrome canary. And I still get 10-13% cpu and 6-7% gpu usage with video textures. No SRGB fix 0.7-1% cpu and 2.1% gpu usage |
I've created a custom material module for this purpose with tests. I reported to chrome the resource issue with a vanilla example but got glazed over. It's when this is used for texture render of video
example bundling https://github.com/danrossi/three-troika/blob/main/three.rollup.config.js#L113 |
I noticed something was reverted which will be hard to keep builds future proofed. I'm sorry I just checked Canary with vanilla texture render and cpu is low. It's in three somewhere like the webgpu issue. vanilla seems ok to me although no srgb vanilla is less cpu which I have updated the chrome ticket about. https://danrossi.github.io/three-webgpu-renderer/tests/webgl_vanilla_nosrgb.html cpu jumps up in three. I'm not sure what the issue is but they may have fixed it. https://danrossi.github.io/three-webgpu-renderer/tests/webgl_video_panorama_equirectangular.html The srgb cpu usage has dropped iin Canary but there is an obvious difference using RGBA8 |
Description
Since 0.152.0 VideoTexture takes a lot of GPU ressources, the larger the video the slower it gets.
Windows 11
NVIDIA GeForce RTX 3060 Ti
Maybe related to this commit https://github.com/mrdoob/three.js/pull/25752/commits
cc @donmccurdy
Reproduction steps
Open Chrome Devtools performance tab in v0.152.2 and you gonna notice GPU is busy
Code
See live examples
Live example
v0.152.2 https://codesandbox.io/s/three-0-152-2-videotexture-mj2y8m (bad performance)
v0.151.3 https://codesandbox.io/s/three-0-151-3-videotexture-1et5sq (good performance)
Screenshots
Version
">= 0.152.0"
Device
No response
Browser
Chrome
OS
Windows
The text was updated successfully, but these errors were encountered: