mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-23 21:01:08 +00:00
ddc104b332
This ensures that the Image that the client receives has the color depth information that was sent to the GPU, even though the client can't query the GPU directly. Differential Revision: https://phabricator.services.mozilla.com/D155902
105 lines
3.1 KiB
C++
105 lines
3.1 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 GFX_GPU_VIDEO_IMAGE_H
|
|
#define GFX_GPU_VIDEO_IMAGE_H
|
|
|
|
#include "mozilla/RefPtr.h"
|
|
#include "ImageContainer.h"
|
|
#include "mozilla/layers/GPUVideoTextureClient.h"
|
|
#include "mozilla/layers/CompositableClient.h"
|
|
#include "mozilla/layers/ImageBridgeChild.h"
|
|
|
|
namespace mozilla {
|
|
namespace gl {
|
|
class GLBlitHelper;
|
|
}
|
|
namespace layers {
|
|
|
|
class IGPUVideoSurfaceManager {
|
|
protected:
|
|
virtual ~IGPUVideoSurfaceManager() = default;
|
|
|
|
public:
|
|
NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
|
|
|
|
virtual already_AddRefed<gfx::SourceSurface> Readback(
|
|
const SurfaceDescriptorGPUVideo& aSD) = 0;
|
|
virtual void DeallocateSurfaceDescriptor(
|
|
const SurfaceDescriptorGPUVideo& aSD) = 0;
|
|
};
|
|
|
|
// Represents an animated Image that is known to the GPU process.
|
|
class GPUVideoImage final : public Image {
|
|
friend class gl::GLBlitHelper;
|
|
|
|
public:
|
|
GPUVideoImage(IGPUVideoSurfaceManager* aManager,
|
|
const SurfaceDescriptorGPUVideo& aSD, const gfx::IntSize& aSize,
|
|
const gfx::ColorDepth& aColorDepth)
|
|
: Image(nullptr, ImageFormat::GPU_VIDEO),
|
|
mSize(aSize),
|
|
mColorDepth(aColorDepth) {
|
|
// Create the TextureClient immediately since the GPUVideoTextureData
|
|
// is responsible for deallocating the SurfaceDescriptor.
|
|
//
|
|
// Use the RECYCLE texture flag, since it's likely that our 'real'
|
|
// TextureData (in the decoder thread of the GPU process) is using
|
|
// it too, and we want to make sure we don't send the delete message
|
|
// until we've stopped being used on the compositor.
|
|
mTextureClient = TextureClient::CreateWithData(
|
|
new GPUVideoTextureData(aManager, aSD, aSize), TextureFlags::RECYCLE,
|
|
ImageBridgeChild::GetSingleton().get());
|
|
}
|
|
|
|
virtual ~GPUVideoImage() = default;
|
|
|
|
gfx::IntSize GetSize() const override { return mSize; }
|
|
|
|
gfx::ColorDepth GetColorDepth() const override { return mColorDepth; }
|
|
|
|
Maybe<SurfaceDescriptor> GetDesc() override {
|
|
return GetDescFromTexClient(mTextureClient);
|
|
}
|
|
|
|
private:
|
|
GPUVideoTextureData* GetData() const {
|
|
if (!mTextureClient) {
|
|
return nullptr;
|
|
}
|
|
TextureData* data = mTextureClient->GetInternalData();
|
|
if (!data) {
|
|
return nullptr;
|
|
}
|
|
return data->AsGPUVideoTextureData();
|
|
}
|
|
|
|
public:
|
|
already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override {
|
|
GPUVideoTextureData* data = GetData();
|
|
if (!data) {
|
|
return nullptr;
|
|
}
|
|
return data->GetAsSourceSurface();
|
|
}
|
|
|
|
TextureClient* GetTextureClient(KnowsCompositor* aKnowsCompositor) override {
|
|
MOZ_ASSERT(aKnowsCompositor == ImageBridgeChild::GetSingleton(),
|
|
"Must only use GPUVideo on ImageBridge");
|
|
return mTextureClient;
|
|
}
|
|
|
|
private:
|
|
gfx::IntSize mSize;
|
|
gfx::ColorDepth mColorDepth;
|
|
RefPtr<TextureClient> mTextureClient;
|
|
};
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|
|
|
|
#endif // GFX_GPU_VIDEO_IMAGE_H
|