Bug 1736177 - Part 6. Refactor WebRender display list building integration. r=kvark,jgilbert

This patch separates out new helper methods that are shared with the
OffscreenCanvas display integration in a later part in this series.
It also standardizes on SupportsWeakPtr/WeakPtr instead of mixing in C++
standard library versions.

Differential Revision: https://phabricator.services.mozilla.com/D130782
This commit is contained in:
Andrew Osmond 2021-12-10 02:57:53 +00:00
Родитель 95bd091ded
Коммит 8298ac607c
11 изменённых файлов: 60 добавлений и 46 удалений

Просмотреть файл

@ -840,6 +840,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D)
}
}
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D)
@ -1497,13 +1498,6 @@ bool CanvasRenderingContext2D::TryBasicTarget(
return true;
}
ClientWebGLContext* CanvasRenderingContext2D::AsWebgl() {
if (mBufferProvider) {
return mBufferProvider->AsWebgl();
}
return nullptr;
}
PresShell* CanvasRenderingContext2D::GetPresShell() {
if (mCanvasElement) {
return mCanvasElement->OwnerDoc()->GetPresShell();
@ -5418,7 +5412,7 @@ bool CanvasRenderingContext2D::UpdateWebRenderCanvasData(
if (!mResetLayer && renderer) {
CanvasRendererData data;
data.mContext = mSharedPtrPtr;
data.mContext = this;
data.mSize = GetSize();
if (renderer->IsDataValid(data)) {
@ -5441,7 +5435,7 @@ bool CanvasRenderingContext2D::UpdateWebRenderCanvasData(
bool CanvasRenderingContext2D::InitializeCanvasRenderer(
nsDisplayListBuilder* aBuilder, CanvasRenderer* aRenderer) {
CanvasRendererData data;
data.mContext = mSharedPtrPtr;
data.mContext = this;
data.mSize = GetSize();
data.mIsOpaque = mOpaque;
data.mDoPaintCallbacks = true;

Просмотреть файл

@ -621,8 +621,6 @@ class CanvasRenderingContext2D final : public nsICanvasRenderingContextInternal,
bool TryBasicTarget(RefPtr<gfx::DrawTarget>& aOutDT,
RefPtr<layers::PersistentBufferProvider>& aOutProvider);
ClientWebGLContext* AsWebgl() override;
void RegisterAllocation();
void SetInitialState();

Просмотреть файл

@ -384,6 +384,12 @@ Maybe<layers::SurfaceDescriptor> ClientWebGLContext::GetFrontBuffer(
return ret;
}
Maybe<layers::SurfaceDescriptor> ClientWebGLContext::PresentFrontBuffer(
WebGLFramebufferJS* const fb, const layers::TextureType type, bool webvr) {
Present(fb, type, webvr);
return GetFrontBuffer(fb, webvr);
}
void ClientWebGLContext::ClearVRSwapChain() { Run<RPROC(ClearVRSwapChain)>(); }
// -
@ -414,7 +420,7 @@ bool ClientWebGLContext::InitializeCanvasRenderer(
if (IsContextLost()) return false;
layers::CanvasRendererData data;
data.mContext = mSharedPtrPtr;
data.mContext = this;
data.mOriginPos = gl::OriginPos::BottomLeft;
const auto& options = *mInitialOptions;

Просмотреть файл

@ -691,8 +691,7 @@ struct TexImageSourceAdapter final : public TexImageSource {
* Base class for all IDL implementations of WebGLContext
*/
class ClientWebGLContext final : public nsICanvasRenderingContextInternal,
public nsWrapperCache,
public SupportsWeakPtr {
public nsWrapperCache {
friend class webgl::AvailabilityRunnable;
friend class webgl::ObjectJS;
friend class webgl::ProgramKeepAlive;
@ -778,7 +777,6 @@ class ClientWebGLContext final : public nsICanvasRenderingContextInternal,
void MarkContextClean() override {}
void OnBeforePaintTransaction() override;
ClientWebGLContext* AsWebgl() override { return this; }
mozilla::dom::WebGLChild* GetChild() const {
if (!mNotLost) return nullptr;
@ -1008,8 +1006,11 @@ class ClientWebGLContext final : public nsICanvasRenderingContextInternal,
void Present(WebGLFramebufferJS*, layers::TextureType,
const bool webvr = false);
Maybe<layers::SurfaceDescriptor> GetFrontBuffer(WebGLFramebufferJS*,
const bool webvr = false);
Maybe<layers::SurfaceDescriptor> GetFrontBuffer(
WebGLFramebufferJS*, const bool webvr = false) override;
Maybe<layers::SurfaceDescriptor> PresentFrontBuffer(
WebGLFramebufferJS*, layers::TextureType,
const bool webvr = false) override;
RefPtr<gfx::SourceSurface> GetFrontBufferSnapshot(
bool requireAlphaPremult = true) override;

Просмотреть файл

@ -269,8 +269,8 @@ bool ImageBitmapRenderingContext::IsContextCleanForFrameCapture() {
NS_IMPL_CYCLE_COLLECTING_ADDREF(ImageBitmapRenderingContext)
NS_IMPL_CYCLE_COLLECTING_RELEASE(ImageBitmapRenderingContext)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ImageBitmapRenderingContext,
mCanvasElement, mOffscreenCanvas)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WEAK_PTR(ImageBitmapRenderingContext,
mCanvasElement, mOffscreenCanvas)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ImageBitmapRenderingContext)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY

Просмотреть файл

@ -9,9 +9,8 @@
#include "mozilla/PresShell.h"
#include "nsRefreshDriver.h"
nsICanvasRenderingContextInternal::nsICanvasRenderingContextInternal()
: mSharedPtrPtr(
std::make_shared<nsICanvasRenderingContextInternal*>(this)) {}
nsICanvasRenderingContextInternal::nsICanvasRenderingContextInternal() =
default;
nsICanvasRenderingContextInternal::~nsICanvasRenderingContextInternal() =
default;

Просмотреть файл

@ -6,8 +6,6 @@
#ifndef nsICanvasRenderingContextInternal_h___
#define nsICanvasRenderingContextInternal_h___
#include <memory>
#include "gfxRect.h"
#include "mozilla/gfx/2D.h"
#include "nsISupports.h"
@ -16,9 +14,12 @@
#include "nsRefreshObservers.h"
#include "mozilla/dom/HTMLCanvasElement.h"
#include "mozilla/dom/OffscreenCanvas.h"
#include "mozilla/Maybe.h"
#include "mozilla/RefPtr.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/NotNull.h"
#include "mozilla/WeakPtr.h"
#include "mozilla/layers/LayersSurfaces.h"
#define NS_ICANVASRENDERINGCONTEXTINTERNAL_IID \
{ \
@ -34,6 +35,7 @@ namespace mozilla {
class nsDisplayListBuilder;
class ClientWebGLContext;
class PresShell;
class WebGLFramebufferJS;
namespace layers {
class CanvasRenderer;
class CompositableHandle;
@ -50,14 +52,11 @@ class SourceSurface;
} // namespace mozilla
class nsICanvasRenderingContextInternal : public nsISupports,
public mozilla::SupportsWeakPtr,
public nsAPostRefreshObserver {
public:
using CanvasRenderer = mozilla::layers::CanvasRenderer;
using Layer = mozilla::layers::Layer;
using LayerManager = mozilla::layers::LayerManager;
using WebRenderCanvasData = mozilla::layers::WebRenderCanvasData;
using CompositableHandle = mozilla::layers::CompositableHandle;
using LayerTransactionChild = mozilla::layers::LayerTransactionChild;
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICANVASRENDERINGCONTEXTINTERNAL_IID)
@ -143,11 +142,13 @@ class nsICanvasRenderingContextInternal : public nsISupports,
virtual already_AddRefed<mozilla::layers::Image> GetAsImage() {
return nullptr;
}
virtual bool UpdateWebRenderCanvasData(
mozilla::nsDisplayListBuilder* aBuilder,
WebRenderCanvasData* aCanvasData) {
return false;
}
virtual bool InitializeCanvasRenderer(mozilla::nsDisplayListBuilder* aBuilder,
CanvasRenderer* aRenderer) {
return false;
@ -188,10 +189,21 @@ class nsICanvasRenderingContextInternal : public nsISupports,
virtual void OnBeforePaintTransaction() {}
virtual void OnDidPaintTransaction() {}
virtual mozilla::layers::PersistentBufferProvider* GetBufferProvider() {
return nullptr;
}
virtual mozilla::ClientWebGLContext* AsWebgl() { return nullptr; }
virtual mozilla::Maybe<mozilla::layers::SurfaceDescriptor> GetFrontBuffer(
mozilla::WebGLFramebufferJS*, const bool webvr = false) {
return mozilla::Nothing();
}
virtual mozilla::Maybe<mozilla::layers::SurfaceDescriptor> PresentFrontBuffer(
mozilla::WebGLFramebufferJS* fb, mozilla::layers::TextureType,
const bool webvr = false) {
return GetFrontBuffer(fb, webvr);
}
//
// shmem support
@ -207,9 +219,6 @@ class nsICanvasRenderingContextInternal : public nsISupports,
RefPtr<mozilla::dom::HTMLCanvasElement> mCanvasElement;
RefPtr<mozilla::dom::OffscreenCanvas> mOffscreenCanvas;
RefPtr<nsRefreshDriver> mRefreshDriver;
public:
const std::shared_ptr<nsICanvasRenderingContextInternal* const> mSharedPtrPtr;
};
NS_DEFINE_STATIC_IID_ACCESSOR(nsICanvasRenderingContextInternal,

Просмотреть файл

@ -21,8 +21,9 @@ namespace webgpu {
NS_IMPL_CYCLE_COLLECTING_ADDREF(CanvasContext)
NS_IMPL_CYCLE_COLLECTING_RELEASE(CanvasContext)
GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(CanvasContext, mTexture, mBridge,
mCanvasElement, mOffscreenCanvas)
GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WEAK_PTR(CanvasContext, mTexture,
mBridge, mCanvasElement,
mOffscreenCanvas)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CanvasContext)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY

Просмотреть файл

@ -71,6 +71,19 @@ class ObjectBase : public nsWrapperCache {
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(T)
#define GPU_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WEAK_PTR(T, ...) \
NS_IMPL_CYCLE_COLLECTION_CLASS(T) \
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(T) \
tmp->Cleanup(); \
NS_IMPL_CYCLE_COLLECTION_UNLINK(__VA_ARGS__) \
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR \
NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(T) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(__VA_ARGS__) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(T)
#define GPU_IMPL_CYCLE_COLLECTION(T, ...) \
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(T, AddRef) \
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(T, Release) \

Просмотреть файл

@ -20,8 +20,7 @@
#include "mozilla/mozalloc.h" // for operator delete, etc
#include "mozilla/WeakPtr.h" // for WeakPtr
#include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc
class nsICanvasRenderingContextInternal;
#include "nsICanvasRenderingContextInternal.h"
namespace mozilla {
namespace layers {
@ -36,8 +35,7 @@ struct CanvasRendererData final {
CanvasRendererData();
~CanvasRendererData();
std::weak_ptr<nsICanvasRenderingContextInternal* const>
mContext; // weak_ptr to ptr (bug 1635644)
WeakPtr<nsICanvasRenderingContextInternal> mContext;
// The size of the canvas content
gfx::IntSize mSize = {0, 0};
@ -49,9 +47,7 @@ struct CanvasRendererData final {
gl::OriginPos mOriginPos = gl::OriginPos::TopLeft;
nsICanvasRenderingContextInternal* GetContext() const {
const auto ptrToPtr = mContext.lock();
if (!ptrToPtr) return nullptr;
return *ptrToPtr;
return mContext.get();
}
};

Просмотреть файл

@ -117,8 +117,6 @@ void ShareableCanvasRenderer::UpdateCompositableClient() {
const auto context = mData.GetContext();
if (!context) return;
const auto& provider = context->GetBufferProvider();
const auto webgl = context->AsWebgl();
const auto& forwarder = GetForwarder();
// -
@ -134,9 +132,8 @@ void ShareableCanvasRenderer::UpdateCompositableClient() {
// -
const auto fnGetExistingTc = [&]() -> RefPtr<TextureClient> {
if (webgl) {
const auto desc = webgl->GetFrontBuffer(nullptr);
if (!desc) return nullptr;
const auto desc = context->GetFrontBuffer(nullptr);
if (desc) {
return GetFrontBufferFromDesc(*desc, flags);
}
if (provider) {