Open Bug 1241105 Opened 8 years ago Updated 2 months ago

WebGL causes untracked memory allocations in ANGLE (detected by DMD in heap-unclassified)

Categories

(Core :: Graphics: CanvasWebGL, defect, P5)

defect

Tracking

()

People

(Reporter: jujjyl, Unassigned)

References

(Blocks 1 open bug)

Details

(Whiteboard: [MemShrink:P2][gfx-noted])

Attachments

(1 file)

Looking at Unity3D WebGL usage in the DMD tool, there are a number of callstacks that perform memory allocations when binding WebGL objects that count towards heap-unclassified in about:memory:

Unreported {
  ~19 blocks in heap block record 93 of 947
  ~77,767 bytes (~77,767 requested / ~0 slop)
  Individual block sizes: ~4,093 x 19
  0.03% of the heap (37.11% cumulative)
  0.07% of unreported (91.98% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: rx::Renderer11::createBuffer (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3370)
    #05: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #06: gl::Context::bindElementArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:569)
    #07: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:132)
    #08: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #09: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #10: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #11: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #12: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #13: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #14: ??? (???:???)
  }
}

Unreported {
  ~19 blocks in heap block record 94 of 947
  ~77,767 bytes (~77,767 requested / ~0 slop)
  Individual block sizes: ~4,093 x 19
  0.03% of the heap (37.14% cumulative)
  0.07% of unreported (92.04% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: rx::Renderer11::createBuffer (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3370)
    #05: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #06: gl::Context::bindArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:562)
    #07: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:129)
    #08: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #09: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #10: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #11: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #12: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #13: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #14: ??? (???:???)
  }
}

Unreported {
  ~18 blocks in heap block record 97 of 947
  ~73,674 bytes (~73,674 requested / ~0 slop)
  Individual block sizes: ~4,093 x 18
  0.03% of the heap (37.21% cumulative)
  0.06% of unreported (92.23% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #05: gl::Context::bindArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:562)
    #06: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:129)
    #07: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #08: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #09: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #10: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #11: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #12: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #13: ??? (???:???)
  }
}

Unreported {
  ~17 blocks in heap block record 102 of 947
  ~69,581 bytes (~69,581 requested / ~0 slop)
  Individual block sizes: ~4,093 x 17
  0.02% of the heap (37.33% cumulative)
  0.06% of unreported (92.53% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: rx::Renderer11::createImage (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3444)
    #05: rx::TextureD3D_2D::TextureD3D_2D (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\textured3d.cpp:623)
    #06: rx::Renderer11::createTexture (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3509)
    #07: gl::ResourceManager::checkTextureAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:398)
    #08: gl::Context::bindTexture (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:583)
    #09: gl::BindTexture (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:238)
    #10: glBindTexture (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:51)
    #11: mozilla::gl::GLContext::fBindTexture (d:\gecko-dev\gfx\gl\glcontext.h:896)
    #12: mozilla::WebGLTexture::BindTexture (d:\gecko-dev\dom\canvas\webgltexture.cpp:676)
    #13: mozilla::WebGLContext::BindTexture (d:\gecko-dev\dom\canvas\webglcontexttextures.cpp:235)
    #14: mozilla::dom::WebGLRenderingContextBinding::bindTexture (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10736)
    #15: ??? (???:???)
  }
}

Unreported {
  ~13 blocks in heap block record 112 of 947
  ~53,209 bytes (~53,209 requested / ~0 slop)
  Individual block sizes: ~4,093 x 13
  0.02% of the heap (37.54% cumulative)
  0.05% of unreported (93.05% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #05: gl::Context::bindElementArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:569)
    #06: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:132)
    #07: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #08: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #09: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #10: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #11: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #12: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #13: ??? (???:???)
  }
}

Unreported {
  ~13 blocks in heap block record 114 of 947
  ~53,209 bytes (~53,209 requested / ~0 slop)
  Individual block sizes: ~4,093 x 13
  0.02% of the heap (37.58% cumulative)
  0.05% of unreported (93.14% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: std::_Allocate<TType> (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0:89)
    #05: std::allocator<TType>::allocate (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0:646)
    #06: std::_Wrap_alloc<std::allocator<std::_Tree_node<std::pair<gl::IndexRangeCache::IndexRangeKey const ,gl::IndexRange>,void * __ptr64> > >::allocate (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xmemory0:901)
    #07: std::_Tree_comp_alloc<std::_Tmap_traits<gl::IndexRangeCache::IndexRangeKey,gl::IndexRange,std::less<gl::IndexRangeCache::IndexRangeKey>,std::allocator<std::pair<gl::IndexRangeCache::IndexRangeKey const ,gl::IndexRange> >,0> >::_Buyheadnode (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xtree:825)
    #08: std::_Tree_comp_alloc<std::_Tmap_traits<gl::IndexRangeCache::IndexRangeKey,gl::IndexRange,std::less<gl::IndexRangeCache::IndexRangeKey>,std::allocator<std::pair<gl::IndexRangeCache::IndexRangeKey const ,gl::IndexRange> >,0> >::_Construct (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xtree:717)
    #09: std::_Tree_comp_alloc<std::_Tmap_traits<gl::IndexRangeCache::IndexRangeKey,gl::IndexRange,std::less<gl::IndexRangeCache::IndexRangeKey>,std::allocator<std::pair<gl::IndexRangeCache::IndexRangeKey const ,gl::IndexRange> >,0> >::_Tree_comp_alloc<std::_Tmap_ (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xtree:705)
    #10: std::_Tree<std::_Tmap_traits<gl::IndexRangeCache::IndexRangeKey,gl::IndexRange,std::less<gl::IndexRangeCache::IndexRangeKey>,std::allocator<std::pair<gl::IndexRangeCache::IndexRangeKey const ,gl::IndexRange> >,0> >::_Tree<std::_Tmap_traits<gl::IndexRangeC (c:\program files (x86)\microsoft visual studio 14.0\vc\include\xtree:1014)
    #11: std::map<enum DXGI_FORMAT,rx::d3d11::DXGIColorFormatInfo,std::less<enum DXGI_FORMAT>,std::allocator<std::pair<enum DXGI_FORMAT const ,rx::d3d11::DXGIColorFormatInfo> > >::map<enum DXGI_FORMAT,rx::d3d11::DXGIColorFormatInfo,std::less<enum DXGI_FORMAT>,std: (c:\program files (x86)\microsoft visual studio 14.0\vc\include\map:101)
    #12: gl::IndexRangeCache::IndexRangeCache[libGLESv2 +0x1d2456]
    #13: gl::Buffer::Buffer (d:\gecko-dev\gfx\angle\src\libangle\buffer.cpp:30)
    #14: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #15: gl::Context::bindElementArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:569)
    #16: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:132)
    #17: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #18: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #19: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #20: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #21: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #22: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #23: ??? (???:???)
  }
}

