summaryrefslogtreecommitdiffstats
path: root/dom/canvas/SourceSurfaceWebgl.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /dom/canvas/SourceSurfaceWebgl.h
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/SourceSurfaceWebgl.h')
-rw-r--r--dom/canvas/SourceSurfaceWebgl.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/dom/canvas/SourceSurfaceWebgl.h b/dom/canvas/SourceSurfaceWebgl.h
new file mode 100644
index 0000000000..098f11c419
--- /dev/null
+++ b/dom/canvas/SourceSurfaceWebgl.h
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#ifndef MOZILLA_GFX_SOURCESURFACEWEBGL_H_
+#define MOZILLA_GFX_SOURCESURFACEWEBGL_H_
+
+#include "mozilla/gfx/2D.h"
+#include "mozilla/WeakPtr.h"
+
+namespace mozilla::gfx {
+
+class DrawTargetWebgl;
+class SharedContextWebgl;
+class TextureHandle;
+
+// SourceSurfaceWebgl holds WebGL resources that can be used to efficiently
+// copy snapshot data between multiple DrawTargetWebgls. It also takes care
+// of copy-on-write behavior when the owner target is modified or destructs.
+class SourceSurfaceWebgl : public DataSourceSurface {
+ public:
+ MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceWebgl, override)
+
+ explicit SourceSurfaceWebgl(DrawTargetWebgl* aDT);
+ virtual ~SourceSurfaceWebgl();
+
+ SurfaceType GetType() const override { return SurfaceType::WEBGL; }
+ IntSize GetSize() const override { return mSize; }
+ SurfaceFormat GetFormat() const override { return mFormat; }
+
+ uint8_t* GetData() override;
+ int32_t Stride() override;
+
+ bool Map(MapType aType, MappedSurface* aMappedSurface) override;
+ void Unmap() override;
+
+ bool HasReadData() const { return !!mData; }
+
+ already_AddRefed<SourceSurface> ExtractSubrect(const IntRect& aRect) override;
+
+ private:
+ friend class DrawTargetWebgl;
+ friend class SharedContextWebgl;
+
+ explicit SourceSurfaceWebgl(const RefPtr<SharedContextWebgl>& aSharedContext);
+
+ bool EnsureData();
+
+ void DrawTargetWillChange(bool aNeedHandle);
+
+ void GiveTexture(RefPtr<TextureHandle> aHandle);
+
+ void SetHandle(TextureHandle* aHandle);
+
+ void OnUnlinkTexture(SharedContextWebgl* aContext);
+
+ DrawTargetWebgl* GetTarget() const { return mDT.get(); }
+
+ SurfaceFormat mFormat = SurfaceFormat::UNKNOWN;
+ IntSize mSize;
+ // Any data that has been read back from the WebGL context for mapping.
+ RefPtr<DataSourceSurface> mData;
+ // The draw target that currently owns the texture for this surface.
+ WeakPtr<DrawTargetWebgl> mDT;
+ // The actual shared context that any WebGL resources belong to.
+ WeakPtr<SharedContextWebgl> mSharedContext;
+ // If this snapshot has been copied into a cached texture handle.
+ RefPtr<TextureHandle> mHandle;
+};
+
+} // namespace mozilla::gfx
+
+#endif /* MOZILLA_GFX_SOURCESURFACEWEBGL_H_ */