Bug 1688096 - Part 1. Merge SW-WR and WR render texture host paths to allow mixed compositors. r=mattwoodrow

Differential Revision: https://phabricator.services.mozilla.com/D104854
This commit is contained in:
Andrew Osmond
2021-02-18 15:37:46 +00:00
parent be5cb5d474
commit cd218bcf63
28 changed files with 313 additions and 352 deletions

View File

@@ -269,11 +269,12 @@ void GPUVideoTextureHost::PushDisplayItems(
aFilter, aImageKeys, aFlags); aFilter, aImageKeys, aFlags);
} }
bool GPUVideoTextureHost::SupportsExternalCompositing() { bool GPUVideoTextureHost::SupportsExternalCompositing(
WebRenderBackend aBackend) {
if (!EnsureWrappedTextureHost()) { if (!EnsureWrappedTextureHost()) {
return false; return false;
} }
return EnsureWrappedTextureHost()->SupportsExternalCompositing(); return EnsureWrappedTextureHost()->SupportsExternalCompositing(aBackend);
} }
void GPUVideoTextureHost::UnbindTextureSource() { void GPUVideoTextureHost::UnbindTextureSource() {

View File

@@ -71,7 +71,7 @@ class GPUVideoTextureHost : public TextureHost {
const Range<wr::ImageKey>& aImageKeys, const Range<wr::ImageKey>& aImageKeys,
PushDisplayItemFlagSet aFlags) override; PushDisplayItemFlagSet aFlags) override;
bool SupportsExternalCompositing() override; bool SupportsExternalCompositing(WebRenderBackend aBackend) override;
void UnbindTextureSource() override; void UnbindTextureSource() override;
void NotifyNotUsed() override; void NotifyNotUsed() override;

View File

@@ -31,7 +31,6 @@
#include "mozilla/StaticPrefs_layers.h" #include "mozilla/StaticPrefs_layers.h"
#include "mozilla/StaticPrefs_gfx.h" #include "mozilla/StaticPrefs_gfx.h"
#include "mozilla/webrender/RenderBufferTextureHost.h" #include "mozilla/webrender/RenderBufferTextureHost.h"
#include "mozilla/webrender/RenderBufferTextureHostSWGL.h"
#include "mozilla/webrender/RenderExternalTextureHost.h" #include "mozilla/webrender/RenderExternalTextureHost.h"
#include "mozilla/webrender/RenderThread.h" #include "mozilla/webrender/RenderThread.h"
#include "mozilla/webrender/WebRenderAPI.h" #include "mozilla/webrender/WebRenderAPI.h"
@@ -677,10 +676,7 @@ void BufferTextureHost::CreateRenderTexture(
const wr::ExternalImageId& aExternalImageId) { const wr::ExternalImageId& aExternalImageId) {
RefPtr<wr::RenderTextureHost> texture; RefPtr<wr::RenderTextureHost> texture;
if (gfx::gfxVars::UseSoftwareWebRender()) { if (UseExternalTextures()) {
texture =
new wr::RenderBufferTextureHostSWGL(GetBuffer(), GetBufferDescriptor());
} else if (UseExternalTextures()) {
texture = texture =
new wr::RenderExternalTextureHost(GetBuffer(), GetBufferDescriptor()); new wr::RenderExternalTextureHost(GetBuffer(), GetBufferDescriptor());
} else { } else {
@@ -707,7 +703,12 @@ void BufferTextureHost::PushResourceUpdates(
? &wr::TransactionBuilder::AddExternalImage ? &wr::TransactionBuilder::AddExternalImage
: &wr::TransactionBuilder::UpdateExternalImage; : &wr::TransactionBuilder::UpdateExternalImage;
auto imageType = UseExternalTextures() || gfx::gfxVars::UseSoftwareWebRender() // Even if we cannot use external textures, if the backend is Software
// WebRender, we need to ensure that we use external texture style updates.
// This is because we always represent mapped buffers as external "native"
// textures for that backend.
auto imageType = UseExternalTextures() || aResources.GetBackendType() ==
WebRenderBackend::SOFTWARE
? wr::ExternalImageType::TextureHandle( ? wr::ExternalImageType::TextureHandle(
wr::ImageBufferKind::TextureRect) wr::ImageBufferKind::TextureRect)
: wr::ExternalImageType::Buffer(); : wr::ExternalImageType::Buffer();

View File

@@ -740,7 +740,9 @@ class TextureHost : public AtomicRefCountedWithFinalize<TextureHost> {
return nullptr; return nullptr;
} }
virtual bool SupportsExternalCompositing() { return false; } virtual bool SupportsExternalCompositing(WebRenderBackend aBackend) {
return false;
}
protected: protected:
virtual void ReadUnlock(); virtual void ReadUnlock();

View File

@@ -1012,7 +1012,7 @@ void DXGITextureHostD3D11::PushResourceUpdates(
MOZ_ASSERT(aImageKeys.length() == 1); MOZ_ASSERT(aImageKeys.length() == 1);
wr::ImageDescriptor descriptor(mSize, GetFormat()); wr::ImageDescriptor descriptor(mSize, GetFormat());
auto imageType = gfx::gfxVars::UseSoftwareWebRender() auto imageType = aResources.GetBackendType() == WebRenderBackend::SOFTWARE
? wr::ExternalImageType::TextureHandle( ? wr::ExternalImageType::TextureHandle(
wr::ImageBufferKind::TextureRect) wr::ImageBufferKind::TextureRect)
: wr::ExternalImageType::TextureHandle( : wr::ExternalImageType::TextureHandle(
@@ -1034,7 +1034,7 @@ void DXGITextureHostD3D11::PushResourceUpdates(
mFormat == gfx::SurfaceFormat::NV12 mFormat == gfx::SurfaceFormat::NV12
? gfx::SurfaceFormat::R8G8 ? gfx::SurfaceFormat::R8G8
: gfx::SurfaceFormat::R16G16); : gfx::SurfaceFormat::R16G16);
auto imageType = gfx::gfxVars::UseSoftwareWebRender() auto imageType = aResources.GetBackendType() == WebRenderBackend::SOFTWARE
? wr::ExternalImageType::TextureHandle( ? wr::ExternalImageType::TextureHandle(
wr::ImageBufferKind::TextureRect) wr::ImageBufferKind::TextureRect)
: wr::ExternalImageType::TextureHandle( : wr::ExternalImageType::TextureHandle(
@@ -1066,11 +1066,11 @@ void DXGITextureHostD3D11::PushDisplayItems(
case gfx::SurfaceFormat::B8G8R8A8: case gfx::SurfaceFormat::B8G8R8A8:
case gfx::SurfaceFormat::B8G8R8X8: { case gfx::SurfaceFormat::B8G8R8X8: {
MOZ_ASSERT(aImageKeys.length() == 1); MOZ_ASSERT(aImageKeys.length() == 1);
aBuilder.PushImage(aBounds, aClip, true, aFilter, aImageKeys[0], aBuilder.PushImage(
aBounds, aClip, true, aFilter, aImageKeys[0],
!(mFlags & TextureFlags::NON_PREMULTIPLIED), !(mFlags & TextureFlags::NON_PREMULTIPLIED),
wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, wr::ColorF{1.0f, 1.0f, 1.0f, 1.0f}, preferCompositorSurface,
preferCompositorSurface, SupportsExternalCompositing(aBuilder.GetBackendType()));
SupportsExternalCompositing());
break; break;
} }
case gfx::SurfaceFormat::P010: case gfx::SurfaceFormat::P010:
@@ -1083,7 +1083,7 @@ void DXGITextureHostD3D11::PushDisplayItems(
: wr::ColorDepth::Color16, : wr::ColorDepth::Color16,
wr::ToWrYuvColorSpace(mYUVColorSpace), wr::ToWrYuvColorSpace(mYUVColorSpace),
wr::ToWrColorRange(mColorRange), aFilter, preferCompositorSurface, wr::ToWrColorRange(mColorRange), aFilter, preferCompositorSurface,
SupportsExternalCompositing()); SupportsExternalCompositing(aBuilder.GetBackendType()));
break; break;
} }
default: { default: {
@@ -1092,8 +1092,9 @@ void DXGITextureHostD3D11::PushDisplayItems(
} }
} }
bool DXGITextureHostD3D11::SupportsExternalCompositing() { bool DXGITextureHostD3D11::SupportsExternalCompositing(
if (gfx::gfxVars::UseSoftwareWebRender()) { WebRenderBackend aBackend) {
if (aBackend == WebRenderBackend::SOFTWARE) {
return true; return true;
} }
// XXX Add P010 and P016 support. // XXX Add P010 and P016 support.
@@ -1288,7 +1289,7 @@ void DXGIYCbCrTextureHostD3D11::PushResourceUpdates(
auto method = aOp == TextureHost::ADD_IMAGE auto method = aOp == TextureHost::ADD_IMAGE
? &wr::TransactionBuilder::AddExternalImage ? &wr::TransactionBuilder::AddExternalImage
: &wr::TransactionBuilder::UpdateExternalImage; : &wr::TransactionBuilder::UpdateExternalImage;
auto imageType = gfx::gfxVars::UseSoftwareWebRender() auto imageType = aResources.GetBackendType() == WebRenderBackend::SOFTWARE
? wr::ExternalImageType::TextureHandle( ? wr::ExternalImageType::TextureHandle(
wr::ImageBufferKind::TextureRect) wr::ImageBufferKind::TextureRect)
: wr::ExternalImageType::TextureHandle( : wr::ExternalImageType::TextureHandle(
@@ -1319,14 +1320,12 @@ void DXGIYCbCrTextureHostD3D11::PushDisplayItems(
wr::ToWrColorDepth(mColorDepth), wr::ToWrYuvColorSpace(mYUVColorSpace), wr::ToWrColorDepth(mColorDepth), wr::ToWrYuvColorSpace(mYUVColorSpace),
wr::ToWrColorRange(mColorRange), aFilter, wr::ToWrColorRange(mColorRange), aFilter,
aFlags.contains(PushDisplayItemFlag::PREFER_COMPOSITOR_SURFACE), aFlags.contains(PushDisplayItemFlag::PREFER_COMPOSITOR_SURFACE),
SupportsExternalCompositing()); SupportsExternalCompositing(aBuilder.GetBackendType()));
} }
bool DXGIYCbCrTextureHostD3D11::SupportsExternalCompositing() { bool DXGIYCbCrTextureHostD3D11::SupportsExternalCompositing(
if (gfx::gfxVars::UseSoftwareWebRender()) { WebRenderBackend aBackend) {
return true; return aBackend == WebRenderBackend::SOFTWARE;
}
return false;
} }
bool DXGIYCbCrTextureHostD3D11::AcquireTextureSource( bool DXGIYCbCrTextureHostD3D11::AcquireTextureSource(

View File

@@ -364,7 +364,7 @@ class DXGITextureHostD3D11 : public TextureHost {
const Range<wr::ImageKey>& aImageKeys, const Range<wr::ImageKey>& aImageKeys,
PushDisplayItemFlagSet aFlags) override; PushDisplayItemFlagSet aFlags) override;
bool SupportsExternalCompositing() override; bool SupportsExternalCompositing(WebRenderBackend aBackend) override;
protected: protected:
bool LockInternal(); bool LockInternal();
@@ -435,7 +435,7 @@ class DXGIYCbCrTextureHostD3D11 : public TextureHost {
const Range<wr::ImageKey>& aImageKeys, const Range<wr::ImageKey>& aImageKeys,
PushDisplayItemFlagSet aFlags) override; PushDisplayItemFlagSet aFlags) override;
bool SupportsExternalCompositing() override; bool SupportsExternalCompositing(WebRenderBackend aBackend) override;
private: private:
bool EnsureTextureSource(); bool EnsureTextureSource();

View File

@@ -1795,7 +1795,7 @@ PWebRenderBridgeParent* CompositorBridgeParent::AllocPWebRenderBridgeParent(
return mWrBridge; return mWrBridge;
} }
wr::TransactionBuilder txn; wr::TransactionBuilder txn(api);
txn.SetRootPipeline(aPipelineId); txn.SetRootPipeline(aPipelineId);
api->SendTransaction(txn); api->SendTransaction(txn);

View File

@@ -139,6 +139,13 @@ class KnowsCompositor {
return lock.ref().mTextureFactoryIdentifier.mUseCompositorWnd; return lock.ref().mTextureFactoryIdentifier.mUseCompositorWnd;
} }
WebRenderBackend GetWebRenderBackend() const {
auto lock = mData.Lock();
MOZ_ASSERT(lock.ref().mTextureFactoryIdentifier.mParentBackend ==
layers::LayersBackend::LAYERS_WR);
return lock.ref().mTextureFactoryIdentifier.mWebRenderBackend;
}
bool UsingSoftwareWebRender() const { bool UsingSoftwareWebRender() const {
auto lock = mData.Lock(); auto lock = mData.Lock();
return lock.ref().mTextureFactoryIdentifier.mParentBackend == return lock.ref().mTextureFactoryIdentifier.mParentBackend ==

View File

@@ -13,7 +13,6 @@
#include "mozilla/layers/SourceSurfaceSharedData.h" #include "mozilla/layers/SourceSurfaceSharedData.h"
#include "mozilla/layers/CompositorThread.h" #include "mozilla/layers/CompositorThread.h"
#include "mozilla/webrender/RenderSharedSurfaceTextureHost.h" #include "mozilla/webrender/RenderSharedSurfaceTextureHost.h"
#include "mozilla/webrender/RenderSharedSurfaceTextureHostSWGL.h"
#include "mozilla/webrender/RenderThread.h" #include "mozilla/webrender/RenderThread.h"
namespace mozilla { namespace mozilla {
@@ -132,12 +131,7 @@ void SharedSurfacesParent::AddSameProcess(const wr::ExternalImageId& aId,
uint64_t id = wr::AsUint64(aId); uint64_t id = wr::AsUint64(aId);
MOZ_ASSERT(!sInstance->mSurfaces.Contains(id)); MOZ_ASSERT(!sInstance->mSurfaces.Contains(id));
RefPtr<wr::RenderTextureHost> texture; auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
if (gfx::gfxVars::UseSoftwareWebRender()) {
texture = new wr::RenderSharedSurfaceTextureHostSWGL(surface);
} else {
texture = new wr::RenderSharedSurfaceTextureHost(surface);
}
wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget()); wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget());
surface->AddConsumer(); surface->AddConsumer();
@@ -187,12 +181,7 @@ void SharedSurfacesParent::Add(const wr::ExternalImageId& aId,
uint64_t id = wr::AsUint64(aId); uint64_t id = wr::AsUint64(aId);
MOZ_ASSERT(!sInstance->mSurfaces.Contains(id)); MOZ_ASSERT(!sInstance->mSurfaces.Contains(id));
RefPtr<wr::RenderTextureHost> texture; auto texture = MakeRefPtr<wr::RenderSharedSurfaceTextureHost>(surface);
if (gfx::gfxVars::UseSoftwareWebRender()) {
texture = new wr::RenderSharedSurfaceTextureHostSWGL(surface);
} else {
texture = new wr::RenderSharedSurfaceTextureHost(surface);
}
wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget()); wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget());
surface->AddConsumer(); surface->AddConsumer();

View File

@@ -673,7 +673,7 @@ void SurfaceTextureHost::PushResourceUpdates(
? &wr::TransactionBuilder::AddExternalImage ? &wr::TransactionBuilder::AddExternalImage
: &wr::TransactionBuilder::UpdateExternalImage; : &wr::TransactionBuilder::UpdateExternalImage;
auto imageType = gfx::gfxVars::UseSoftwareWebRender() auto imageType = aResources.GetBackendType() == WebRenderBackend::SOFTWARE
? wr::ExternalImageType::TextureHandle( ? wr::ExternalImageType::TextureHandle(
wr::ImageBufferKind::TextureRect) wr::ImageBufferKind::TextureRect)
: wr::ExternalImageType::TextureHandle( : wr::ExternalImageType::TextureHandle(
@@ -707,10 +707,8 @@ void SurfaceTextureHost::PushDisplayItems(wr::DisplayListBuilder& aBuilder,
PushDisplayItemFlagSet aFlags) { PushDisplayItemFlagSet aFlags) {
bool preferCompositorSurface = bool preferCompositorSurface =
aFlags.contains(PushDisplayItemFlag::PREFER_COMPOSITOR_SURFACE); aFlags.contains(PushDisplayItemFlag::PREFER_COMPOSITOR_SURFACE);
bool supportsExternalCompositing = false; bool supportsExternalCompositing =
if (gfx::gfxVars::UseSoftwareWebRender()) { SupportsExternalCompositing(aBuilder.GetBackendType());
supportsExternalCompositing = true;
}
switch (GetFormat()) { switch (GetFormat()) {
case gfx::SurfaceFormat::R8G8B8X8: case gfx::SurfaceFormat::R8G8B8X8:

View File

@@ -247,12 +247,13 @@ Maybe<TextureHost::ResourceUpdateOp> AsyncImagePipelineManager::UpdateImageKeys(
// If we already had a texture and the format hasn't changed, better to reuse // If we already had a texture and the format hasn't changed, better to reuse
// the image keys than create new ones. // the image keys than create new ones.
auto backend = aSceneBuilderTxn.GetBackendType();
bool canUpdate = !!previousTexture && bool canUpdate = !!previousTexture &&
previousTexture->GetSize() == texture->GetSize() && previousTexture->GetSize() == texture->GetSize() &&
previousTexture->GetFormat() == texture->GetFormat() && previousTexture->GetFormat() == texture->GetFormat() &&
previousTexture->NeedsYFlip() == texture->NeedsYFlip() && previousTexture->NeedsYFlip() == texture->NeedsYFlip() &&
previousTexture->SupportsExternalCompositing() == previousTexture->SupportsExternalCompositing(backend) ==
texture->SupportsExternalCompositing() && texture->SupportsExternalCompositing(backend) &&
aPipeline->mKeys.Length() == numKeys; aPipeline->mKeys.Length() == numKeys;
if (!canUpdate) { if (!canUpdate) {
@@ -405,7 +406,7 @@ void AsyncImagePipelineManager::ApplyAsyncImageForPipeline(
aPipeline->mIsChanged = false; aPipeline->mIsChanged = false;
wr::DisplayListBuilder builder(aPipelineId); wr::DisplayListBuilder builder(aPipelineId, mApi->GetBackendType());
float opacity = 1.0f; float opacity = 1.0f;
wr::StackingContextParams params; wr::StackingContextParams params;
@@ -477,7 +478,7 @@ void AsyncImagePipelineManager::ApplyAsyncImageForPipeline(
if (!pipeline) { if (!pipeline) {
return; return;
} }
wr::TransactionBuilder fastTxn(/* aUseSceneBuilderThread */ false); wr::TransactionBuilder fastTxn(mApi, /* aUseSceneBuilderThread */ false);
wr::AutoTransactionSender sender(mApi, &fastTxn); wr::AutoTransactionSender sender(mApi, &fastTxn);
// Transaction for async image pipeline that uses ImageBridge always need to // Transaction for async image pipeline that uses ImageBridge always need to
@@ -514,7 +515,7 @@ void AsyncImagePipelineManager::SetEmptyDisplayList(
auto& txn = pipeline->mImageHost->GetAsyncRef() ? aTxnForImageBridge : aTxn; auto& txn = pipeline->mImageHost->GetAsyncRef() ? aTxnForImageBridge : aTxn;
wr::Epoch epoch = GetNextImageEpoch(); wr::Epoch epoch = GetNextImageEpoch();
wr::DisplayListBuilder builder(aPipelineId); wr::DisplayListBuilder builder(aPipelineId, mApi->GetBackendType());
wr::BuiltDisplayList dl; wr::BuiltDisplayList dl;
builder.Finalize(dl); builder.Finalize(dl);

View File

@@ -906,7 +906,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvUpdateResources(
return IPC_OK(); return IPC_OK();
} }
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.SetLowPriority(!IsRootWebRenderBridgeParent()); txn.SetLowPriority(!IsRootWebRenderBridgeParent());
Unused << GetNextWrEpoch(); Unused << GetNextWrEpoch();
@@ -1141,7 +1141,7 @@ bool WebRenderBridgeParent::ProcessDisplayListData(
DisplayListData& aDisplayList, wr::Epoch aWrEpoch, DisplayListData& aDisplayList, wr::Epoch aWrEpoch,
const TimeStamp& aTxnStartTime, bool aValidTransaction, const TimeStamp& aTxnStartTime, bool aValidTransaction,
bool aObserveLayersUpdate) { bool aObserveLayersUpdate) {
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
Maybe<wr::AutoTransactionSender> sender; Maybe<wr::AutoTransactionSender> sender;
// Note that this needs to happen before the display list transaction is // Note that this needs to happen before the display list transaction is
@@ -1251,7 +1251,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvSetDisplayList(
bool WebRenderBridgeParent::ProcessEmptyTransactionUpdates( bool WebRenderBridgeParent::ProcessEmptyTransactionUpdates(
TransactionData& aData, bool* aScheduleComposite) { TransactionData& aData, bool* aScheduleComposite) {
*aScheduleComposite = false; *aScheduleComposite = false;
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.SetLowPriority(!IsRootWebRenderBridgeParent()); txn.SetLowPriority(!IsRootWebRenderBridgeParent());
if (!aData.mScrollUpdates.IsEmpty()) { if (!aData.mScrollUpdates.IsEmpty()) {
@@ -1404,7 +1404,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvParentCommands(
return IPC_OK(); return IPC_OK();
} }
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.SetLowPriority(!IsRootWebRenderBridgeParent()); txn.SetLowPriority(!IsRootWebRenderBridgeParent());
if (!ProcessWebRenderParentCommands(aCommands, txn)) { if (!ProcessWebRenderParentCommands(aCommands, txn)) {
return IPC_FAIL(this, "Invalid parent command found"); return IPC_FAIL(this, "Invalid parent command found");
@@ -1419,7 +1419,7 @@ bool WebRenderBridgeParent::ProcessWebRenderParentCommands(
wr::TransactionBuilder& aTxn) { wr::TransactionBuilder& aTxn) {
// Transaction for async image pipeline that uses ImageBridge always need to // Transaction for async image pipeline that uses ImageBridge always need to
// be non low priority. // be non low priority.
wr::TransactionBuilder txnForImageBridge; wr::TransactionBuilder txnForImageBridge(mApi);
wr::AutoTransactionSender sender(mApi, &txnForImageBridge); wr::AutoTransactionSender sender(mApi, &txnForImageBridge);
for (nsTArray<WebRenderParentCommand>::index_type i = 0; for (nsTArray<WebRenderParentCommand>::index_type i = 0;
@@ -1563,7 +1563,7 @@ void WebRenderBridgeParent::DisableNativeCompositor() {
} }
void WebRenderBridgeParent::UpdateQualitySettings() { void WebRenderBridgeParent::UpdateQualitySettings() {
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.UpdateQualitySettings(gfxVars::ForceSubpixelAAWherePossible()); txn.UpdateQualitySettings(gfxVars::ForceSubpixelAAWherePossible());
mApi->SendTransaction(txn); mApi->SendTransaction(txn);
} }
@@ -1807,7 +1807,7 @@ mozilla::ipc::IPCResult WebRenderBridgeParent::RecvClearCachedResources() {
} }
// Clear resources // Clear resources
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.SetLowPriority(true); txn.SetLowPriority(true);
txn.ClearDisplayList(GetNextWrEpoch(), mPipelineId); txn.ClearDisplayList(GetNextWrEpoch(), mPipelineId);
txn.Notify( txn.Notify(
@@ -1886,7 +1886,7 @@ void WebRenderBridgeParent::InvalidateRenderedFrame() {
return; return;
} }
wr::TransactionBuilder fastTxn(/* aUseSceneBuilderThread */ false); wr::TransactionBuilder fastTxn(mApi, /* aUseSceneBuilderThread */ false);
fastTxn.InvalidateRenderedFrame(); fastTxn.InvalidateRenderedFrame();
mApi->SendTransaction(fastTxn); mApi->SendTransaction(fastTxn);
} }
@@ -2133,9 +2133,9 @@ void WebRenderBridgeParent::MaybeGenerateFrame(VsyncId aId,
// Ensure GenerateFrame is handled on the render backend thread rather // Ensure GenerateFrame is handled on the render backend thread rather
// than going through the scene builder thread. That way we continue // than going through the scene builder thread. That way we continue
// generating frames with the old scene even during slow scene builds. // generating frames with the old scene even during slow scene builds.
wr::TransactionBuilder fastTxn(false /* useSceneBuilderThread */); wr::TransactionBuilder fastTxn(mApi, false /* useSceneBuilderThread */);
// Handle transaction that is related to DisplayList. // Handle transaction that is related to DisplayList.
wr::TransactionBuilder sceneBuilderTxn; wr::TransactionBuilder sceneBuilderTxn(mApi);
wr::AutoTransactionSender sender(mApi, &sceneBuilderTxn); wr::AutoTransactionSender sender(mApi, &sceneBuilderTxn);
mAsyncImageManager->SetCompositionInfo(start, mCompositionOpportunityId); mAsyncImageManager->SetCompositionInfo(start, mCompositionOpportunityId);
@@ -2436,7 +2436,7 @@ void WebRenderBridgeParent::ClearResources() {
mAsyncImageManager->RemovePipeline(mPipelineId, wrEpoch); mAsyncImageManager->RemovePipeline(mPipelineId, wrEpoch);
wr::TransactionBuilder txn; wr::TransactionBuilder txn(mApi);
txn.SetLowPriority(true); txn.SetLowPriority(true);
txn.ClearDisplayList(wrEpoch, mPipelineId); txn.ClearDisplayList(wrEpoch, mPipelineId);

View File

@@ -339,7 +339,8 @@ void WebRenderLayerManager::EndTransactionWithoutLayer(
size_t preallocate = size_t preallocate =
mLastDisplayListSize < kMaxPrealloc ? mLastDisplayListSize : kMaxPrealloc; mLastDisplayListSize < kMaxPrealloc ? mLastDisplayListSize : kMaxPrealloc;
wr::DisplayListBuilder builder(WrBridge()->GetPipeline(), preallocate, wr::DisplayListBuilder builder(WrBridge()->GetPipeline(),
WrBridge()->GetWebRenderBackend(), preallocate,
&mDisplayItemCache); &mDisplayItemCache);
wr::IpcResourceUpdateQueue resourceUpdates(WrBridge()); wr::IpcResourceUpdateQueue resourceUpdates(WrBridge());

View File

@@ -215,8 +215,9 @@ void WebRenderTextureHost::PushDisplayItems(
aImageKeys, aFlags); aImageKeys, aFlags);
} }
bool WebRenderTextureHost::SupportsExternalCompositing() { bool WebRenderTextureHost::SupportsExternalCompositing(
return mWrappedTextureHost->SupportsExternalCompositing(); WebRenderBackend aBackend) {
return mWrappedTextureHost->SupportsExternalCompositing(aBackend);
} }
bool WebRenderTextureHost::NeedsYFlip() const { bool WebRenderTextureHost::NeedsYFlip() const {

View File

@@ -87,7 +87,7 @@ class WebRenderTextureHost : public TextureHost {
const Range<wr::ImageKey>& aImageKeys, const Range<wr::ImageKey>& aImageKeys,
PushDisplayItemFlagSet aFlags) override; PushDisplayItemFlagSet aFlags) override;
bool SupportsExternalCompositing() override; bool SupportsExternalCompositing(WebRenderBackend aBackend) override;
bool NeedsYFlip() const override; bool NeedsYFlip() const override;

View File

@@ -156,5 +156,88 @@ RenderBufferTextureHost::GetBufferDataForRender(uint8_t aChannelIndex) {
} }
} }
size_t RenderBufferTextureHost::GetPlaneCount() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return 3;
default:
return 1;
}
}
gfx::SurfaceFormat RenderBufferTextureHost::GetFormat() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return gfx::SurfaceFormat::YUV;
default:
return mDescriptor.get_RGBDescriptor().format();
}
}
gfx::ColorDepth RenderBufferTextureHost::GetColorDepth() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().colorDepth();
default:
return gfx::ColorDepth::COLOR_8;
}
}
gfx::YUVColorSpace RenderBufferTextureHost::GetYUVColorSpace() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().yUVColorSpace();
default:
return gfx::YUVColorSpace::UNKNOWN;
}
}
bool RenderBufferTextureHost::MapPlane(RenderCompositor* aCompositor,
uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) {
if (!mBuffer) {
// We hit some problems to get the shmem.
gfxCriticalNote << "GetBuffer Failed";
return false;
}
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor: {
const layers::YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor();
switch (aChannelIndex) {
case 0:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetYChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.yStride();
aPlaneInfo.mSize = desc.ySize();
break;
case 1:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCbChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
case 2:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCrChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
}
break;
}
default: {
const layers::RGBDescriptor& desc = mDescriptor.get_RGBDescriptor();
aPlaneInfo.mData = mBuffer;
aPlaneInfo.mStride = layers::ImageDataSerializer::GetRGBStride(desc);
aPlaneInfo.mSize = desc.size();
break;
}
}
return true;
}
void RenderBufferTextureHost::UnmapPlanes() {}
} // namespace wr } // namespace wr
} // namespace mozilla } // namespace mozilla

View File

@@ -7,16 +7,17 @@
#ifndef MOZILLA_GFX_RENDERBUFFERTEXTUREHOST_H #ifndef MOZILLA_GFX_RENDERBUFFERTEXTUREHOST_H
#define MOZILLA_GFX_RENDERBUFFERTEXTUREHOST_H #define MOZILLA_GFX_RENDERBUFFERTEXTUREHOST_H
#include "RenderTextureHost.h" #include "RenderTextureHostSWGL.h"
namespace mozilla { namespace mozilla {
namespace wr { namespace wr {
class RenderBufferTextureHost final : public RenderTextureHost { class RenderBufferTextureHost final : public RenderTextureHostSWGL {
public: public:
RenderBufferTextureHost(uint8_t* aBuffer, RenderBufferTextureHost(uint8_t* aBuffer,
const layers::BufferDescriptor& aDescriptor); const layers::BufferDescriptor& aDescriptor);
// RenderTextureHost
wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL, wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL,
wr::ImageRendering aRendering) override; wr::ImageRendering aRendering) override;
void Unlock() override; void Unlock() override;
@@ -34,6 +35,20 @@ class RenderBufferTextureHost final : public RenderTextureHost {
RenderBufferData GetBufferDataForRender(uint8_t aChannelIndex); RenderBufferData GetBufferDataForRender(uint8_t aChannelIndex);
// RenderTextureHostSWGL
size_t GetPlaneCount() const override;
gfx::SurfaceFormat GetFormat() const override;
gfx::ColorDepth GetColorDepth() const override;
gfx::YUVColorSpace GetYUVColorSpace() const override;
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) override;
void UnmapPlanes() override;
private: private:
virtual ~RenderBufferTextureHost(); virtual ~RenderBufferTextureHost();

View File

@@ -1,119 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "RenderBufferTextureHostSWGL.h"
#include "mozilla/gfx/Logging.h"
#include "mozilla/layers/ImageDataSerializer.h"
namespace mozilla {
namespace wr {
RenderBufferTextureHostSWGL::RenderBufferTextureHostSWGL(
uint8_t* aBuffer, const layers::BufferDescriptor& aDescriptor)
: mBuffer(aBuffer), mDescriptor(aDescriptor) {
MOZ_COUNT_CTOR_INHERITED(RenderBufferTextureHostSWGL, RenderTextureHostSWGL);
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
case layers::BufferDescriptor::TRGBDescriptor:
break;
default:
gfxCriticalError() << "Bad buffer host descriptor "
<< (int)mDescriptor.type();
MOZ_CRASH("GFX: Bad descriptor");
}
}
RenderBufferTextureHostSWGL::~RenderBufferTextureHostSWGL() {
MOZ_COUNT_DTOR_INHERITED(RenderBufferTextureHostSWGL, RenderTextureHostSWGL);
}
size_t RenderBufferTextureHostSWGL::GetPlaneCount() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return 3;
default:
return 1;
}
}
gfx::SurfaceFormat RenderBufferTextureHostSWGL::GetFormat() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return gfx::SurfaceFormat::YUV;
default:
return mDescriptor.get_RGBDescriptor().format();
}
}
gfx::ColorDepth RenderBufferTextureHostSWGL::GetColorDepth() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().colorDepth();
default:
return gfx::ColorDepth::COLOR_8;
}
}
gfx::YUVColorSpace RenderBufferTextureHostSWGL::GetYUVColorSpace() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().yUVColorSpace();
default:
return gfx::YUVColorSpace::UNKNOWN;
}
}
bool RenderBufferTextureHostSWGL::MapPlane(RenderCompositor* aCompositor,
uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) {
if (!mBuffer) {
// We hit some problems to get the shmem.
gfxCriticalNote << "GetBuffer Failed";
return false;
}
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor: {
const layers::YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor();
switch (aChannelIndex) {
case 0:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetYChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.yStride();
aPlaneInfo.mSize = desc.ySize();
break;
case 1:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCbChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
case 2:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCrChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
}
break;
}
default: {
const layers::RGBDescriptor& desc = mDescriptor.get_RGBDescriptor();
aPlaneInfo.mData = mBuffer;
aPlaneInfo.mStride = layers::ImageDataSerializer::GetRGBStride(desc);
aPlaneInfo.mSize = desc.size();
break;
}
}
return true;
}
void RenderBufferTextureHostSWGL::UnmapPlanes() {}
} // namespace wr
} // namespace mozilla

View File

@@ -1,45 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef MOZILLA_GFX_RENDERBUFFERTEXTUREHOSTSWGL_H
#define MOZILLA_GFX_RENDERBUFFERTEXTUREHOSTSWGL_H
#include "RenderTextureHostSWGL.h"
namespace mozilla {
namespace wr {
class RenderBufferTextureHostSWGL final : public RenderTextureHostSWGL {
public:
RenderBufferTextureHostSWGL(uint8_t* aBuffer,
const layers::BufferDescriptor& aDescriptor);
size_t GetPlaneCount() const override;
gfx::SurfaceFormat GetFormat() const override;
gfx::ColorDepth GetColorDepth() const override;
gfx::YUVColorSpace GetYUVColorSpace() const override;
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) override;
void UnmapPlanes() override;
size_t Bytes() override { return BytesFromPlanes(); }
private:
virtual ~RenderBufferTextureHostSWGL();
uint8_t* mBuffer;
layers::BufferDescriptor mDescriptor;
};
} // namespace wr
} // namespace mozilla
#endif // MOZILLA_GFX_RENDERBUFFERTEXTUREHOSTSWGL_H

View File

@@ -198,5 +198,76 @@ void RenderExternalTextureHost::UpdateTextures(wr::ImageRendering aRendering) {
mTextureUpdateNeeded = false; mTextureUpdateNeeded = false;
} }
size_t RenderExternalTextureHost::GetPlaneCount() const { return PlaneCount(); }
gfx::SurfaceFormat RenderExternalTextureHost::GetFormat() const {
return mFormat;
}
gfx::ColorDepth RenderExternalTextureHost::GetColorDepth() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().colorDepth();
default:
return gfx::ColorDepth::COLOR_8;
}
}
gfx::YUVColorSpace RenderExternalTextureHost::GetYUVColorSpace() const {
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor:
return mDescriptor.get_YCbCrDescriptor().yUVColorSpace();
default:
return gfx::YUVColorSpace::UNKNOWN;
}
}
bool RenderExternalTextureHost::MapPlane(RenderCompositor* aCompositor,
uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) {
if (!mBuffer) {
// We hit some problems to get the shmem.
gfxCriticalNote << "GetBuffer Failed";
return false;
}
switch (mDescriptor.type()) {
case layers::BufferDescriptor::TYCbCrDescriptor: {
const layers::YCbCrDescriptor& desc = mDescriptor.get_YCbCrDescriptor();
switch (aChannelIndex) {
case 0:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetYChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.yStride();
aPlaneInfo.mSize = desc.ySize();
break;
case 1:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCbChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
case 2:
aPlaneInfo.mData =
layers::ImageDataSerializer::GetCrChannel(mBuffer, desc);
aPlaneInfo.mStride = desc.cbCrStride();
aPlaneInfo.mSize = desc.cbCrSize();
break;
}
break;
}
default: {
const layers::RGBDescriptor& desc = mDescriptor.get_RGBDescriptor();
aPlaneInfo.mData = mBuffer;
aPlaneInfo.mStride = layers::ImageDataSerializer::GetRGBStride(desc);
aPlaneInfo.mSize = desc.size();
break;
}
}
return true;
}
void RenderExternalTextureHost::UnmapPlanes() {}
} // namespace wr } // namespace wr
} // namespace mozilla } // namespace mozilla

