aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiza Burakova <liza@chromium.org>2024-02-27 21:24:59 +0000
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-02-27 22:02:38 +0000
commit6eaaad7c6020cf648c6fd27bb3a5fd538a51f3ad (patch)
tree121c4c5b4699d03abd77583b479cbb3575afadc9
parent75c8ef1c6371b2922a6cab9687b9a53fe6674ffc (diff)
downloadangle-6eaaad7c6020cf648c6fd27bb3a5fd538a51f3ad.tar.gz
Create ImageHelper.
This CL adds a helper class ImageHelper, which acts as a wrapper on webgpu textures that will be used by TextureWgpu. Bug: angleproject:8547 Change-Id: Ia796534c9d3ff0dd24797cc483677cfcbedb1f8c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5317864 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Liza Burakova <liza@chromium.org>
-rw-r--r--src/libANGLE/renderer/wgpu/wgpu_helpers.cpp79
-rw-r--r--src/libANGLE/renderer/wgpu/wgpu_helpers.h73
-rw-r--r--src/libANGLE/renderer/wgpu/wgpu_sources.gni2
3 files changed, 154 insertions, 0 deletions
diff --git a/src/libANGLE/renderer/wgpu/wgpu_helpers.cpp b/src/libANGLE/renderer/wgpu/wgpu_helpers.cpp
new file mode 100644
index 0000000000..e7eb675a29
--- /dev/null
+++ b/src/libANGLE/renderer/wgpu/wgpu_helpers.cpp
@@ -0,0 +1,79 @@
+//
+// Copyright 2024 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "libANGLE/renderer/wgpu/wgpu_helpers.h"
+
+namespace webgpu
+{
+ImageHelper::ImageHelper() {}
+
+ImageHelper::~ImageHelper() {}
+
+angle::Result ImageHelper::initImage(wgpu::TextureUsage usage,
+ wgpu::TextureDimension dimension,
+ wgpu::Extent3D size,
+ wgpu::TextureFormat format,
+ std::uint32_t mipLevelCount,
+ std::uint32_t sampleCount,
+ std::size_t viewFormatCount)
+{
+
+ mUsage = usage;
+ mDimension = dimension;
+ mSize = size;
+ mFormat = format;
+ mMipLevelCount = mipLevelCount;
+ mSampleCount = sampleCount;
+ mViewFormatCount = viewFormatCount;
+
+ return angle::Result::Continue;
+}
+
+void ImageHelper::flushStagedUpdates(wgpu::Device device)
+{
+ wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+ wgpu::ImageCopyTexture dst;
+ for (const QueuedDataUpload &src : mBufferQueue)
+ {
+ if (src.targetLevel < mFirstAllocatedLevel ||
+ src.targetLevel >= (mFirstAllocatedLevel + mMipLevelCount))
+ {
+ continue;
+ }
+ LevelIndex targetLevelWgpu = toWgpuLevel(src.targetLevel);
+ dst.texture = mTexture;
+ dst.mipLevel = targetLevelWgpu.get();
+ encoder.CopyBufferToTexture(&src.copyBuffer, &dst, &mSize);
+ }
+}
+
+LevelIndex ImageHelper::toWgpuLevel(gl::LevelIndex levelIndexGl) const
+{
+ return gl_wgpu::getLevelIndex(levelIndexGl, mFirstAllocatedLevel);
+}
+
+gl::LevelIndex ImageHelper::toGlLevel(LevelIndex levelIndexWgpu) const
+{
+ return wgpu_gl::getLevelIndex(levelIndexWgpu, mFirstAllocatedLevel);
+}
+} // namespace webgpu
+
+namespace wgpu_gl
+{
+gl::LevelIndex getLevelIndex(webgpu::LevelIndex levelWgpu, gl::LevelIndex baseLevel)
+{
+ return gl::LevelIndex(levelWgpu.get() + baseLevel.get());
+}
+} // namespace wgpu_gl
+
+namespace gl_wgpu
+{
+webgpu::LevelIndex getLevelIndex(gl::LevelIndex levelGl, gl::LevelIndex baseLevel)
+{
+ ASSERT(baseLevel <= levelGl);
+ return webgpu::LevelIndex(levelGl.get() - baseLevel.get());
+}
+} // namespace gl_wgpu
diff --git a/src/libANGLE/renderer/wgpu/wgpu_helpers.h b/src/libANGLE/renderer/wgpu/wgpu_helpers.h
new file mode 100644
index 0000000000..f598a1e9fd
--- /dev/null
+++ b/src/libANGLE/renderer/wgpu/wgpu_helpers.h
@@ -0,0 +1,73 @@
+//
+// Copyright 2024 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#ifndef LIBANGLE_RENDERER_WGPU_WGPU_HELPERS_H_
+#define LIBANGLE_RENDERER_WGPU_WGPU_HELPERS_H_
+
+#include <dawn/webgpu_cpp.h>
+#include <stdint.h>
+
+#include "libANGLE/Error.h"
+#include "libANGLE/angletypes.h"
+
+namespace webgpu
+{
+
+// WebGPU image level index.
+using LevelIndex = gl::LevelIndexWrapper<uint32_t>;
+
+struct QueuedDataUpload
+{
+ wgpu::ImageCopyBuffer copyBuffer;
+ gl::LevelIndex targetLevel;
+};
+
+class ImageHelper
+{
+ public:
+ ImageHelper();
+ ~ImageHelper();
+
+ angle::Result initImage(wgpu::TextureUsage usage,
+ wgpu::TextureDimension dimension,
+ wgpu::Extent3D size,
+ wgpu::TextureFormat format,
+ std::uint32_t mipLevelCount,
+ std::uint32_t sampleCount,
+ std::size_t ViewFormatCount);
+
+ void flushStagedUpdates(wgpu::Device device);
+
+ LevelIndex toWgpuLevel(gl::LevelIndex levelIndexGl) const;
+ gl::LevelIndex toGlLevel(LevelIndex levelIndexWgpu) const;
+
+ private:
+ wgpu::Texture mTexture;
+ wgpu::TextureUsage mUsage;
+ wgpu::TextureDimension mDimension;
+ wgpu::Extent3D mSize;
+ wgpu::TextureFormat mFormat;
+ std::uint32_t mMipLevelCount;
+ std::uint32_t mSampleCount;
+ std::size_t mViewFormatCount;
+
+ gl::LevelIndex mFirstAllocatedLevel;
+
+ std::vector<QueuedDataUpload> mBufferQueue;
+};
+} // namespace webgpu
+
+namespace wgpu_gl
+{
+gl::LevelIndex getLevelIndex(webgpu::LevelIndex levelWgpu, gl::LevelIndex baseLevel);
+} // namespace wgpu_gl
+
+namespace gl_wgpu
+{
+webgpu::LevelIndex getLevelIndex(gl::LevelIndex levelGl, gl::LevelIndex baseLevel);
+} // namespace gl_wgpu
+
+#endif // LIBANGLE_RENDERER_WGPU_WGPU_HELPERS_H_
diff --git a/src/libANGLE/renderer/wgpu/wgpu_sources.gni b/src/libANGLE/renderer/wgpu/wgpu_sources.gni
index dd4749726a..cbc5845ac2 100644
--- a/src/libANGLE/renderer/wgpu/wgpu_sources.gni
+++ b/src/libANGLE/renderer/wgpu/wgpu_sources.gni
@@ -46,4 +46,6 @@ wgpu_backend_sources = [
"TransformFeedbackWgpu.h",
"VertexArrayWgpu.cpp",
"VertexArrayWgpu.h",
+ "wgpu_helpers.cpp",
+ "wgpu_helpers.h",
]