Unreported {
  ~12 blocks in heap block record 118 of 947
  ~49,116 bytes (~49,116 requested / ~0 slop)
  Individual block sizes: ~4,093 x 12
  0.02% of the heap (37.65% cumulative)
  0.04% of unreported (93.31% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: rx::Renderer11::createBuffer (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3370)
    #05: gl::ResourceManager::checkBufferAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:371)
    #06: gl::Context::bindElementArrayBuffer (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:569)
    #07: gl::BindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:132)
    #08: glBindBuffer (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:36)
    #09: mozilla::gl::GLContext::fBindBuffer (d:\gecko-dev\gfx\gl\glcontext.h:874)
    #10: mozilla::WebGLContextUnchecked::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextunchecked.cpp:28)
    #11: mozilla::WebGLContext::BindBuffer (d:\gecko-dev\dom\canvas\webglcontextbuffers.cpp:57)
    #12: mozilla::dom::WebGLRenderingContextBinding::bindBuffer (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10592)
    #13: ??? (???:???)
  }
}

Unreported {
  ~8 blocks in heap block record 163 of 947
  ~32,744 bytes (~32,744 requested / ~0 slop)
  Individual block sizes: ~4,093 x 8
  0.01% of the heap (38.24% cumulative)
  0.03% of unreported (94.77% cumulative)
  Allocated at {
    #01: malloc_impl (d:\gecko-dev\memory\build\replace_malloc.c:153)
    #02: moz_xmalloc (d:\gecko-dev\memory\mozalloc\mozalloc.cpp:83)
    #03: operator new[] (d:\gecko-dev\obj-x86_64-pc-mingw32\dist\include\mozilla\mozalloc.h:187)
    #04: rx::Renderer11::createImage (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3444)
    #05: rx::TextureD3D_2D::TextureD3D_2D (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\textured3d.cpp:623)
    #06: rx::Renderer11::createTexture (d:\gecko-dev\gfx\angle\src\libangle\renderer\d3d\d3d11\renderer11.cpp:3509)
    #07: gl::ResourceManager::checkTextureAllocation (d:\gecko-dev\gfx\angle\src\libangle\resourcemanager.cpp:398)
    #08: gl::Context::bindTexture (d:\gecko-dev\gfx\angle\src\libangle\context.cpp:583)
    #09: gl::BindTexture (d:\gecko-dev\gfx\angle\src\libglesv2\entry_points_gles_2_0.cpp:238)
    #10: glBindTexture (d:\gecko-dev\gfx\angle\src\libglesv2\libglesv2.cpp:51)
    #11: mozilla::gl::GLContext::fBindTexture (d:\gecko-dev\gfx\gl\glcontext.h:896)
    #12: mozilla::WebGLTexture::BindTexture (d:\gecko-dev\dom\canvas\webgltexture.cpp:676)
    #13: mozilla::WebGLContext::BindTexture (d:\gecko-dev\dom\canvas\webglcontexttextures.cpp:235)
    #14: mozilla::dom::WebGLRenderingContextBinding::bindTexture (d:\gecko-dev\obj-x86_64-pc-mingw32\dom\bindings\webglrenderingcontextbinding.cpp:10736)
    #15: mozilla::dom::GenericBindingMethod (d:\gecko-dev\dom\bindings\bindingutils.cpp:2714)
    #16: ??? (???:???)
  }
}

See the full logs in attachment. Is it possible to get these tracked under WebGL nodes in about:memory?
Blocks: DarkMatter
Whiteboard: [MemShrink]
Whiteboard: [MemShrink] → [MemShrink:P2]
Whiteboard: [MemShrink:P2] → [MemShrink:P2][gfx-noted]
Severity: normal → S3

These are all allocations within ANGLE.
That would be a lot of work to fix, I think.
We would have to add memory tracking to ANGLE, or at least tell ANGLE "use this allocator".
I'm tempted to WONTFIX this, but maybe that approach isn't impossible?

Severity: S3 → S4
Priority: P3 → P5
Summary: WebGL binding operations perform untracked memory allocations (detected by DMD in heap-unclassified) → WebGL causes untracked memory allocations in ANGLE (detected by DMD in heap-unclassified)
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: