Bug 1898238 - Don't call TexTypeForWebgl when initializing offscreen canvas. r=aosmond,jgilbert

This is only used if the OffscreenCanvas has a webgl context, in which
case it forwards the tex type to WebGLContext::PresentFrontBuffer(). A
later patch in this series will make TexTypeForWebgl() return a
different value depending on whether the webgl context is in-process
or remote, which is something that cannot be known when the
OffscreenCanvas is initialized. This patch therefore removes the field
from OffscreenCanvas and makes WebGLContext::PresentFrontBuffer() call
TexTypeForWebgl() itself.

Differential Revision: https://phabricator.services.mozilla.com/D211289
This commit is contained in:
Jamie Nicol
2024-07-22 20:23:37 +00:00
parent 682cb5dff9
commit 9526c88d05
8 changed files with 18 additions and 29 deletions

View File

@@ -587,8 +587,9 @@ Maybe<layers::SurfaceDescriptor> ClientWebGLContext::GetFrontBuffer(
} }
Maybe<layers::SurfaceDescriptor> ClientWebGLContext::PresentFrontBuffer( Maybe<layers::SurfaceDescriptor> ClientWebGLContext::PresentFrontBuffer(
WebGLFramebufferJS* const fb, const layers::TextureType type, bool webvr) { WebGLFramebufferJS* const fb, bool webvr) {
Present(fb, type, webvr); const auto texType = GetTexTypeForSwapChain();
Present(fb, texType, webvr);
return GetFrontBuffer(fb, webvr); return GetFrontBuffer(fb, webvr);
} }

View File

