mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-16 14:55:47 +00:00
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:
parent
0c1c095564
commit
01bdbad6ac
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user