From eaf110a5951da652459532b5ae54bb0752eeb8d1 Mon Sep 17 00:00:00 2001 From: Matt Woodrow Date: Tue, 9 Feb 2021 04:38:24 +0000 Subject: [PATCH] Bug 1678656 - Don't rely on mPlanes to compute RenderTextureHost size, since it's only initialized when used with SWGL. r=jrmuizel Differential Revision: https://phabricator.services.mozilla.com/D104141 --- gfx/2d/MacIOSurface.cpp | 4 +++ gfx/2d/MacIOSurface.h | 1 + .../RenderBufferTextureHostSWGL.h | 2 ++ .../RenderD3D11TextureHost.h | 26 +++++++++++++++++++ .../RenderMacIOSurfaceTextureHost.cpp | 4 +++ .../RenderMacIOSurfaceTextureHost.h | 2 ++ .../RenderSharedSurfaceTextureHostSWGL.h | 2 ++ .../RenderTextureHostSWGL.h | 3 ++- .../RenderTextureHostWrapper.h | 4 +++ 9 files changed, 47 insertions(+), 1 deletion(-) diff --git a/gfx/2d/MacIOSurface.cpp b/gfx/2d/MacIOSurface.cpp index de0a503843b1..0a410cf14afa 100644 --- a/gfx/2d/MacIOSurface.cpp +++ b/gfx/2d/MacIOSurface.cpp @@ -323,6 +323,10 @@ size_t MacIOSurface::GetBytesPerRow(size_t plane) const { return ::IOSurfaceGetBytesPerRowOfPlane(mIOSurfaceRef.get(), plane); } +size_t MacIOSurface::GetAllocSize() const { + return ::IOSurfaceGetAllocSize(mIOSurfaceRef.get()); +} + OSType MacIOSurface::GetPixelFormat() const { return ::IOSurfaceGetPixelFormat(mIOSurfaceRef.get()); } diff --git a/gfx/2d/MacIOSurface.h b/gfx/2d/MacIOSurface.h index 98b084adeae1..8755ca5c32fe 100644 --- a/gfx/2d/MacIOSurface.h +++ b/gfx/2d/MacIOSurface.h @@ -96,6 +96,7 @@ class MacIOSurface final size_t GetDevicePixelWidth(size_t plane = 0) const; size_t GetDevicePixelHeight(size_t plane = 0) const; size_t GetBytesPerRow(size_t plane = 0) const; + size_t GetAllocSize() const; void Lock(bool aReadOnly = true); void Unlock(bool aReadOnly = true); bool IsLocked() const { return mIsLocked; } diff --git a/gfx/webrender_bindings/RenderBufferTextureHostSWGL.h b/gfx/webrender_bindings/RenderBufferTextureHostSWGL.h index 20ec5eb1b981..3cfc3aae5eca 100644 --- a/gfx/webrender_bindings/RenderBufferTextureHostSWGL.h +++ b/gfx/webrender_bindings/RenderBufferTextureHostSWGL.h @@ -30,6 +30,8 @@ class RenderBufferTextureHostSWGL final : public RenderTextureHostSWGL { void UnmapPlanes() override; + size_t Bytes() override { return BytesFromPlanes(); } + private: virtual ~RenderBufferTextureHostSWGL(); diff --git a/gfx/webrender_bindings/RenderD3D11TextureHost.h b/gfx/webrender_bindings/RenderD3D11TextureHost.h index 853fe896d265..cc1e703ac3c5 100644 --- a/gfx/webrender_bindings/RenderD3D11TextureHost.h +++ b/gfx/webrender_bindings/RenderD3D11TextureHost.h @@ -64,6 +64,20 @@ class RenderDXGITextureHost final : public RenderTextureHostSWGL { bool EnsureD3D11Texture2D(ID3D11Device* aDevice); bool LockInternal(); + size_t Bytes() override { + size_t bytes = 0; + + size_t bpp = GetPlaneCount() > 1 + ? (GetColorDepth() == gfx::ColorDepth::COLOR_8 ? 1 : 2) + : 4; + + for (size_t i = 0; i < GetPlaneCount(); i++) { + gfx::IntSize size = GetSize(i); + bytes += size.width * size.height * bpp; + } + return bytes; + } + private: virtual ~RenderDXGITextureHost(); @@ -143,6 +157,18 @@ class RenderDXGIYCbCrTextureHost final : public RenderTextureHostSWGL { return mTextures[aChannelIndex]; } + size_t Bytes() override { + size_t bytes = 0; + + size_t bpp = mColorDepth == gfx::ColorDepth::COLOR_8 ? 1 : 2; + + for (size_t i = 0; i < GetPlaneCount(); i++) { + gfx::IntSize size = GetSize(i); + bytes += size.width * size.height * bpp; + } + return bytes; + } + private: virtual ~RenderDXGIYCbCrTextureHost(); diff --git a/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.cpp b/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.cpp index 6d2f5505c800..2526be19e6bf 100644 --- a/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.cpp +++ b/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.cpp @@ -72,6 +72,10 @@ gfx::IntSize RenderMacIOSurfaceTextureHost::GetSize( mSurface->GetDevicePixelHeight(aChannelIndex)); } +size_t RenderMacIOSurfaceTextureHost::Bytes() { + return mSurface->GetAllocSize(); +} + wr::WrExternalImage RenderMacIOSurfaceTextureHost::Lock( uint8_t aChannelIndex, gl::GLContext* aGL, wr::ImageRendering aRendering) { if (mGL.get() != aGL) { diff --git a/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.h b/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.h index 3db642ed45ea..a6eb44950e7c 100644 --- a/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.h +++ b/gfx/webrender_bindings/RenderMacIOSurfaceTextureHost.h @@ -34,6 +34,8 @@ class RenderMacIOSurfaceTextureHost final : public RenderTextureHostSWGL { return this; } + size_t Bytes() override; + MacIOSurface* GetSurface() { return mSurface; } // RenderTextureHostSWGL diff --git a/gfx/webrender_bindings/RenderSharedSurfaceTextureHostSWGL.h b/gfx/webrender_bindings/RenderSharedSurfaceTextureHostSWGL.h index e61a09ca8357..ccc374f4c369 100644 --- a/gfx/webrender_bindings/RenderSharedSurfaceTextureHostSWGL.h +++ b/gfx/webrender_bindings/RenderSharedSurfaceTextureHostSWGL.h @@ -37,6 +37,8 @@ class RenderSharedSurfaceTextureHostSWGL final : public RenderTextureHostSWGL { void UnmapPlanes() override; + size_t Bytes() override { return BytesFromPlanes(); } + private: virtual ~RenderSharedSurfaceTextureHostSWGL(); diff --git a/gfx/webrender_bindings/RenderTextureHostSWGL.h b/gfx/webrender_bindings/RenderTextureHostSWGL.h index 7be3ea060c40..22763ca2b6b8 100644 --- a/gfx/webrender_bindings/RenderTextureHostSWGL.h +++ b/gfx/webrender_bindings/RenderTextureHostSWGL.h @@ -58,7 +58,8 @@ class RenderTextureHostSWGL : public RenderTextureHost { bool LockSWGLCompositeSurface(void* aContext, wr::SWGLCompositeSurfaceInfo* aInfo); - size_t Bytes() override { + size_t BytesFromPlanes() { + NS_ASSERTION(mPlanes.size(), "Can't compute bytes without any planes"); size_t bytes = 0; for (auto& plane : mPlanes) { bytes += plane.mStride * plane.mSize.height; diff --git a/gfx/webrender_bindings/RenderTextureHostWrapper.h b/gfx/webrender_bindings/RenderTextureHostWrapper.h index cce0694bc663..775f46544a42 100644 --- a/gfx/webrender_bindings/RenderTextureHostWrapper.h +++ b/gfx/webrender_bindings/RenderTextureHostWrapper.h @@ -46,6 +46,10 @@ class RenderTextureHostWrapper final : public RenderTextureHostSWGL { PlaneInfo& aPlaneInfo) override; void UnmapPlanes() override; + // This is just a wrapper, so doesn't need to report the + // size of the wrapped object (which reports itself). + size_t Bytes() override { return 0; } + private: ~RenderTextureHostWrapper() override;