2016-11-16 13:54:51 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set sw=4 ts=8 et 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_WebRenderBridgeChild_h
|
|
|
|
#define mozilla_layers_WebRenderBridgeChild_h
|
|
|
|
|
2016-11-30 10:57:26 +00:00
|
|
|
#include "mozilla/layers/CompositableForwarder.h"
|
2016-11-16 13:54:51 +00:00
|
|
|
#include "mozilla/layers/PWebRenderBridgeChild.h"
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
namespace widget {
|
|
|
|
class CompositorWidget;
|
|
|
|
}
|
|
|
|
|
2017-03-03 15:45:29 +00:00
|
|
|
namespace wr {
|
|
|
|
class DisplayListBuilder;
|
|
|
|
}
|
|
|
|
|
2016-11-16 13:54:51 +00:00
|
|
|
namespace layers {
|
|
|
|
|
2016-12-08 01:52:24 +00:00
|
|
|
class CompositableClient;
|
2016-11-28 02:39:42 +00:00
|
|
|
class CompositorBridgeChild;
|
|
|
|
class TextureForwarder;
|
|
|
|
|
2017-04-06 21:41:24 +00:00
|
|
|
class UnscaledFontHashKey : public PLDHashEntryHdr
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
typedef gfx::UnscaledFont* KeyType;
|
|
|
|
typedef const gfx::UnscaledFont* KeyTypePointer;
|
|
|
|
|
|
|
|
explicit UnscaledFontHashKey(KeyTypePointer aKey) : mKey(const_cast<KeyType>(aKey)) {}
|
|
|
|
|
|
|
|
KeyType GetKey() const { return mKey; }
|
|
|
|
bool KeyEquals(KeyTypePointer aKey) const { return aKey == mKey; }
|
|
|
|
|
|
|
|
static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; }
|
|
|
|
static PLDHashNumber HashKey(KeyTypePointer aKey)
|
|
|
|
{
|
|
|
|
return NS_PTR_TO_UINT32(aKey) >> 2;
|
|
|
|
}
|
|
|
|
enum { ALLOW_MEMMOVE = true };
|
|
|
|
|
|
|
|
private:
|
|
|
|
WeakPtr<gfx::UnscaledFont> mKey;
|
|
|
|
};
|
|
|
|
|
2016-11-16 13:54:51 +00:00
|
|
|
class WebRenderBridgeChild final : public PWebRenderBridgeChild
|
2016-11-30 10:57:26 +00:00
|
|
|
, public CompositableForwarder
|
2016-11-16 13:54:51 +00:00
|
|
|
{
|
2016-11-29 02:08:08 +00:00
|
|
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebRenderBridgeChild, override)
|
2016-11-16 13:54:51 +00:00
|
|
|
|
|
|
|
public:
|
2017-02-27 03:16:11 +00:00
|
|
|
explicit WebRenderBridgeChild(const wr::PipelineId& aPipelineId);
|
2016-11-18 08:07:02 +00:00
|
|
|
|
2017-03-02 21:33:03 +00:00
|
|
|
void AddWebRenderParentCommand(const WebRenderParentCommand& aCmd);
|
|
|
|
void AddWebRenderParentCommands(const nsTArray<WebRenderParentCommand>& aCommands);
|
2016-11-18 08:07:02 +00:00
|
|
|
|
2017-01-17 20:13:41 +00:00
|
|
|
bool DPBegin(const gfx::IntSize& aSize);
|
2017-04-20 14:38:04 +00:00
|
|
|
void DPEnd(wr::DisplayListBuilder &aBuilder, const gfx::IntSize& aSize,
|
|
|
|
bool aIsSync, uint64_t aTransactionId,
|
|
|
|
const WebRenderScrollData& aScrollData);
|
2016-11-24 06:48:01 +00:00
|
|
|
|
2016-11-28 02:39:42 +00:00
|
|
|
CompositorBridgeChild* GetCompositorBridgeChild();
|
2016-11-30 10:57:26 +00:00
|
|
|
|
2017-03-03 15:45:29 +00:00
|
|
|
wr::PipelineId GetPipeline() { return mPipelineId; }
|
|
|
|
|
2016-11-28 02:39:42 +00:00
|
|
|
// KnowsCompositor
|
2016-11-29 02:08:08 +00:00
|
|
|
TextureForwarder* GetTextureForwarder() override;
|
|
|
|
LayersIPCActor* GetLayersIPCActor() override;
|
2016-11-28 02:39:42 +00:00
|
|
|
|
2017-04-19 09:59:53 +00:00
|
|
|
wr::ExternalImageId AllocExternalImageId(const CompositableHandle& aHandle);
|
|
|
|
wr::ExternalImageId AllocExternalImageIdForCompositable(CompositableClient* aCompositable);
|
|
|
|
void DeallocExternalImageId(wr::ExternalImageId& aImageId);
|
2016-11-25 01:36:37 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Clean this up, finishing with SendShutDown() which will cause __delete__
|
|
|
|
* to be sent from the parent side.
|
|
|
|
*/
|
|
|
|
void Destroy();
|
|
|
|
bool IPCOpen() const { return mIPCOpen && !mDestroyed; }
|
|
|
|
bool IsDestroyed() const { return mDestroyed; }
|
2016-11-30 10:57:26 +00:00
|
|
|
|
2017-02-22 18:19:57 +00:00
|
|
|
uint32_t GetNextResourceId() { return ++mResourceId; }
|
|
|
|
uint32_t GetNamespace() { return mIdNamespace; }
|
2017-02-27 03:16:11 +00:00
|
|
|
void SetNamespace(uint32_t aIdNamespace)
|
|
|
|
{
|
|
|
|
mIdNamespace = aIdNamespace;
|
|
|
|
}
|
2017-02-22 18:19:57 +00:00
|
|
|
|
2017-04-06 21:41:24 +00:00
|
|
|
void PushGlyphs(wr::DisplayListBuilder& aBuilder, const nsTArray<GlyphArray>& aGlyphs,
|
|
|
|
gfx::ScaledFont* aFont, const gfx::Point& aOffset, const gfx::Rect& aBounds,
|
|
|
|
const gfx::Rect& aClip);
|
|
|
|
|
|
|
|
wr::FontKey GetFontKeyForScaledFont(gfx::ScaledFont* aScaledFont);
|
|
|
|
|
|
|
|
void RemoveExpiredFontKeys();
|
2017-04-19 22:39:46 +00:00
|
|
|
void ClearReadLocks();
|
2017-04-06 21:41:24 +00:00
|
|
|
|
2016-11-30 10:57:26 +00:00
|
|
|
private:
|
2016-11-25 01:36:37 +00:00
|
|
|
friend class CompositorBridgeChild;
|
|
|
|
|
2016-11-16 13:54:51 +00:00
|
|
|
~WebRenderBridgeChild() {}
|
2016-11-18 08:07:02 +00:00
|
|
|
|
2017-04-19 09:59:53 +00:00
|
|
|
wr::ExternalImageId GetNextExternalImageId();
|
2016-12-08 01:52:24 +00:00
|
|
|
|
2016-11-30 10:57:26 +00:00
|
|
|
// CompositableForwarder
|
|
|
|
void Connect(CompositableClient* aCompositable,
|
|
|
|
ImageContainer* aImageContainer = nullptr) override;
|
|
|
|
void UseTiledLayerBuffer(CompositableClient* aCompositable,
|
|
|
|
const SurfaceDescriptorTiles& aTiledDescriptor) override;
|
|
|
|
void UpdateTextureRegion(CompositableClient* aCompositable,
|
|
|
|
const ThebesBufferData& aThebesBufferData,
|
|
|
|
const nsIntRegion& aUpdatedRegion) override;
|
2017-01-18 18:47:27 +00:00
|
|
|
void ReleaseCompositable(const CompositableHandle& aHandle) override;
|
2017-02-15 22:28:24 +00:00
|
|
|
bool DestroyInTransaction(PTextureChild* aTexture) override;
|
2017-01-18 18:47:27 +00:00
|
|
|
bool DestroyInTransaction(const CompositableHandle& aHandle);
|
2016-11-30 10:57:26 +00:00
|
|
|
void RemoveTextureFromCompositable(CompositableClient* aCompositable,
|
|
|
|
TextureClient* aTexture) override;
|
|
|
|
void UseTextures(CompositableClient* aCompositable,
|
|
|
|
const nsTArray<TimedTextureClient>& aTextures) override;
|
|
|
|
void UseComponentAlphaTextures(CompositableClient* aCompositable,
|
|
|
|
TextureClient* aClientOnBlack,
|
|
|
|
TextureClient* aClientOnWhite) override;
|
|
|
|
void UpdateFwdTransactionId() override;
|
|
|
|
uint64_t GetFwdTransactionId() override;
|
|
|
|
bool InForwarderThread() override;
|
|
|
|
|
|
|
|
void ActorDestroy(ActorDestroyReason why) override;
|
2016-11-25 01:36:37 +00:00
|
|
|
|
|
|
|
void AddIPDLReference() {
|
|
|
|
MOZ_ASSERT(mIPCOpen == false);
|
|
|
|
mIPCOpen = true;
|
|
|
|
AddRef();
|
|
|
|
}
|
|
|
|
void ReleaseIPDLReference() {
|
|
|
|
MOZ_ASSERT(mIPCOpen == true);
|
|
|
|
mIPCOpen = false;
|
|
|
|
Release();
|
|
|
|
}
|
|
|
|
|
2017-02-15 22:28:24 +00:00
|
|
|
bool AddOpDestroy(const OpDestroy& aOp);
|
2016-12-05 04:15:02 +00:00
|
|
|
|
2017-03-02 21:33:03 +00:00
|
|
|
nsTArray<WebRenderParentCommand> mParentCommands;
|
2016-12-05 04:15:02 +00:00
|
|
|
nsTArray<OpDestroy> mDestroyedActors;
|
2017-01-18 18:47:27 +00:00
|
|
|
nsDataHashtable<nsUint64HashKey, CompositableClient*> mCompositables;
|
2017-02-27 03:12:12 +00:00
|
|
|
nsTArray<nsTArray<ReadLockInit>> mReadLocks;
|
|
|
|
uint64_t mReadLockSequenceNumber;
|
2016-11-18 08:07:02 +00:00
|
|
|
bool mIsInTransaction;
|
2017-02-22 18:19:57 +00:00
|
|
|
uint32_t mIdNamespace;
|
|
|
|
uint32_t mResourceId;
|
2017-03-02 01:36:27 +00:00
|
|
|
wr::PipelineId mPipelineId;
|
2016-12-05 04:15:02 +00:00
|
|
|
|
2016-11-25 01:36:37 +00:00
|
|
|
bool mIPCOpen;
|
|
|
|
bool mDestroyed;
|
2017-04-06 21:41:24 +00:00
|
|
|
|
|
|
|
uint32_t mFontKeysDeleted;
|
|
|
|
nsDataHashtable<UnscaledFontHashKey, wr::FontKey> mFontKeys;
|
2016-11-16 13:54:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace layers
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif // mozilla_layers_WebRenderBridgeChild_h
|