diff -r 000000000000 -r 6474c204b198 gfx/layers/client/CompositableClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/layers/client/CompositableClient.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,182 @@ +/* -*- 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 "mozilla/layers/CompositableClient.h" +#include // for uint64_t, uint32_t +#include "gfxPlatform.h" // for gfxPlatform +#include "mozilla/layers/CompositableForwarder.h" +#include "mozilla/layers/TextureClient.h" // for TextureClient, etc +#include "mozilla/layers/TextureClientOGL.h" +#include "mozilla/mozalloc.h" // for operator delete, etc +#ifdef XP_WIN +#include "gfxWindowsPlatform.h" // for gfxWindowsPlatform +#include "mozilla/layers/TextureD3D11.h" +#include "mozilla/layers/TextureD3D9.h" +#endif + +using namespace mozilla::gfx; + +namespace mozilla { +namespace layers { + +/** + * IPDL actor used by CompositableClient to match with its corresponding + * CompositableHost on the compositor side. + * + * CompositableChild is owned by a CompositableClient. + */ +class CompositableChild : public PCompositableChild +{ +public: + CompositableChild() + : mCompositableClient(nullptr), mAsyncID(0) + { + MOZ_COUNT_CTOR(CompositableChild); + } + + ~CompositableChild() + { + MOZ_COUNT_DTOR(CompositableChild); + } + + virtual void ActorDestroy(ActorDestroyReason) MOZ_OVERRIDE { + if (mCompositableClient) { + mCompositableClient->mCompositableChild = nullptr; + } + } + + CompositableClient* mCompositableClient; + + uint64_t mAsyncID; +}; + +PCompositableChild* +CompositableClient::CreateIPDLActor() +{ + return new CompositableChild(); +} + +bool +CompositableClient::DestroyIPDLActor(PCompositableChild* actor) +{ + delete actor; + return true; +} + +void +CompositableClient::InitIPDLActor(PCompositableChild* aActor, uint64_t aAsyncID) +{ + MOZ_ASSERT(aActor); + CompositableChild* child = static_cast(aActor); + mCompositableChild = child; + child->mCompositableClient = this; + child->mAsyncID = aAsyncID; +} + +CompositableClient* +CompositableClient::FromIPDLActor(PCompositableChild* aActor) +{ + MOZ_ASSERT(aActor); + return static_cast(aActor)->mCompositableClient; +} + +CompositableClient::CompositableClient(CompositableForwarder* aForwarder, + TextureFlags aTextureFlags) +: mCompositableChild(nullptr) +, mForwarder(aForwarder) +, mTextureFlags(aTextureFlags) +{ + MOZ_COUNT_CTOR(CompositableClient); +} + +CompositableClient::~CompositableClient() +{ + MOZ_COUNT_DTOR(CompositableClient); + Destroy(); +} + +LayersBackend +CompositableClient::GetCompositorBackendType() const +{ + return mForwarder->GetCompositorBackendType(); +} + +void +CompositableClient::SetIPDLActor(CompositableChild* aChild) +{ + mCompositableChild = aChild; +} + +PCompositableChild* +CompositableClient::GetIPDLActor() const +{ + return mCompositableChild; +} + +bool +CompositableClient::Connect() +{ + if (!GetForwarder() || GetIPDLActor()) { + return false; + } + GetForwarder()->Connect(this); + return true; +} + +void +CompositableClient::Destroy() +{ + if (!mCompositableChild) { + return; + } + mCompositableChild->mCompositableClient = nullptr; + PCompositableChild::Send__delete__(mCompositableChild); + mCompositableChild = nullptr; +} + +uint64_t +CompositableClient::GetAsyncID() const +{ + if (mCompositableChild) { + return mCompositableChild->mAsyncID; + } + return 0; // zero is always an invalid async ID +} + +TemporaryRef +CompositableClient::CreateBufferTextureClient(SurfaceFormat aFormat, + TextureFlags aTextureFlags, + gfx::BackendType aMoz2DBackend) +{ + return TextureClient::CreateBufferTextureClient(GetForwarder(), aFormat, + aTextureFlags | mTextureFlags, + aMoz2DBackend); +} + +TemporaryRef +CompositableClient::CreateTextureClientForDrawing(SurfaceFormat aFormat, + TextureFlags aTextureFlags, + gfx::BackendType aMoz2DBackend, + const IntSize& aSizeHint) +{ + return TextureClient::CreateTextureClientForDrawing(GetForwarder(), aFormat, + aTextureFlags | mTextureFlags, + aMoz2DBackend, + aSizeHint); +} + +bool +CompositableClient::AddTextureClient(TextureClient* aClient) +{ + return aClient->InitIPDLActor(mForwarder); +} + +void +CompositableClient::OnTransaction() +{ +} + +} // namespace layers +} // namespace mozilla