From 9e3c08db40b8916968b9f30096c7be3f00ce9647 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 21 Apr 2024 13:44:51 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- gfx/layers/DcompSurfaceImage.h | 131 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 gfx/layers/DcompSurfaceImage.h (limited to 'gfx/layers/DcompSurfaceImage.h') diff --git a/gfx/layers/DcompSurfaceImage.h b/gfx/layers/DcompSurfaceImage.h new file mode 100644 index 0000000000..c1eb412580 --- /dev/null +++ b/gfx/layers/DcompSurfaceImage.h @@ -0,0 +1,131 @@ +/* -*- Mode: C++; tab-width: 2; 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/. */ + +#ifndef GFX_LAYER_DCOMP_SURFACE_IMAGE_H +#define GFX_LAYER_DCOMP_SURFACE_IMAGE_H + +#include "ImageContainer.h" +#include "mozilla/layers/TextureClient.h" +#include "mozilla/layers/TextureHost.h" + +namespace mozilla::wr { +class DisplayListBuilder; +class TransactionBuilder; +} // namespace mozilla::wr + +namespace mozilla::layers { + +already_AddRefed CreateTextureHostDcompSurface( + const SurfaceDescriptor& aDesc, ISurfaceAllocator* aDeallocator, + LayersBackend aBackend, TextureFlags aFlags); + +/** + * A texture data wrapping a dcomp surface handle, which is provided by the + * media foundation media engine. We won't be able to control real texture data + * because that is protected by the media engine. + */ +class DcompSurfaceTexture final : public TextureData { + public: + static already_AddRefed CreateTextureClient( + HANDLE aHandle, gfx::IntSize aSize, gfx::SurfaceFormat aFormat, + KnowsCompositor* aKnowsCompositor); + + ~DcompSurfaceTexture(); + + bool Serialize(SurfaceDescriptor& aOutDescriptor) override; + void GetSubDescriptor(RemoteDecoderVideoSubDescriptor* aOutDesc) override; + void FillInfo(TextureData::Info& aInfo) const { + aInfo.size = mSize; + aInfo.supportsMoz2D = false; + aInfo.canExposeMappedData = false; + aInfo.hasSynchronization = false; + } + bool Lock(OpenMode) override { return true; } + void Unlock() override {} + void Deallocate(LayersIPCChannel* aAllocator) override {} + + private: + DcompSurfaceTexture(HANDLE aHandle, gfx::IntSize aSize, + gfx::SurfaceFormat aFormat) + : mHandle(aHandle), mSize(aSize), mFormat(aFormat) {} + + const HANDLE mHandle; + const gfx::IntSize mSize; + const gfx::SurfaceFormat mFormat; +}; + +/** + * A image data which holds a dcomp texture which is provided by the media + * foundation media engine. As the real texture is protected, it does not + * support being accessed as a source surface. + */ +class DcompSurfaceImage : public Image { + public: + DcompSurfaceImage(HANDLE aHandle, gfx::IntSize aSize, + gfx::SurfaceFormat aFormat, + KnowsCompositor* aKnowsCompositor); + virtual ~DcompSurfaceImage() = default; + + already_AddRefed GetAsSourceSurface() override { + return nullptr; + } + + gfx::IntSize GetSize() const { return mTextureClient->GetSize(); }; + + TextureClient* GetTextureClient(KnowsCompositor* aKnowsCompositor) override; + + private: + RefPtr mTextureClient; +}; + +/** + * A Texture host living in GPU process which owns a dcomp surface handle which + * is provided by the media foundation media engine. + */ +class DcompSurfaceHandleHost : public TextureHost { + public: + DcompSurfaceHandleHost(TextureFlags aFlags, + const SurfaceDescriptorDcompSurface& aDescriptor); + + gfx::SurfaceFormat GetFormat() const override { return mFormat; } + + gfx::IntSize GetSize() const override { return mSize; } + + const char* Name() override { return "DcompSurfaceHandleHost"; } + + already_AddRefed GetAsSurface() override { + return nullptr; + } + + void CreateRenderTexture( + const wr::ExternalImageId& aExternalImageId) override; + + void PushResourceUpdates( + wr::TransactionBuilder& aResources, ResourceUpdateOp aOp, + const Range& aImageKeys, + const wr::ExternalImageId& aExternalImageId) override; + + void PushDisplayItems(wr::DisplayListBuilder& aBuilder, + const wr::LayoutRect& aBounds, + const wr::LayoutRect& aClip, wr::ImageRendering aFilter, + const Range& aImageKeys, + PushDisplayItemFlagSet aFlags) override; + + bool SupportsExternalCompositing(WebRenderBackend aBackend) override { + return true; + } + + protected: + ~DcompSurfaceHandleHost(); + + // Handle will be closed automatically when `UniqueFileHandle` gets destroyed. + const mozilla::UniqueFileHandle mHandle; + const gfx::IntSize mSize; + const gfx::SurfaceFormat mFormat; +}; + +} // namespace mozilla::layers + +#endif // GFX_LAYER_DCOMP_SURFACE_IMAGE_H -- cgit v1.2.3