Files
sousa-gecko/gfx/layers/CanvasRenderer.cpp
T
Emilio Cobos Álvarez 02d691fdef Bug 2054311 - Sort includes in gfx/. r=gfx-reviewers,gw
Autogenerated with:

    cp dom/.clang-format gfx/ && mach format gfx/**.{cpp,h,mm}

Manual changes:

    * OSVRSession headers are not system headers and they are not
      standalone / rely on stdint, so tweaked to preserve previous
      ordering.
    * Missing include in GLDefs.h
    * Missing include in gfxOTSUtils.
    * Need to keep the windows header order in DCLayerTree.
    * missing hb_font include in MockScaledFont.h

Differential Revision: https://phabricator.services.mozilla.com/D311695
2026-07-13 09:51:18 +00:00

141 lines
3.7 KiB
C++

/* 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 "CanvasRenderer.h"
#include "BuildConstants.h"
#include "PersistentBufferProvider.h"
#include "WebGLTypes.h"
#include "ipc/KnowsCompositor.h"
#include "mozilla/StaticPrefs_webgl.h"
#include "mozilla/gfx/gfxVars.h"
#include "nsICanvasRenderingContextInternal.h"
#ifdef MOZ_WIDGET_GTK
# include "mozilla/widget/DMABufDevice.h"
# include "mozilla/widget/DMABufSurface.h"
#endif
namespace mozilla {
namespace layers {
CanvasRendererData::CanvasRendererData() = default;
CanvasRendererData::~CanvasRendererData() = default;
// -
BorrowedSourceSurface::BorrowedSourceSurface(
PersistentBufferProvider* const returnTo,
const RefPtr<gfx::SourceSurface> surf)
: mReturnTo(returnTo), mSurf(surf) {}
BorrowedSourceSurface::~BorrowedSourceSurface() {
if (mReturnTo) {
auto forgettable = mSurf;
mReturnTo->ReturnSnapshot(forgettable.forget());
}
}
// -
CanvasRenderer::CanvasRenderer() { MOZ_COUNT_CTOR(CanvasRenderer); }
CanvasRenderer::~CanvasRenderer() { MOZ_COUNT_DTOR(CanvasRenderer); }
void CanvasRenderer::Initialize(const CanvasRendererData& aData) {
mData = aData;
}
bool CanvasRenderer::IsDataValid(const CanvasRendererData& aData) const {
return mData.GetContext() == aData.GetContext();
}
std::shared_ptr<BorrowedSourceSurface> CanvasRenderer::BorrowSnapshot(
const bool requireAlphaPremult) const {
const auto context = mData.GetContext();
if (!context) return nullptr;
RefPtr<PersistentBufferProvider> provider = context->GetBufferProvider();
RefPtr<gfx::SourceSurface> ss;
if (provider) {
ss = provider->BorrowSnapshot();
}
if (!ss) {
provider = nullptr;
ss = context->GetFrontBufferSnapshot(requireAlphaPremult);
}
if (!ss) return nullptr;
return std::make_shared<BorrowedSourceSurface>(provider, ss);
}
void CanvasRenderer::FirePreTransactionCallback() const {
if (!mData.mDoPaintCallbacks) return;
const auto context = mData.GetContext();
if (!context) return;
context->OnBeforePaintTransaction();
}
void CanvasRenderer::FireDidTransactionCallback() const {
if (!mData.mDoPaintCallbacks) return;
const auto context = mData.GetContext();
if (!context) return;
context->OnDidPaintTransaction();
}
TextureType TexTypeForWebgl(KnowsCompositor* const knowsCompositor,
bool aIsWebglOop) {
if (!knowsCompositor) return TextureType::Unknown;
const auto layersBackend = knowsCompositor->GetCompositorBackendType();
switch (layersBackend) {
case LayersBackend::LAYERS_LAST:
MOZ_CRASH("Unexpected LayersBackend::LAYERS_LAST");
case LayersBackend::LAYERS_NONE:
return TextureType::Unknown;
case LayersBackend::LAYERS_WR:
break;
}
if (kIsWindows) {
if (knowsCompositor->SupportsD3D11()) {
return TextureType::D3D11;
}
}
if (kIsMacOS) {
return TextureType::MacIOSurface;
}
#ifdef MOZ_WIDGET_GTK
if (kIsLinux) {
if (!knowsCompositor->UsingSoftwareWebRender() &&
widget::DMABufDevice::IsDMABufWebGLEnabled()) {
return TextureType::DMABUF;
}
}
#endif
if (kIsAndroid) {
// EGLimages cannot be shared cross-process, so only use if webgl is
// out-of-process.
if (aIsWebglOop && StaticPrefs::webgl_enable_egl_image()) {
return TextureType::EGLImage;
}
if (gfx::gfxVars::UseAHardwareBufferSharedSurfaceWebglOop()) {
return TextureType::AndroidHardwareBuffer;
}
if (StaticPrefs::webgl_enable_surface_texture()) {
return TextureType::AndroidNativeWindow;
}
}
return TextureType::Unknown;
}
} // namespace layers
} // namespace mozilla