author | JerryShih <hshih@mozilla.com> |
Thu, 18 May 2017 22:59:07 +0800 | |
changeset 359341 | 5828e739a454b13b0cb1cdcac6d80b5f55c0e91e |
parent 359340 | a26381a60aa651f398de86d128c566accebeffc6 |
child 359342 | f7cb82a21940b531024684266e4657c18410b6d4 |
push id | 31852 |
push user | kwierso@gmail.com |
push date | Fri, 19 May 2017 21:47:27 +0000 |
treeherder | mozilla-central@979f11deabd0 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | nical |
bugs | 1362049 |
milestone | 55.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/layers/composite/TextureHost.cpp +++ b/gfx/layers/composite/TextureHost.cpp @@ -17,16 +17,17 @@ #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc #include "mozilla/layers/TextureHostBasic.h" #include "mozilla/layers/TextureHostOGL.h" // for TextureHostOGL #include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/TextureClient.h" #include "mozilla/layers/GPUVideoTextureHost.h" #include "mozilla/layers/WebRenderTextureHost.h" +#include "mozilla/webrender/WebRenderAPI.h" #include "nsAString.h" #include "mozilla/RefPtr.h" // for nsRefPtr #include "nsPrintfCString.h" // for nsPrintfCString #include "mozilla/layers/PTextureParent.h" #include "mozilla/Unused.h" #include <limits> #include "../opengl/CompositorOGL.h" #include "gfxPrefs.h" @@ -551,16 +552,24 @@ BufferTextureHost::Lock() void BufferTextureHost::Unlock() { MOZ_ASSERT(mLocked); mLocked = false; } void +BufferTextureHost::AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) +{ + MOZ_ASSERT_UNREACHABLE("No AddWRImage() implementation for this BufferTextureHost type."); +} + +void TextureHost::DeserializeReadLock(const ReadLockDescriptor& aDesc, ISurfaceAllocator* aAllocator) { RefPtr<TextureReadLock> lock = TextureReadLock::Deserialize(aDesc, aAllocator); if (!lock) { return; }
--- a/gfx/layers/composite/TextureHost.h +++ b/gfx/layers/composite/TextureHost.h @@ -31,16 +31,20 @@ #include "mozilla/layers/AtomicRefCountedWithFinalize.h" #include "mozilla/gfx/Rect.h" namespace mozilla { namespace ipc { class Shmem; } // namespace ipc +namespace wr { +class WebRenderAPI; +} + namespace layers { class BufferDescriptor; class BufferTextureHost; class Compositor; class CompositableParentManager; class ReadLockDescriptor; class CompositorBridgeParent; @@ -586,16 +590,25 @@ public: void SetReadLock(TextureReadLock* aReadLock); TextureReadLock* GetReadLock() { return mReadLock; } virtual BufferTextureHost* AsBufferTextureHost() { return nullptr; } virtual MacIOSurfaceTextureHostOGL* AsMacIOSurfaceTextureHost() { return nullptr; } virtual WebRenderTextureHost* AsWebRenderTextureHost() { return nullptr; } + // Add all necessary textureHost informations to WebrenderAPI. Then, WR could + // use these informations to compose this textureHost. + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) + { + MOZ_ASSERT_UNREACHABLE("No AddWRImage() implementation for this TextureHost type."); + } + protected: void ReadUnlock(); void RecycleTexture(TextureFlags aFlags); virtual void UpdatedInternal(const nsIntRegion *Region) {} /** @@ -673,16 +686,20 @@ public: virtual already_AddRefed<gfx::DataSourceSurface> GetAsSurface() override; virtual bool HasIntermediateBuffer() const override { return mHasIntermediateBuffer; } virtual BufferTextureHost* AsBufferTextureHost() override { return this; } const BufferDescriptor& GetBufferDescriptor() const { return mDescriptor; } + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) override; + protected: bool Upload(nsIntRegion *aRegion = nullptr); bool MaybeUpload(nsIntRegion *aRegion = nullptr); bool EnsureWrappingTextureSource(); virtual void UpdatedInternal(const nsIntRegion* aRegion = nullptr) override; BufferDescriptor mDescriptor;
--- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -9,16 +9,17 @@ #include "Effects.h" #include "gfxWindowsPlatform.h" #include "gfx2DGlue.h" #include "gfxPrefs.h" #include "ReadbackManagerD3D11.h" #include "mozilla/gfx/DeviceManagerDx.h" #include "mozilla/gfx/Logging.h" #include "mozilla/layers/CompositorBridgeChild.h" +#include "mozilla/webrender/WebRenderAPI.h" namespace mozilla { using namespace gfx; namespace layers { static const GUID sD3D11TextureUsage = @@ -849,16 +850,24 @@ DXGITextureHostD3D11::BindTextureSource( { MOZ_ASSERT(mIsLocked); // If Lock was successful we must have a valid TextureSource. MOZ_ASSERT(mTextureSource); aTexture = mTextureSource; return !!aTexture; } +void +DXGITextureHostD3D11::AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) +{ + MOZ_ASSERT_UNREACHABLE("No AddWRImage() implementation for this DXGITextureHostD3D11 type."); +} + DXGIYCbCrTextureHostD3D11::DXGIYCbCrTextureHostD3D11(TextureFlags aFlags, const SurfaceDescriptorDXGIYCbCr& aDescriptor) : TextureHost(aFlags) , mSize(aDescriptor.size()) , mIsLocked(false) { mHandles[0] = aDescriptor.handleY(); mHandles[1] = aDescriptor.handleCb(); @@ -982,16 +991,24 @@ DXGIYCbCrTextureHostD3D11::BindTextureSo { MOZ_ASSERT(mIsLocked); // If Lock was successful we must have a valid TextureSource. MOZ_ASSERT(mTextureSources[0] && mTextureSources[1] && mTextureSources[2]); aTexture = mTextureSources[0].get(); return !!aTexture; } +void +DXGIYCbCrTextureHostD3D11::AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) +{ + MOZ_ASSERT_UNREACHABLE("No AddWRImage() implementation for this DXGIYCbCrTextureHostD3D11 type."); +} + bool DataTextureSourceD3D11::Update(DataSourceSurface* aSurface, nsIntRegion* aDestRegion, IntPoint* aSrcOffset) { // Incremental update with a source offset is only used on Mac so it is not // clear that we ever will need to support it for D3D. MOZ_ASSERT(!aSrcOffset);
--- a/gfx/layers/d3d11/TextureD3D11.h +++ b/gfx/layers/d3d11/TextureD3D11.h @@ -320,16 +320,20 @@ public: virtual gfx::IntSize GetSize() const override { return mSize; } virtual already_AddRefed<gfx::DataSourceSurface> GetAsSurface() override { return nullptr; } + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) override; + protected: bool LockInternal(); void UnlockInternal(); RefPtr<ID3D11Device> GetDevice(); bool OpenSharedHandle(); @@ -365,16 +369,20 @@ public: virtual gfx::IntSize GetSize() const override { return mSize; } virtual already_AddRefed<gfx::DataSourceSurface> GetAsSurface() override { return nullptr; } + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) override; + protected: RefPtr<ID3D11Device> GetDevice(); bool OpenSharedHandle(); RefPtr<ID3D11Texture2D> mTextures[3]; RefPtr<DataTextureSourceD3D11> mTextureSources[3];
--- a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp +++ b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp @@ -1,15 +1,16 @@ /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "MacIOSurfaceTextureHostOGL.h" #include "mozilla/gfx/MacIOSurface.h" +#include "mozilla/webrender/WebRenderAPI.h" #include "GLContextCGL.h" namespace mozilla { namespace layers { MacIOSurfaceTextureHostOGL::MacIOSurfaceTextureHostOGL(TextureFlags aFlags, const SurfaceDescriptorMacIOSurface& aDescriptor) : TextureHost(aFlags) @@ -108,10 +109,18 @@ MacIOSurfaceTextureHostOGL::GetSize() co } gl::GLContext* MacIOSurfaceTextureHostOGL::gl() const { return mProvider ? mProvider->GetGLContext() : nullptr; } +void +MacIOSurfaceTextureHostOGL::AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) +{ + MOZ_ASSERT_UNREACHABLE("No AddWRImage() implementation for this MacIOSurfaceTextureHostOGL type."); +} + } // namespace layers } // namespace mozilla
--- a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.h +++ b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.h @@ -57,16 +57,20 @@ public: virtual MacIOSurfaceTextureHostOGL* AsMacIOSurfaceTextureHost() override { return this; } MacIOSurface* GetMacIOSurface() { return mSurface; } + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) override; + protected: GLTextureSource* CreateTextureSourceForPlane(size_t aPlane); RefPtr<GLTextureSource> mTextureSource; RefPtr<MacIOSurface> mSurface; }; } // namespace layers
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp +++ b/gfx/layers/wr/WebRenderBridgeParent.cpp @@ -456,33 +456,17 @@ WebRenderBridgeParent::ProcessWebRenderC // XXX select Texture for video in CompositeToTarget(). TextureHost* texture = host->GetAsTextureHostForComposite(); if (!texture) { NS_ERROR("TextureHost does not exist"); break; } WebRenderTextureHost* wrTexture = texture->AsWebRenderTextureHost(); if (wrTexture) { - if (wrTexture->IsWrappingNativeHandle()) { - // XXX only for MacIOSurface right now. - // XXX remove the redundant codes for both native handle and yuv case. - wr::ImageDescriptor descriptor(wrTexture->GetSize(), wrTexture->GetReadFormat()); - mApi->AddExternalImageHandle(key, - descriptor, - wrTexture->GetExternalImageKey()); - } else { - // XXX handling YUV - gfx::SurfaceFormat format = - wrTexture->GetFormat() == SurfaceFormat::YUV ? SurfaceFormat::B8G8R8A8 : wrTexture->GetFormat(); - wr::ImageDescriptor descriptor(wrTexture->GetSize(), wrTexture->GetRGBStride(), format); - mApi->AddExternalImageBuffer(key, - descriptor, - wrTexture->GetExternalImageKey()); - } - + wrTexture->AddWRImage(mApi, key, wrTexture->GetExternalImageKey()); break; } RefPtr<DataSourceSurface> dSurf = host->GetAsSurface(); if (!dSurf) { break; } DataSourceSurface::MappedSurface map;
--- a/gfx/layers/wr/WebRenderTextureHost.cpp +++ b/gfx/layers/wr/WebRenderTextureHost.cpp @@ -151,10 +151,21 @@ WebRenderTextureHost::GetRGBStride() if (GetFormat() == gfx::SurfaceFormat::YUV) { // XXX this stride is used until yuv image rendering by webrender is used. // Software converted RGB buffers strides are aliened to 16 return gfx::GetAlignedStride<16>(GetSize().width, BytesPerPixel(gfx::SurfaceFormat::B8G8R8A8)); } return ImageDataSerializer::ComputeRGBStride(format, GetSize().width); } +void +WebRenderTextureHost::AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) +{ + MOZ_ASSERT(mWrappedTextureHost); + MOZ_ASSERT(mExternalImageId == aExtID); + + mWrappedTextureHost->AddWRImage(aAPI, aImageKey, aExtID); +} + } // namespace layers } // namespace mozilla
--- a/gfx/layers/wr/WebRenderTextureHost.h +++ b/gfx/layers/wr/WebRenderTextureHost.h @@ -60,16 +60,20 @@ public: virtual WebRenderTextureHost* AsWebRenderTextureHost() override { return this; } wr::ExternalImageId GetExternalImageKey() { return mExternalImageId; } int32_t GetRGBStride(); bool IsWrappingNativeHandle() { return mIsWrappingNativeHandle; } + virtual void AddWRImage(wr::WebRenderAPI* aAPI, + const wr::ImageKey& aImageKey, + const wr::ExternalImageId& aExtID) override; + protected: void CreateRenderTextureHost(const SurfaceDescriptor& aDesc, TextureHost* aTexture); RefPtr<TextureHost> mWrappedTextureHost; wr::ExternalImageId mExternalImageId; bool mIsWrappingNativeHandle; };