diff options
author | Liza Burakova <liza@chromium.org> | 2024-02-27 21:24:59 +0000 |
---|---|---|
committer | Angle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2024-02-27 22:02:38 +0000 |
commit | 6eaaad7c6020cf648c6fd27bb3a5fd538a51f3ad (patch) | |
tree | 121c4c5b4699d03abd77583b479cbb3575afadc9 | |
parent | 75c8ef1c6371b2922a6cab9687b9a53fe6674ffc (diff) | |
download | angle-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.cpp | 79 | ||||
-rw-r--r-- | src/libANGLE/renderer/wgpu/wgpu_helpers.h | 73 | ||||
-rw-r--r-- | src/libANGLE/renderer/wgpu/wgpu_sources.gni | 2 |
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", ] |