зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1578380 - [Wayland] Implement WaylandDMABUFTextureClientOGL, r=sotaro
WaylandDMABufSurface is used as a backend for WaylandDMABUFTextureClientOGL. Pixel data of WaylandDMABufSurface are located at GPU memory and can be shared by processes. Differential Revision: https://phabricator.services.mozilla.com/D46836 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
6a90d39a93
Коммит
8fb3c364ae
|
@ -0,0 +1,107 @@
|
|||
/* -*- 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/. */
|
||||
|
||||
#include "WaylandDMABUFTextureClientOGL.h"
|
||||
#include "mozilla/widget/WaylandDMABufSurface.h"
|
||||
#include "gfxPlatform.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
|
||||
using namespace gfx;
|
||||
|
||||
WaylandDMABUFTextureData::WaylandDMABUFTextureData(
|
||||
WaylandDMABufSurface* aSurface, BackendType aBackend)
|
||||
: mSurface(aSurface), mBackend(aBackend) {
|
||||
MOZ_ASSERT(mSurface);
|
||||
}
|
||||
|
||||
WaylandDMABUFTextureData::~WaylandDMABUFTextureData() = default;
|
||||
|
||||
/* static */ WaylandDMABUFTextureData* WaylandDMABUFTextureData::Create(
|
||||
const IntSize& aSize, SurfaceFormat aFormat, BackendType aBackend) {
|
||||
if (aFormat != SurfaceFormat::B8G8R8A8 &&
|
||||
aFormat != SurfaceFormat::B8G8R8X8) {
|
||||
// TODO
|
||||
NS_WARNING("WaylandDMABUFTextureData::Create() - wrong surface format!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int flags = DMABUF_TEXTURE;
|
||||
if (aFormat == SurfaceFormat::B8G8R8A8) {
|
||||
flags |= DMABUF_ALPHA;
|
||||
}
|
||||
RefPtr<WaylandDMABufSurface> surf = WaylandDMABufSurface::CreateDMABufSurface(
|
||||
aSize.width, aSize.height, flags);
|
||||
return new WaylandDMABUFTextureData(surf, aBackend);
|
||||
}
|
||||
|
||||
TextureData* WaylandDMABUFTextureData::CreateSimilar(
|
||||
LayersIPCChannel* aAllocator, LayersBackend aLayersBackend,
|
||||
TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const {
|
||||
return WaylandDMABUFTextureData::Create(
|
||||
gfx::IntSize(mSurface->GetWidth(), mSurface->GetHeight()),
|
||||
mSurface->GetFormat(), mBackend);
|
||||
}
|
||||
|
||||
bool WaylandDMABUFTextureData::Serialize(SurfaceDescriptor& aOutDescriptor) {
|
||||
mSurface->Serialize(aOutDescriptor);
|
||||
return true;
|
||||
}
|
||||
|
||||
void WaylandDMABUFTextureData::FillInfo(TextureData::Info& aInfo) const {
|
||||
aInfo.size = gfx::IntSize(mSurface->GetWidth(), mSurface->GetHeight());
|
||||
aInfo.format = mSurface->GetFormat();
|
||||
aInfo.hasIntermediateBuffer = false;
|
||||
aInfo.hasSynchronization = false;
|
||||
aInfo.supportsMoz2D = true;
|
||||
aInfo.canExposeMappedData = false;
|
||||
}
|
||||
|
||||
bool WaylandDMABUFTextureData::Lock(OpenMode) {
|
||||
MOZ_ASSERT(!mSurface->IsMapped(), "Already locked?");
|
||||
mSurface->Map();
|
||||
return true;
|
||||
}
|
||||
|
||||
void WaylandDMABUFTextureData::Unlock() { mSurface->Unmap(); }
|
||||
|
||||
already_AddRefed<DataSourceSurface> WaylandDMABUFTextureData::GetAsSurface() {
|
||||
// TODO: Update for debug purposes.
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
already_AddRefed<DrawTarget> WaylandDMABUFTextureData::BorrowDrawTarget() {
|
||||
MOZ_ASSERT(mBackend != BackendType::NONE);
|
||||
if (mBackend == BackendType::NONE) {
|
||||
// shouldn't happen, but degrade gracefully
|
||||
return nullptr;
|
||||
}
|
||||
return Factory::CreateDrawTargetForData(
|
||||
mBackend, (unsigned char*)mSurface->GetMappedRegion(),
|
||||
IntSize(mSurface->GetWidth(), mSurface->GetHeight()),
|
||||
mSurface->GetMappedRegionStride(), mSurface->GetFormat(), true);
|
||||
}
|
||||
|
||||
void WaylandDMABUFTextureData::Deallocate(LayersIPCChannel*) {
|
||||
mSurface = nullptr;
|
||||
}
|
||||
|
||||
void WaylandDMABUFTextureData::Forget(LayersIPCChannel*) { mSurface = nullptr; }
|
||||
|
||||
bool WaylandDMABUFTextureData::UpdateFromSurface(gfx::SourceSurface* aSurface) {
|
||||
RefPtr<DrawTarget> dt = BorrowDrawTarget();
|
||||
if (!dt) {
|
||||
return false;
|
||||
}
|
||||
|
||||
dt->CopySurface(aSurface, IntRect(IntPoint(), aSurface->GetSize()),
|
||||
IntPoint());
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace layers
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,59 @@
|
|||
/* -*- 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_GFX_MACIOSURFACETEXTURECLIENTOGL_H
|
||||
#define MOZILLA_GFX_MACIOSURFACETEXTURECLIENTOGL_H
|
||||
|
||||
#include "mozilla/layers/TextureClientOGL.h"
|
||||
|
||||
class WaylandDMABufSurface;
|
||||
|
||||
namespace mozilla {
|
||||
namespace layers {
|
||||
|
||||
class WaylandDMABUFTextureData : public TextureData {
|
||||
public:
|
||||
static WaylandDMABUFTextureData* Create(const gfx::IntSize& aSize,
|
||||
gfx::SurfaceFormat aFormat,
|
||||
gfx::BackendType aBackend);
|
||||
~WaylandDMABUFTextureData();
|
||||
|
||||
virtual TextureData* CreateSimilar(
|
||||
LayersIPCChannel* aAllocator, LayersBackend aLayersBackend,
|
||||
TextureFlags aFlags = TextureFlags::DEFAULT,
|
||||
TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override;
|
||||
|
||||
void FillInfo(TextureData::Info& aInfo) const override;
|
||||
|
||||
bool Lock(OpenMode) override;
|
||||
|
||||
void Unlock() override;
|
||||
|
||||
already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override;
|
||||
|
||||
bool Serialize(SurfaceDescriptor& aOutDescriptor) override;
|
||||
|
||||
void Deallocate(LayersIPCChannel*) override;
|
||||
|
||||
void Forget(LayersIPCChannel*) override;
|
||||
|
||||
bool UpdateFromSurface(gfx::SourceSurface* aSurface) override;
|
||||
|
||||
// For debugging purposes only.
|
||||
already_AddRefed<gfx::DataSourceSurface> GetAsSurface();
|
||||
|
||||
protected:
|
||||
WaylandDMABUFTextureData(WaylandDMABufSurface* aSurface,
|
||||
gfx::BackendType aBackend);
|
||||
|
||||
RefPtr<WaylandDMABufSurface> mSurface;
|
||||
gfx::BackendType mBackend;
|
||||
};
|
||||
|
||||
} // namespace layers
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // MOZILLA_GFX_MACIOSURFACETEXTURECLIENTOGL_H
|
Загрузка…
Ссылка в новой задаче