Bug 1755704 - Part 2. Implement stubbed out surface related WebGPU canvas methods. r=gfx-reviewers,lsalzman

This patch hooks up the improved CanvasManagerChild::GetSnapshot method
to the WebGPU canvas context object in order to do readbacks for various
DOM facing methods such as ConvertToBlob and for Firefox Screenshots.

Differential Revision: https://phabricator.services.mozilla.com/D144309
This commit is contained in:
Andrew Osmond 2022-04-23 16:45:10 +00:00
Родитель 382feb7053
Коммит c55d373481
2 изменённых файлов: 52 добавлений и 12 удалений

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

@ -5,9 +5,11 @@
#include "mozilla/dom/WebGPUBinding.h" #include "mozilla/dom/WebGPUBinding.h"
#include "CanvasContext.h" #include "CanvasContext.h"
#include "nsDisplayList.h" #include "gfxUtils.h"
#include "LayerUserData.h" #include "LayerUserData.h"
#include "nsDisplayList.h"
#include "mozilla/dom/HTMLCanvasElement.h" #include "mozilla/dom/HTMLCanvasElement.h"
#include "mozilla/gfx/CanvasManagerChild.h"
#include "mozilla/layers/CompositableInProcessManager.h" #include "mozilla/layers/CompositableInProcessManager.h"
#include "mozilla/layers/ImageDataSerializer.h" #include "mozilla/layers/ImageDataSerializer.h"
#include "mozilla/layers/LayersSurfaces.h" #include "mozilla/layers/LayersSurfaces.h"
@ -124,5 +126,51 @@ void CanvasContext::SwapChainPresent() {
} }
} }
mozilla::UniquePtr<uint8_t[]> CanvasContext::GetImageBuffer(int32_t* aFormat) {
gfxAlphaType any;
RefPtr<gfx::SourceSurface> snapshot = GetSurfaceSnapshot(&any);
if (!snapshot) {
*aFormat = 0;
return nullptr;
}
RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
return gfxUtils::GetImageBuffer(dataSurface, /* aIsAlphaPremultiplied */ true,
aFormat);
}
NS_IMETHODIMP CanvasContext::GetInputStream(const char* aMimeType,
const nsAString& aEncoderOptions,
nsIInputStream** aStream) {
gfxAlphaType any;
RefPtr<gfx::SourceSurface> snapshot = GetSurfaceSnapshot(&any);
if (!snapshot) {
return NS_ERROR_FAILURE;
}
RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
return gfxUtils::GetInputStream(dataSurface, /* aIsAlphaPremultiplied */ true,
aMimeType, aEncoderOptions, aStream);
}
already_AddRefed<mozilla::gfx::SourceSurface> CanvasContext::GetSurfaceSnapshot(
gfxAlphaType* aOutAlphaType) {
if (aOutAlphaType) {
*aOutAlphaType = gfxAlphaType::Premult;
}
auto* const cm = gfx::CanvasManagerChild::Get();
if (!cm) {
return nullptr;
}
if (!mBridge || !mBridge->IsOpen() || !mHandle) {
return nullptr;
}
return cm->GetSnapshot(cm->Id(), mBridge->Id(), mHandle, mGfxFormat,
/* aPremultiply */ false, /* aYFlip */ false);
}
} // namespace webgpu } // namespace webgpu
} // namespace mozilla } // namespace mozilla

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

@ -54,20 +54,12 @@ class CanvasContext final : public nsICanvasRenderingContextInternal,
return NS_OK; return NS_OK;
} }
mozilla::UniquePtr<uint8_t[]> GetImageBuffer(int32_t* aFormat) override { mozilla::UniquePtr<uint8_t[]> GetImageBuffer(int32_t* aFormat) override;
MOZ_CRASH("todo");
}
NS_IMETHOD GetInputStream(const char* aMimeType, NS_IMETHOD GetInputStream(const char* aMimeType,
const nsAString& aEncoderOptions, const nsAString& aEncoderOptions,
nsIInputStream** aStream) override { nsIInputStream** aStream) override;
*aStream = nullptr;
return NS_ERROR_NOT_IMPLEMENTED;
}
already_AddRefed<mozilla::gfx::SourceSurface> GetSurfaceSnapshot( already_AddRefed<mozilla::gfx::SourceSurface> GetSurfaceSnapshot(
gfxAlphaType* aOutAlphaType) override { gfxAlphaType* aOutAlphaType) override;
return nullptr;
}
void SetOpaqueValueFromOpaqueAttr(bool aOpaqueAttrValue) override {} void SetOpaqueValueFromOpaqueAttr(bool aOpaqueAttrValue) override {}
bool GetIsOpaque() override { return true; } bool GetIsOpaque() override { return true; }