View File

@@ -8,7 +8,7 @@
#define MOZILLA_GFX_RENDEREXTERNALTEXTUREHOST_H #define MOZILLA_GFX_RENDEREXTERNALTEXTUREHOST_H
#include "mozilla/layers/TextureHostOGL.h" #include "mozilla/layers/TextureHostOGL.h"
#include "RenderTextureHost.h" #include "RenderTextureHostSWGL.h"
namespace mozilla { namespace mozilla {
namespace wr { namespace wr {
@@ -19,7 +19,7 @@ namespace wr {
* extension, which makes it possible to avoid some copies during texture * extension, which makes it possible to avoid some copies during texture
* upload. This is especially helpful for high resolution video. * upload. This is especially helpful for high resolution video.
*/ */
class RenderExternalTextureHost final : public RenderTextureHost { class RenderExternalTextureHost final : public RenderTextureHostSWGL {
public: public:
RenderExternalTextureHost(uint8_t* aBuffer, RenderExternalTextureHost(uint8_t* aBuffer,
const layers::BufferDescriptor& aDescriptor); const layers::BufferDescriptor& aDescriptor);
@@ -32,6 +32,20 @@ class RenderExternalTextureHost final : public RenderTextureHost {
return mSize.width * mSize.height * BytesPerPixel(mFormat); return mSize.width * mSize.height * BytesPerPixel(mFormat);
} }
// RenderTextureHostSWGL
size_t GetPlaneCount() const override;
gfx::SurfaceFormat GetFormat() const override;
gfx::ColorDepth GetColorDepth() const override;
gfx::YUVColorSpace GetYUVColorSpace() const override;
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) override;
void UnmapPlanes() override;
private: private:
~RenderExternalTextureHost(); ~RenderExternalTextureHost();

View File

@@ -49,5 +49,30 @@ size_t RenderSharedSurfaceTextureHost::Bytes() {
return mSurface->Stride() * mSurface->GetSize().height; return mSurface->Stride() * mSurface->GetSize().height;
} }
size_t RenderSharedSurfaceTextureHost::GetPlaneCount() const { return 1; }
gfx::SurfaceFormat RenderSharedSurfaceTextureHost::GetFormat() const {
return mSurface->GetFormat();
}
gfx::ColorDepth RenderSharedSurfaceTextureHost::GetColorDepth() const {
return gfx::ColorDepth::COLOR_8;
}
bool RenderSharedSurfaceTextureHost::MapPlane(RenderCompositor* aCompositor,
uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) {
if (NS_WARN_IF(
!mSurface->Map(gfx::DataSourceSurface::MapType::READ, &mMap))) {
return false;
}
aPlaneInfo.mData = mMap.mData;
aPlaneInfo.mStride = mMap.mStride;
aPlaneInfo.mSize = mSurface->GetSize();
return true;
}
void RenderSharedSurfaceTextureHost::UnmapPlanes() { mSurface->Unmap(); }
} // namespace wr } // namespace wr
} // namespace mozilla } // namespace mozilla

View File

@@ -7,7 +7,7 @@
#ifndef MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOST_H #ifndef MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOST_H
#define MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOST_H #define MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOST_H
#include "RenderTextureHost.h" #include "RenderTextureHostSWGL.h"
namespace mozilla { namespace mozilla {
namespace gfx { namespace gfx {
@@ -21,16 +21,29 @@ namespace wr {
* into the render texture cache by wrapping an existing surface wrapper. These * into the render texture cache by wrapping an existing surface wrapper. These
* surfaces are backed by BGRA/X shared memory buffers. * surfaces are backed by BGRA/X shared memory buffers.
*/ */
class RenderSharedSurfaceTextureHost final : public RenderTextureHost { class RenderSharedSurfaceTextureHost final : public RenderTextureHostSWGL {
public: public:
explicit RenderSharedSurfaceTextureHost( explicit RenderSharedSurfaceTextureHost(
gfx::SourceSurfaceSharedDataWrapper* aSurface); gfx::SourceSurfaceSharedDataWrapper* aSurface);
// RenderTextureHost
wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL, wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL,
wr::ImageRendering aRendering) override; wr::ImageRendering aRendering) override;
void Unlock() override; void Unlock() override;
size_t Bytes() override; size_t Bytes() override;
// RenderTextureHostSWGL
size_t GetPlaneCount() const override;
gfx::SurfaceFormat GetFormat() const override;
gfx::ColorDepth GetColorDepth() const override;
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) override;
void UnmapPlanes() override;
private: private:
virtual ~RenderSharedSurfaceTextureHost(); virtual ~RenderSharedSurfaceTextureHost();

View File

@@ -1,53 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "RenderSharedSurfaceTextureHostSWGL.h"
#include "mozilla/layers/SourceSurfaceSharedData.h"
namespace mozilla {
namespace wr {
RenderSharedSurfaceTextureHostSWGL::RenderSharedSurfaceTextureHostSWGL(
gfx::SourceSurfaceSharedDataWrapper* aSurface)
: mSurface(aSurface) {
MOZ_COUNT_CTOR_INHERITED(RenderSharedSurfaceTextureHostSWGL,
RenderTextureHostSWGL);
MOZ_ASSERT(aSurface);
}
RenderSharedSurfaceTextureHostSWGL::~RenderSharedSurfaceTextureHostSWGL() {
MOZ_COUNT_DTOR_INHERITED(RenderSharedSurfaceTextureHostSWGL,
RenderTextureHostSWGL);
}
size_t RenderSharedSurfaceTextureHostSWGL::GetPlaneCount() const { return 1; }
gfx::SurfaceFormat RenderSharedSurfaceTextureHostSWGL::GetFormat() const {
return mSurface->GetFormat();
}
gfx::ColorDepth RenderSharedSurfaceTextureHostSWGL::GetColorDepth() const {
return gfx::ColorDepth::COLOR_8;
}
bool RenderSharedSurfaceTextureHostSWGL::MapPlane(RenderCompositor* aCompositor,
uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) {
if (NS_WARN_IF(
!mSurface->Map(gfx::DataSourceSurface::MapType::READ, &mMap))) {
return false;
}
aPlaneInfo.mData = mMap.mData;
aPlaneInfo.mStride = mMap.mStride;
aPlaneInfo.mSize = mSurface->GetSize();
return true;
}
void RenderSharedSurfaceTextureHostSWGL::UnmapPlanes() { mSurface->Unmap(); }
} // namespace wr
} // namespace mozilla

View File

@@ -1,52 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOSTSWGL_H
#define MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOSTSWGL_H
#include "RenderTextureHostSWGL.h"
namespace mozilla {
namespace gfx {
class SourceSurfaceSharedDataWrapper;
}
namespace wr {
/**
* This class allows for surfaces managed by SharedSurfacesParent to be inserted
* into the render texture cache by wrapping an existing surface wrapper. These
* surfaces are backed by BGRA/X shared memory buffers.
*/
class RenderSharedSurfaceTextureHostSWGL final : public RenderTextureHostSWGL {
public:
explicit RenderSharedSurfaceTextureHostSWGL(
gfx::SourceSurfaceSharedDataWrapper* aSurface);
size_t GetPlaneCount() const override;
gfx::SurfaceFormat GetFormat() const override;
gfx::ColorDepth GetColorDepth() const override;
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
PlaneInfo& aPlaneInfo) override;
void UnmapPlanes() override;
size_t Bytes() override { return BytesFromPlanes(); }
private:
virtual ~RenderSharedSurfaceTextureHostSWGL();
RefPtr<gfx::SourceSurfaceSharedDataWrapper> mSurface;
gfx::DataSourceSurface::MappedSurface mMap;
};
} // namespace wr
} // namespace mozilla
#endif // MOZILLA_GFX_RENDERSHAREDSURFACETEXTUREHOSTSWGL_H

View File

@@ -217,8 +217,10 @@ class RemoveRenderer : public RendererEvent {
layers::SynchronousTask* mTask; layers::SynchronousTask* mTask;
}; };
TransactionBuilder::TransactionBuilder(bool aUseSceneBuilderThread) TransactionBuilder::TransactionBuilder(WebRenderAPI* aApi,
: mUseSceneBuilderThread(aUseSceneBuilderThread) { bool aUseSceneBuilderThread)
: mUseSceneBuilderThread(aUseSceneBuilderThread),
mApiBackend(aApi->GetBackendType()) {
mTxn = wr_transaction_new(mUseSceneBuilderThread); mTxn = wr_transaction_new(mUseSceneBuilderThread);
} }
@@ -924,11 +926,14 @@ void WebRenderAPI::RunOnRenderThread(UniquePtr<RendererEvent> aEvent) {
wr_api_send_external_event(mDocHandle, event); wr_api_send_external_event(mDocHandle, event);
} }
DisplayListBuilder::DisplayListBuilder(PipelineId aId, size_t aCapacity, DisplayListBuilder::DisplayListBuilder(PipelineId aId,
WebRenderBackend aBackend,
size_t aCapacity,
layers::DisplayItemCache* aCache) layers::DisplayItemCache* aCache)
: mCurrentSpaceAndClipChain(wr::RootScrollNodeWithChain()), : mCurrentSpaceAndClipChain(wr::RootScrollNodeWithChain()),
mActiveFixedPosTracker(nullptr), mActiveFixedPosTracker(nullptr),
mPipelineId(aId), mPipelineId(aId),
mBackend(aBackend),
mDisplayItemCache(aCache) { mDisplayItemCache(aCache) {
MOZ_COUNT_CTOR(DisplayListBuilder); MOZ_COUNT_CTOR(DisplayListBuilder);
mWrState = wr_state_new(aId, aCapacity); mWrState = wr_state_new(aId, aCapacity);

View File

@@ -58,6 +58,7 @@ namespace wr {
class DisplayListBuilder; class DisplayListBuilder;
class RendererOGL; class RendererOGL;
class RendererEvent; class RendererEvent;
class WebRenderAPI;
// This isn't part of WR's API, but we define it here to simplify layout's // This isn't part of WR's API, but we define it here to simplify layout's
// logic and data plumbing. // logic and data plumbing.
@@ -91,7 +92,8 @@ struct WrHitResult {
class TransactionBuilder final { class TransactionBuilder final {
public: public:
explicit TransactionBuilder(bool aUseSceneBuilderThread = true); explicit TransactionBuilder(WebRenderAPI* aApi,
bool aUseSceneBuilderThread = true);
~TransactionBuilder(); ~TransactionBuilder();
@@ -198,10 +200,12 @@ class TransactionBuilder final {
void Clear(); void Clear();
bool UseSceneBuilderThread() const { return mUseSceneBuilderThread; } bool UseSceneBuilderThread() const { return mUseSceneBuilderThread; }
layers::WebRenderBackend GetBackendType() { return mApiBackend; }
Transaction* Raw() { return mTxn; } Transaction* Raw() { return mTxn; }
protected: protected:
bool mUseSceneBuilderThread; bool mUseSceneBuilderThread;
layers::WebRenderBackend mApiBackend;
Transaction* mTxn; Transaction* mTxn;
}; };
@@ -414,7 +418,9 @@ struct MOZ_STACK_CLASS StackingContextParams : public WrStackingContextParams {
/// WebRenderFrameBuilder instead, so the interface may change a bit. /// WebRenderFrameBuilder instead, so the interface may change a bit.
class DisplayListBuilder final { class DisplayListBuilder final {
public: public:
explicit DisplayListBuilder(wr::PipelineId aId, size_t aCapacity = 0, explicit DisplayListBuilder(wr::PipelineId aId,
layers::WebRenderBackend aBackend,
size_t aCapacity = 0,
layers::DisplayItemCache* aCache = nullptr); layers::DisplayItemCache* aCache = nullptr);
DisplayListBuilder(DisplayListBuilder&&) = default; DisplayListBuilder(DisplayListBuilder&&) = default;
@@ -649,6 +655,7 @@ class DisplayListBuilder final {
} }
const wr::PipelineId& CurrentPipelineId() const { return mPipelineId; } const wr::PipelineId& CurrentPipelineId() const { return mPipelineId; }
layers::WebRenderBackend GetBackendType() const { return mBackend; }
// Checks to see if the innermost enclosing fixed pos item has the same // Checks to see if the innermost enclosing fixed pos item has the same
// ASR. If so, it returns the scroll target for that fixed-pos item. // ASR. If so, it returns the scroll target for that fixed-pos item.
@@ -731,6 +738,7 @@ class DisplayListBuilder final {
FixedPosScrollTargetTracker* mActiveFixedPosTracker; FixedPosScrollTargetTracker* mActiveFixedPosTracker;
wr::PipelineId mPipelineId; wr::PipelineId mPipelineId;
layers::WebRenderBackend mBackend;
wr::LayoutSize mContentSize; wr::LayoutSize mContentSize;
nsTArray<wr::PipelineId> mRemotePipelineIds; nsTArray<wr::PipelineId> mRemotePipelineIds;

View File

@@ -9,7 +9,6 @@ with Files("**"):
EXPORTS.mozilla.webrender += [ EXPORTS.mozilla.webrender += [
"RenderBufferTextureHost.h", "RenderBufferTextureHost.h",
"RenderBufferTextureHostSWGL.h",
"RenderCompositor.h", "RenderCompositor.h",
"RenderCompositorEGL.h", "RenderCompositorEGL.h",
"RenderCompositorOGL.h", "RenderCompositorOGL.h",
@@ -19,7 +18,6 @@ EXPORTS.mozilla.webrender += [
"RendererScreenshotGrabber.h", "RendererScreenshotGrabber.h",
"RenderExternalTextureHost.h", "RenderExternalTextureHost.h",
"RenderSharedSurfaceTextureHost.h", "RenderSharedSurfaceTextureHost.h",
"RenderSharedSurfaceTextureHostSWGL.h",
"RenderTextureHost.h", "RenderTextureHost.h",
"RenderTextureHostSWGL.h", "RenderTextureHostSWGL.h",
"RenderTextureHostWrapper.h", "RenderTextureHostWrapper.h",
@@ -32,7 +30,6 @@ EXPORTS.mozilla.webrender += [
UNIFIED_SOURCES += [ UNIFIED_SOURCES += [
"Moz2DImageRenderer.cpp", "Moz2DImageRenderer.cpp",
"RenderBufferTextureHost.cpp", "RenderBufferTextureHost.cpp",
"RenderBufferTextureHostSWGL.cpp",
"RenderCompositor.cpp", "RenderCompositor.cpp",
"RenderCompositorEGL.cpp", "RenderCompositorEGL.cpp",
"RenderCompositorOGL.cpp", "RenderCompositorOGL.cpp",
@@ -42,7 +39,6 @@ UNIFIED_SOURCES += [
"RendererScreenshotGrabber.cpp", "RendererScreenshotGrabber.cpp",
"RenderExternalTextureHost.cpp", "RenderExternalTextureHost.cpp",
"RenderSharedSurfaceTextureHost.cpp", "RenderSharedSurfaceTextureHost.cpp",
"RenderSharedSurfaceTextureHostSWGL.cpp",
"RenderTextureHost.cpp", "RenderTextureHost.cpp",
"RenderTextureHostSWGL.cpp", "RenderTextureHostSWGL.cpp",
"RenderTextureHostWrapper.cpp", "RenderTextureHostWrapper.cpp",