Files
tubestation/gfx/layers/ipc/LayersSurfaces.ipdlh
Lee Salzman 1d18f4b2f5 Bug 1938053 - Accelerate canvas drawImage of a WebGL context. r=aosmond
Accelerated Canvas2D and WebGL both live within the GPU process and run within
the same thread. We want to avoid any kind of readbacks from the GPU process
to the content process when doing a drawImage of a WebGL context to an AC2D
canvas.

To achieve this, we pause the AC2D recording translation with an AwaitTranslationSync
event identified by a sync-id. Then we send a request over IPDL to snapshot the
WebGL context while this pause is ongoing via a SnapshotExternalCanvas IPDL message,
which uses the sync-id to identify the snapshot safely in a table of such external
snapshots and force translation to resume. Finally, we send a ResolveExternalSnapshot
event within the recording stream to lookup the snapshot based on the sync-id and
assign it an alias that can be used within the recording stream playback for drawImage.

The sync-id mechanism acts as a sequenced fence so that multiple SnapshotExternalCanvas
requests can be encountered simultaneously from IPDL without confusing the recording
playback.

Differential Revision: https://phabricator.services.mozilla.com/D243399
2025-04-15 16:44:20 +00:00

233 lines
6.4 KiB
Plaintext

/* 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 "gfxipc/ShadowLayerUtils.h";
include "mozilla/GfxMessageUtils.h";
include "mozilla/layers/LayersMessageUtils.h";
include "mozilla/layers/WebRenderMessageUtils.h";
using gfxPoint from "gfxPoint.h";
using nsIntRegion from "nsRegion.h";
using mozilla::StereoMode from "ImageTypes.h";
using struct mozilla::null_t from "mozilla/ipc/IPCCore.h";
using mozilla::WindowsHandle from "mozilla/ipc/IPCTypes.h";
using mozilla::gfx::YUVColorSpace from "mozilla/gfx/Types.h";
using mozilla::gfx::ChromaSubsampling from "mozilla/gfx/Types.h";
using mozilla::gfx::ColorDepth from "mozilla/gfx/Types.h";
using mozilla::gfx::ColorRange from "mozilla/gfx/Types.h";
using mozilla::gfx::ColorSpace2 from "mozilla/gfx/Types.h";
using mozilla::gfx::TransferFunction from "mozilla/gfx/Types.h";
using mozilla::gfx::SurfaceFormat from "mozilla/gfx/Types.h";
using mozilla::gfx::IntRect from "mozilla/gfx/Rect.h";
using mozilla::gfx::IntSize from "mozilla/gfx/Point.h";
using mozilla::gfx::Matrix4x4 from "mozilla/gfx/Matrix.h";
[RefCounted] using mozilla::gfx::FileHandleWrapper from "mozilla/gfx/FileHandleWrapper.h";
using gfxImageFormat from "gfxTypes.h";
using mozilla::layers::MaybeVideoBridgeSource from "mozilla/layers/VideoBridgeUtils.h";
using mozilla::layers::RemoteTextureId from "mozilla/layers/LayersTypes.h";
using mozilla::layers::RemoteTextureOwnerId from "mozilla/layers/LayersTypes.h";
[RefCounted] using mozilla::layers::GpuFence from "mozilla/layers/GpuFence.h";
using mozilla::layers::GpuProcessTextureId from "mozilla/layers/LayersTypes.h";
using mozilla::layers::CompositeProcessFencesHolderId from "mozilla/layers/LayersTypes.h";
using mozilla::wr::ExternalImageSource from "mozilla/webrender/WebRenderTypes.h";
using mozilla::wr::ExternalImageId from "mozilla/webrender/WebRenderTypes.h";
using mozilla::layers::SurfaceDescriptorRemoteDecoderId from "mozilla/layers/LayersTypes.h";
[MoveOnly] using mozilla::ipc::ReadOnlySharedMemoryHandle from "mozilla/ipc/SharedMemoryHandle.h";
namespace mozilla {
namespace layers {
[Comparable] struct SurfaceDescriptorD3D10 {
nullable FileHandleWrapper handle;
GpuProcessTextureId? gpuProcessTextureId;
uint32_t arrayIndex;
SurfaceFormat format;
IntSize size;
ColorSpace2 colorSpace;
ColorRange colorRange;
bool hasKeyedMutex;
CompositeProcessFencesHolderId? fencesHolderId;
};
[Comparable] struct SurfaceDescriptorDXGIYCbCr {
nullable FileHandleWrapper handleY;
nullable FileHandleWrapper handleCb;
nullable FileHandleWrapper handleCr;
IntSize size;
IntSize sizeY;
IntSize sizeCbCr;
ColorDepth colorDepth;
YUVColorSpace yUVColorSpace;
ColorRange colorRange;
CompositeProcessFencesHolderId fencesHolderId;
};
[Comparable] struct SurfaceDescriptorMacIOSurface {
uint32_t surfaceId;
bool isOpaque;
YUVColorSpace yUVColorSpace;
nullable GpuFence gpuFence;
};
[Comparable] struct SurfaceDescriptorDMABuf {
uint32_t bufferType;
uint32_t fourccFormat;
uint64_t[] modifier;
uint32_t flags;
FileHandleWrapper[] fds;
uint32_t[] width;
uint32_t[] height;
uint32_t[] widthAligned;
uint32_t[] heightAligned;
uint32_t[] format;
uint32_t[] strides;
uint32_t[] offsets;
YUVColorSpace yUVColorSpace;
ColorRange colorRange;
ColorSpace2 colorPrimaries;
TransferFunction transferFunction;
FileHandleWrapper[] fence;
uint32_t uid;
FileDescriptor[] refCount;
nullable FileHandleWrapper semaphoreFd;
};
[Comparable] struct SurfaceTextureDescriptor {
uint64_t handle;
IntSize size;
SurfaceFormat format;
bool continuous;
bool forceBT709ColorSpace;
Matrix4x4? transformOverride;
};
[Comparable] struct SurfaceDescriptorAndroidHardwareBuffer {
uint64_t bufferId;
IntSize size;
SurfaceFormat format;
};
[Comparable] struct EGLImageDescriptor {
uintptr_t image; // `EGLImage` is a `void*`.
uintptr_t fence;
IntSize size;
bool hasAlpha;
};
[Comparable] struct SurfaceDescriptorSharedGLTexture {
uint32_t texture;
uint32_t target;
uintptr_t fence;
IntSize size;
bool hasAlpha;
};
[Comparable] struct SurfaceDescriptorDcompSurface {
FileDescriptor handle;
IntSize size;
SurfaceFormat format;
};
[Comparable] union RemoteDecoderVideoSubDescriptor {
SurfaceDescriptorD3D10;
SurfaceDescriptorDXGIYCbCr;
SurfaceDescriptorDMABuf;
SurfaceDescriptorMacIOSurface;
SurfaceDescriptorDcompSurface;
null_t;
};
[Comparable] struct SurfaceDescriptorRemoteDecoder {
uint64_t handle;
RemoteDecoderVideoSubDescriptor subdesc;
MaybeVideoBridgeSource source;
SurfaceDescriptorRemoteDecoderId id;
};
[Comparable] union SurfaceDescriptorGPUVideo {
SurfaceDescriptorRemoteDecoder;
};
[Comparable] struct RGBDescriptor {
IntSize size;
SurfaceFormat format;
};
[Comparable] struct YCbCrDescriptor {
IntRect display;
IntSize ySize;
uint32_t yStride;
IntSize cbCrSize;
uint32_t cbCrStride;
uint32_t yOffset;
uint32_t cbOffset;
uint32_t crOffset;
StereoMode stereoMode;
ColorDepth colorDepth;
YUVColorSpace yUVColorSpace;
ColorRange colorRange;
ChromaSubsampling chromaSubsampling;
};
[Comparable] union BufferDescriptor {
RGBDescriptor;
YCbCrDescriptor;
};
[Comparable] union MemoryOrShmem {
uintptr_t;
Shmem;
};
[Comparable] struct SurfaceDescriptorBuffer {
BufferDescriptor desc;
MemoryOrShmem data;
};
struct SurfaceDescriptorShared
{
IntSize size;
int32_t stride;
SurfaceFormat format;
ReadOnlySharedMemoryHandle handle;
};
[Comparable] struct SurfaceDescriptorExternalImage
{
ExternalImageSource source;
ExternalImageId id;
};
[Comparable] struct SurfaceDescriptorRemoteTexture {
RemoteTextureId textureId;
RemoteTextureOwnerId ownerId;
};
[Comparable] struct SurfaceDescriptorCanvasSurface {
uint32_t managerId;
int32_t canvasId;
uintptr_t surfaceId;
};
[Comparable] union SurfaceDescriptor {
SurfaceDescriptorBuffer;
SurfaceDescriptorD3D10;
SurfaceDescriptorDXGIYCbCr;
SurfaceDescriptorDMABuf;
SurfaceTextureDescriptor;
SurfaceDescriptorAndroidHardwareBuffer;
EGLImageDescriptor;
SurfaceDescriptorMacIOSurface;
SurfaceDescriptorSharedGLTexture;
SurfaceDescriptorGPUVideo;
SurfaceDescriptorRemoteTexture;
SurfaceDescriptorDcompSurface;
SurfaceDescriptorExternalImage;
SurfaceDescriptorCanvasSurface;
null_t;
};
} // namespace
} // namespace