@@ -1088,8 +1088,7 @@ class ClientWebGLContext final : public nsICanvasRenderingContextInternal,
Maybe<layers::SurfaceDescriptor> GetFrontBuffer( Maybe<layers::SurfaceDescriptor> GetFrontBuffer(
WebGLFramebufferJS*, const bool webvr = false) override; WebGLFramebufferJS*, const bool webvr = false) override;
Maybe<layers::SurfaceDescriptor> PresentFrontBuffer( Maybe<layers::SurfaceDescriptor> PresentFrontBuffer(
WebGLFramebufferJS*, layers::TextureType, WebGLFramebufferJS*, const bool webvr = false) override;
const bool webvr = false) override;
RefPtr<gfx::SourceSurface> GetFrontBufferSnapshot( RefPtr<gfx::SourceSurface> GetFrontBufferSnapshot(
bool requireAlphaPremult = true) override; bool requireAlphaPremult = true) override;
already_AddRefed<layers::FwdTransactionTracker> UseCompositableForwarder( already_AddRefed<layers::FwdTransactionTracker> UseCompositableForwarder(

View File

@@ -34,13 +34,12 @@ namespace mozilla::dom {
OffscreenCanvasCloneData::OffscreenCanvasCloneData( OffscreenCanvasCloneData::OffscreenCanvasCloneData(
OffscreenCanvasDisplayHelper* aDisplay, uint32_t aWidth, uint32_t aHeight, OffscreenCanvasDisplayHelper* aDisplay, uint32_t aWidth, uint32_t aHeight,
layers::LayersBackend aCompositorBackend, layers::TextureType aTextureType, layers::LayersBackend aCompositorBackend, bool aNeutered, bool aIsWriteOnly,
bool aNeutered, bool aIsWriteOnly, nsIPrincipal* aExpandedReader) nsIPrincipal* aExpandedReader)
: mDisplay(aDisplay), : mDisplay(aDisplay),
mWidth(aWidth), mWidth(aWidth),
mHeight(aHeight), mHeight(aHeight),
mCompositorBackendType(aCompositorBackend), mCompositorBackendType(aCompositorBackend),
mTextureType(aTextureType),
mNeutered(aNeutered), mNeutered(aNeutered),
mIsWriteOnly(aIsWriteOnly), mIsWriteOnly(aIsWriteOnly),
mExpandedReader(aExpandedReader) {} mExpandedReader(aExpandedReader) {}
@@ -56,13 +55,12 @@ OffscreenCanvas::OffscreenCanvas(nsIGlobalObject* aGlobal, uint32_t aWidth,
OffscreenCanvas::OffscreenCanvas( OffscreenCanvas::OffscreenCanvas(
nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight, nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight,
layers::LayersBackend aCompositorBackend, layers::TextureType aTextureType, layers::LayersBackend aCompositorBackend,
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay) already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay)
: DOMEventTargetHelper(aGlobal), : DOMEventTargetHelper(aGlobal),
mWidth(aWidth), mWidth(aWidth),
mHeight(aHeight), mHeight(aHeight),
mCompositorBackendType(aCompositorBackend), mCompositorBackendType(aCompositorBackend),
mTextureType(aTextureType),
mDisplay(aDisplay) {} mDisplay(aDisplay) {}
OffscreenCanvas::~OffscreenCanvas() { OffscreenCanvas::~OffscreenCanvas() {
@@ -321,7 +319,7 @@ void OffscreenCanvas::DequeueCommitToCompositor() {
MOZ_ASSERT(mPendingCommit); MOZ_ASSERT(mPendingCommit);
mPendingCommit = nullptr; mPendingCommit = nullptr;
Maybe<OffscreenCanvasDisplayData> update = std::move(mPendingUpdate); Maybe<OffscreenCanvasDisplayData> update = std::move(mPendingUpdate);
mDisplay->CommitFrameToCompositor(mCurrentContext, mTextureType, update); mDisplay->CommitFrameToCompositor(mCurrentContext, update);
} }
void OffscreenCanvas::CommitFrameToCompositor() { void OffscreenCanvas::CommitFrameToCompositor() {
@@ -338,7 +336,7 @@ void OffscreenCanvas::CommitFrameToCompositor() {
} }
Maybe<OffscreenCanvasDisplayData> update = std::move(mPendingUpdate); Maybe<OffscreenCanvasDisplayData> update = std::move(mPendingUpdate);
mDisplay->CommitFrameToCompositor(mCurrentContext, mTextureType, update); mDisplay->CommitFrameToCompositor(mCurrentContext, update);
} }
UniquePtr<OffscreenCanvasCloneData> OffscreenCanvas::ToCloneData( UniquePtr<OffscreenCanvasCloneData> OffscreenCanvas::ToCloneData(
@@ -374,8 +372,8 @@ UniquePtr<OffscreenCanvasCloneData> OffscreenCanvas::ToCloneData(
} }
auto cloneData = MakeUnique<OffscreenCanvasCloneData>( auto cloneData = MakeUnique<OffscreenCanvasCloneData>(
mDisplay, mWidth, mHeight, mCompositorBackendType, mTextureType, mDisplay, mWidth, mHeight, mCompositorBackendType, mNeutered,
mNeutered, mIsWriteOnly, mExpandedReader); mIsWriteOnly, mExpandedReader);
SetNeutered(); SetNeutered();
return cloneData; return cloneData;
} }
@@ -598,7 +596,7 @@ already_AddRefed<OffscreenCanvas> OffscreenCanvas::CreateFromCloneData(
MOZ_ASSERT(aData); MOZ_ASSERT(aData);
RefPtr<OffscreenCanvas> wc = new OffscreenCanvas( RefPtr<OffscreenCanvas> wc = new OffscreenCanvas(
aGlobal, aData->mWidth, aData->mHeight, aData->mCompositorBackendType, aGlobal, aData->mWidth, aData->mHeight, aData->mCompositorBackendType,
aData->mTextureType, aData->mDisplay.forget()); aData->mDisplay.forget());
if (aData->mNeutered) { if (aData->mNeutered) {
wc->SetNeutered(); wc->SetNeutered();
} }

View File

@@ -48,15 +48,14 @@ struct OffscreenCanvasCloneData final {
OffscreenCanvasCloneData(OffscreenCanvasDisplayHelper* aDisplay, OffscreenCanvasCloneData(OffscreenCanvasDisplayHelper* aDisplay,
uint32_t aWidth, uint32_t aHeight, uint32_t aWidth, uint32_t aHeight,
layers::LayersBackend aCompositorBackend, layers::LayersBackend aCompositorBackend,
layers::TextureType aTextureType, bool aNeutered, bool aNeutered, bool aIsWriteOnly,
bool aIsWriteOnly, nsIPrincipal* aExpandedReader); nsIPrincipal* aExpandedReader);
~OffscreenCanvasCloneData(); ~OffscreenCanvasCloneData();
RefPtr<OffscreenCanvasDisplayHelper> mDisplay; RefPtr<OffscreenCanvasDisplayHelper> mDisplay;
uint32_t mWidth; uint32_t mWidth;
uint32_t mHeight; uint32_t mHeight;
layers::LayersBackend mCompositorBackendType; layers::LayersBackend mCompositorBackendType;
layers::TextureType mTextureType;
bool mNeutered; bool mNeutered;
bool mIsWriteOnly; bool mIsWriteOnly;
RefPtr<nsIPrincipal> mExpandedReader; RefPtr<nsIPrincipal> mExpandedReader;
@@ -76,7 +75,6 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
OffscreenCanvas(nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight, OffscreenCanvas(nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight,
layers::LayersBackend aCompositorBackend, layers::LayersBackend aCompositorBackend,
layers::TextureType aTextureType,
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay); already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay);
void Destroy(); void Destroy();
@@ -195,7 +193,6 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
layers::LayersBackend mCompositorBackendType = layers::LayersBackend mCompositorBackendType =
layers::LayersBackend::LAYERS_NONE; layers::LayersBackend::LAYERS_NONE;
layers::TextureType mTextureType = layers::TextureType::Unknown;
RefPtr<OffscreenCanvasDisplayHelper> mDisplay; RefPtr<OffscreenCanvasDisplayHelper> mDisplay;
RefPtr<CancelableRunnable> mPendingCommit; RefPtr<CancelableRunnable> mPendingCommit;

View File

@@ -171,7 +171,6 @@ void OffscreenCanvasDisplayHelper::FlushForDisplay() {
bool OffscreenCanvasDisplayHelper::CommitFrameToCompositor( bool OffscreenCanvasDisplayHelper::CommitFrameToCompositor(
nsICanvasRenderingContextInternal* aContext, nsICanvasRenderingContextInternal* aContext,
layers::TextureType aTextureType,
const Maybe<OffscreenCanvasDisplayData>& aData) { const Maybe<OffscreenCanvasDisplayData>& aData) {
auto endTransaction = MakeScopeExit([&]() { auto endTransaction = MakeScopeExit([&]() {
if (auto* cm = gfx::CanvasManagerChild::Get()) { if (auto* cm = gfx::CanvasManagerChild::Get()) {
@@ -242,7 +241,7 @@ bool OffscreenCanvasDisplayHelper::CommitFrameToCompositor(
aContext->OnBeforePaintTransaction(); aContext->OnBeforePaintTransaction();
} }
desc = aContext->PresentFrontBuffer(nullptr, aTextureType); desc = aContext->PresentFrontBuffer(nullptr);
if (desc) { if (desc) {
hasRemoteTextureDesc = hasRemoteTextureDesc =
desc->type() == desc->type() ==

View File

@@ -51,7 +51,6 @@ class OffscreenCanvasDisplayHelper final {
void FlushForDisplay(); void FlushForDisplay();
bool CommitFrameToCompositor(nsICanvasRenderingContextInternal* aContext, bool CommitFrameToCompositor(nsICanvasRenderingContextInternal* aContext,
layers::TextureType aTextureType,
const Maybe<OffscreenCanvasDisplayData>& aData); const Maybe<OffscreenCanvasDisplayData>& aData);
void DestroyCanvas(); void DestroyCanvas();

View File

@@ -210,8 +210,7 @@ class nsICanvasRenderingContextInternal : public nsISupports,
} }
virtual mozilla::Maybe<mozilla::layers::SurfaceDescriptor> PresentFrontBuffer( virtual mozilla::Maybe<mozilla::layers::SurfaceDescriptor> PresentFrontBuffer(
mozilla::WebGLFramebufferJS* fb, mozilla::layers::TextureType, mozilla::WebGLFramebufferJS* fb, const bool webvr = false) {
const bool webvr = false) {
return GetFrontBuffer(fb, webvr); return GetFrontBuffer(fb, webvr);
} }

View File

@@ -1039,22 +1039,19 @@ OffscreenCanvas* HTMLCanvasElement::TransferControlToOffscreen(
} }
LayersBackend backend = LayersBackend::LAYERS_NONE; LayersBackend backend = LayersBackend::LAYERS_NONE;
TextureType textureType = TextureType::Unknown;
nsIWidget* docWidget = nsContentUtils::WidgetForDocument(OwnerDoc()); nsIWidget* docWidget = nsContentUtils::WidgetForDocument(OwnerDoc());
if (docWidget) { if (docWidget) {
WindowRenderer* renderer = docWidget->GetWindowRenderer(); WindowRenderer* renderer = docWidget->GetWindowRenderer();
if (renderer) { if (renderer) {
backend = renderer->GetCompositorBackendType(); backend = renderer->GetCompositorBackendType();
textureType = TexTypeForWebgl(renderer->AsKnowsCompositor());
} }
} }
CSSIntSize sz = GetWidthHeight(); CSSIntSize sz = GetWidthHeight();
mOffscreenDisplay = mOffscreenDisplay =
MakeRefPtr<OffscreenCanvasDisplayHelper>(this, sz.width, sz.height); MakeRefPtr<OffscreenCanvasDisplayHelper>(this, sz.width, sz.height);
mOffscreenCanvas = mOffscreenCanvas = new OffscreenCanvas(win->AsGlobal(), sz.width, sz.height,
new OffscreenCanvas(win->AsGlobal(), sz.width, sz.height, backend, backend, do_AddRef(mOffscreenDisplay));
textureType, do_AddRef(mOffscreenDisplay));
if (mWriteOnly) { if (mWriteOnly) {
mOffscreenCanvas->SetWriteOnly(mExpandedReader); mOffscreenCanvas->SetWriteOnly(mExpandedReader);
} }