gecko-dev/gfx/layers/ipc/CompositableTransactionParent.h
sotaro ec2350cffb Bug 1557105 - Handle non-webrender widget case during enabling WebRender at ImageBridge r=nical
ImageBridgeChild has only one global TextureFactoryIdentifier. When WebRender is enabled, it is used for both WebRender widget and non-WebRender(BasicCompositor) widget. WebRenderImageHost and ImageHost are incompatible and WebRenderTextureHost does not permit to be consumed on compositor thread. Then it does not work well for non-WebRender widget. To address the problem at ImageContainer, ImageContainer needs to know a connected widget type. It is not easy in some cases like WebRTC. Then host side could address the problem easier.

CompositableParentManager::FindCompositable() is changed to permit transform from WebRenderImageHost to ImageHost if it is necessary when WebRenderImageHost belongs to ImageBridge.

WebRenderTextureHost is changed to permit to consume wrapped TextureHost on compositor thread. If the wrapped TextureHost is BufferTextureHost, it is possible to comsume the TextureHost on compositor and on RenderThread, since they are memory buffer or shared memory buffer. WebRTC code always create BufferTextureHost for video frame. Then it works.

Differential Revision: https://phabricator.services.mozilla.com/D34132

--HG--
extra : moz-landing-system : lando
2019-06-10 12:36:14 +00:00

66 lines
2.3 KiB
C++

/* -*- 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_LAYERS_COMPOSITABLETRANSACTIONPARENT_H
#define MOZILLA_LAYERS_COMPOSITABLETRANSACTIONPARENT_H
#include <vector> // for vector
#include "mozilla/Attributes.h" // for override
#include "mozilla/NotNull.h"
#include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator
#include "mozilla/layers/LayersMessages.h" // for EditReply, etc
#include "mozilla/layers/TextureClient.h"
#include "CompositableHost.h"
namespace mozilla {
namespace layers {
// Since PCompositble has two potential manager protocols, we can't just call
// the Manager() method usually generated when there's one manager protocol,
// so both manager protocols implement this and we keep a reference to them
// through this interface.
class CompositableParentManager : public HostIPCAllocator {
public:
CompositableParentManager() {}
void DestroyActor(const OpDestroy& aOp);
void UpdateFwdTransactionId(uint64_t aTransactionId) {
MOZ_ASSERT(mFwdTransactionId < aTransactionId);
mFwdTransactionId = aTransactionId;
}
uint64_t GetFwdTransactionId() { return mFwdTransactionId; }
RefPtr<CompositableHost> AddCompositable(const CompositableHandle& aHandle,
const TextureInfo& aInfo,
bool aUseWebRender);
RefPtr<CompositableHost> FindCompositable(
const CompositableHandle& aHandle, bool aAllowDisablingWebRender = false);
protected:
/**
* Handle the IPDL messages that affect PCompositable actors.
*/
bool ReceiveCompositableUpdate(const CompositableOperation& aEdit);
bool ReceiveCompositableUpdate(const CompositableOperationDetail& aDetail,
NotNull<CompositableHost*> aCompositable);
void ReleaseCompositable(const CompositableHandle& aHandle);
uint64_t mFwdTransactionId = 0;
/**
* Mapping form IDs to CompositableHosts.
*/
std::map<uint64_t, RefPtr<CompositableHost>> mCompositables;
};
} // namespace layers
} // namespace mozilla
#endif