[WebGPU backend] Add ShaderModule
WebGPU ShaderModule doesn't compile shader on the backend.
There is no compiled backend blob cache. There is still front-end
cache for WGSL parse result.
Bug: 413053623
Change-Id: I2bfd325474e47d5a5c322e267b703ef2e566058c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/258978
Commit-Queue: Shrek Shao <shrekshao@google.com>
Reviewed-by: Gregg Tavares <gman@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/src/dawn/native/BUILD.gn b/src/dawn/native/BUILD.gn
index 30c2773..064c5de 100644
--- a/src/dawn/native/BUILD.gn
+++ b/src/dawn/native/BUILD.gn
@@ -735,6 +735,8 @@
"webgpu/PhysicalDeviceWGPU.h",
"webgpu/QueueWGPU.cpp",
"webgpu/QueueWGPU.h",
+ "webgpu/ShaderModuleWGPU.cpp",
+ "webgpu/ShaderModuleWGPU.h",
"webgpu/TextureWGPU.cpp",
"webgpu/TextureWGPU.h",
"webgpu/WebGPUError.h",
diff --git a/src/dawn/native/CMakeLists.txt b/src/dawn/native/CMakeLists.txt
index 4ff9ce8..967eac0 100644
--- a/src/dawn/native/CMakeLists.txt
+++ b/src/dawn/native/CMakeLists.txt
@@ -594,6 +594,7 @@
"webgpu/ObjectWGPU.h"
"webgpu/PhysicalDeviceWGPU.h"
"webgpu/QueueWGPU.h"
+ "webgpu/ShaderModuleWGPU.h"
"webgpu/TextureWGPU.h"
"webgpu/WebGPUError.h"
)
@@ -606,6 +607,7 @@
"webgpu/DeviceWGPU.cpp"
"webgpu/PhysicalDeviceWGPU.cpp"
"webgpu/QueueWGPU.cpp"
+ "webgpu/ShaderModuleWGPU.cpp"
"webgpu/TextureWGPU.cpp"
)
endif()
diff --git a/src/dawn/native/webgpu/DeviceWGPU.cpp b/src/dawn/native/webgpu/DeviceWGPU.cpp
index 0aedd6d..a9fc719 100644
--- a/src/dawn/native/webgpu/DeviceWGPU.cpp
+++ b/src/dawn/native/webgpu/DeviceWGPU.cpp
@@ -57,6 +57,7 @@
#include "dawn/native/webgpu/CommandBufferWGPU.h"
#include "dawn/native/webgpu/PhysicalDeviceWGPU.h"
#include "dawn/native/webgpu/QueueWGPU.h"
+#include "dawn/native/webgpu/ShaderModuleWGPU.h"
#include "dawn/native/webgpu/TextureWGPU.h"
#include "tint/tint.h"
@@ -172,7 +173,7 @@
const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
const std::vector<tint::wgsl::Extension>& internalExtensions,
ShaderModuleParseResult* parseResult) {
- return Ref<ShaderModuleBase>{nullptr};
+ return ShaderModule::Create(this, descriptor, internalExtensions, parseResult);
}
ResultOrError<Ref<SwapChainBase>> Device::CreateSwapChainImpl(Surface* surface,
SwapChainBase* previousSwapChain,
diff --git a/src/dawn/native/webgpu/ShaderModuleWGPU.cpp b/src/dawn/native/webgpu/ShaderModuleWGPU.cpp
new file mode 100644
index 0000000..894545b
--- /dev/null
+++ b/src/dawn/native/webgpu/ShaderModuleWGPU.cpp
@@ -0,0 +1,73 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "dawn/native/webgpu/ShaderModuleWGPU.h"
+
+#include <utility>
+
+#include "dawn/native/ShaderModule.h"
+#include "dawn/native/webgpu/DeviceWGPU.h"
+
+namespace dawn::native::webgpu {
+
+// static
+ResultOrError<Ref<ShaderModule>> ShaderModule::Create(
+ Device* device,
+ const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ const std::vector<tint::wgsl::Extension>& internalExtensions,
+ ShaderModuleParseResult* parseResult) {
+ Ref<ShaderModule> module = AcquireRef(new ShaderModule(device, descriptor, internalExtensions));
+ DAWN_TRY(module->Initialize(descriptor, parseResult));
+ return module;
+}
+
+ShaderModule::ShaderModule(Device* device,
+ const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ std::vector<tint::wgsl::Extension> internalExtensions)
+ : ShaderModuleBase(device, descriptor, std::move(internalExtensions)),
+ ObjectWGPU(device->wgpu.shaderModuleRelease) {}
+
+MaybeError ShaderModule::Initialize(const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ ShaderModuleParseResult* parseResult) {
+ DAWN_TRY(InitializeBase(parseResult));
+
+ if (GetCompilationMessages()->HasWarningsOrErrors()) {
+ // Cached parse result already shows it is an invalid shader.
+ // No need to create the real shader module on the backend.
+ return {};
+ }
+
+ auto desc = ToAPI(*descriptor);
+ mInnerHandle =
+ ToBackend(GetDevice())
+ ->wgpu.deviceCreateShaderModule(ToBackend(GetDevice())->GetInnerHandle(), desc);
+ DAWN_ASSERT(mInnerHandle);
+
+ return {};
+}
+
+} // namespace dawn::native::webgpu
diff --git a/src/dawn/native/webgpu/ShaderModuleWGPU.h b/src/dawn/native/webgpu/ShaderModuleWGPU.h
new file mode 100644
index 0000000..59c6b4b4
--- /dev/null
+++ b/src/dawn/native/webgpu/ShaderModuleWGPU.h
@@ -0,0 +1,60 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef SRC_DAWN_NATIVE_WEBGPU_SHADERMODULEWGPU_H_
+#define SRC_DAWN_NATIVE_WEBGPU_SHADERMODULEWGPU_H_
+
+#include <vector>
+
+#include "dawn/native/ShaderModule.h"
+#include "dawn/native/webgpu/Forward.h"
+#include "dawn/native/webgpu/ObjectWGPU.h"
+
+namespace dawn::native::webgpu {
+
+class Device;
+
+class ShaderModule final : public ShaderModuleBase, public ObjectWGPU<WGPUShaderModule> {
+ public:
+ static ResultOrError<Ref<ShaderModule>> Create(
+ Device* device,
+ const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ const std::vector<tint::wgsl::Extension>& internalExtensions,
+ ShaderModuleParseResult* parseResult);
+
+ private:
+ ShaderModule(Device* device,
+ const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ std::vector<tint::wgsl::Extension> internalExtensions);
+ ~ShaderModule() override = default;
+ MaybeError Initialize(const UnpackedPtr<ShaderModuleDescriptor>& descriptor,
+ ShaderModuleParseResult* parseResult);
+};
+
+} // namespace dawn::native::webgpu
+
+#endif // SRC_DAWN_NATIVE_WEBGPU_SHADERMODULEWGPU_H_
diff --git a/src/dawn/tests/end2end/ShaderModuleCachingTests.cpp b/src/dawn/tests/end2end/ShaderModuleCachingTests.cpp
index 5e99e65..e0b201d 100644
--- a/src/dawn/tests/end2end/ShaderModuleCachingTests.cpp
+++ b/src/dawn/tests/end2end/ShaderModuleCachingTests.cpp
@@ -167,7 +167,9 @@
OpenGLESBackend({"blob_cache_hash_validation"}),
OpenGLESBackend({}, {"blob_cache_hash_validation"}),
VulkanBackend({"blob_cache_hash_validation"}),
- VulkanBackend({}, {"blob_cache_hash_validation"}));
+ VulkanBackend({}, {"blob_cache_hash_validation"}),
+ WebGPUBackend({"blob_cache_hash_validation"}),
+ WebGPUBackend({}, {"blob_cache_hash_validation"}));
} // anonymous namespace
} // namespace dawn