Wrap all uses of SPIRV-Cross in #define.
Put all cross-platform code references to Spirv-Cross behind
ifdef DAWN_USE_SPIRV_CROSS. Hide build dependencies behind
dawn_use_spirv_cross, which itself is set from dawn_enable_opengl,
since it is the only backend which is still using SPIRV-Cross.
Bug: dawn:1036
Change-Id: Id61512230b50a32c63827a16fece40d7899968d8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/61400
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/scripts/dawn_features.gni b/scripts/dawn_features.gni
index ac9531c..f3be9a9 100644
--- a/scripts/dawn_features.gni
+++ b/scripts/dawn_features.gni
@@ -104,5 +104,9 @@
dawn_supports_glfw_for_windowing =
(is_win && !dawn_is_winuwp) || (is_linux && !is_chromeos) || is_mac
-# Much of the backend code is shared, so define a convenience var.
+# Much of the GL backend code is shared, so define a convenience var.
dawn_enable_opengl = dawn_enable_opengles || dawn_enable_desktop_gl
+
+# The GL backends are the last to use SPIRV-Cross, so only compile it in
+# if they are enabled.
+dawn_use_spirv_cross = dawn_enable_opengl
diff --git a/src/common/BUILD.gn b/src/common/BUILD.gn
index afaa18f..ebb7018 100644
--- a/src/common/BUILD.gn
+++ b/src/common/BUILD.gn
@@ -85,6 +85,10 @@
defines += [ "DAWN_USE_X11" ]
}
+ if (dawn_use_spirv_cross) {
+ defines += [ "DAWN_USE_SPIRV_CROSS" ]
+ }
+
if (dawn_enable_error_injection) {
defines += [ "DAWN_ENABLE_ERROR_INJECTION" ]
}
diff --git a/src/dawn_native/BUILD.gn b/src/dawn_native/BUILD.gn
index f73bfe2..27731a5 100644
--- a/src/dawn_native/BUILD.gn
+++ b/src/dawn_native/BUILD.gn
@@ -145,11 +145,13 @@
":dawn_native_headers",
":dawn_native_utils_gen",
"${dawn_root}/src/common",
- "${dawn_root}/third_party/gn/spirv_cross:spirv_cross",
"${dawn_spirv_tools_dir}:spvtools_opt",
"${dawn_spirv_tools_dir}:spvtools_val",
"${dawn_tint_dir}/src:libtint",
]
+ if (dawn_use_spirv_cross) {
+ deps += [ "${dawn_root}/third_party/gn/spirv_cross:spirv_cross" ]
+ }
defines = []
libs = []
data_deps = []
@@ -282,8 +284,6 @@
"Sampler.h",
"ShaderModule.cpp",
"ShaderModule.h",
- "SpirvUtils.cpp",
- "SpirvUtils.h",
"StagingBuffer.cpp",
"StagingBuffer.h",
"Subresource.cpp",
@@ -313,6 +313,13 @@
]
}
+ if (dawn_use_spirv_cross) {
+ sources += [
+ "SpirvUtils.cpp",
+ "SpirvUtils.h",
+ ]
+ }
+
# Only win32 app needs to link with user32.lib
# In UWP, all availiable APIs are defined in WindowsApp.lib
if (is_win && !dawn_is_winuwp) {
diff --git a/src/dawn_native/ShaderModule.cpp b/src/dawn_native/ShaderModule.cpp
index 9db81ed..87af445 100644
--- a/src/dawn_native/ShaderModule.cpp
+++ b/src/dawn_native/ShaderModule.cpp
@@ -24,12 +24,16 @@
#include "dawn_native/Pipeline.h"
#include "dawn_native/PipelineLayout.h"
#include "dawn_native/RenderPipeline.h"
-#include "dawn_native/SpirvUtils.h"
+#if defined(DAWN_USE_SPIRV_CROSS)
+# include "dawn_native/SpirvUtils.h"
+#endif
#include "dawn_native/TintUtils.h"
#include <spirv-tools/libspirv.hpp>
#include <spirv-tools/optimizer.hpp>
-#include <spirv_cross.hpp>
+#if defined(DAWN_USE_SPIRV_CROSS)
+# include <spirv_cross.hpp>
+#endif
// Tint include must be after spirv_cross.hpp, because spirv-cross has its own
// version of spirv_headers. We also need to undef SPV_REVISION because SPIRV-Cross
@@ -529,44 +533,6 @@
return requiredBufferSizes;
}
- ResultOrError<std::vector<uint32_t>> RunRobustBufferAccessPass(
- const std::vector<uint32_t>& spirv) {
- spvtools::Optimizer opt(SPV_ENV_VULKAN_1_1);
-
- std::ostringstream errorStream;
- errorStream << "SPIRV Optimizer failure:" << std::endl;
- opt.SetMessageConsumer([&errorStream](spv_message_level_t level, const char*,
- const spv_position_t& position,
- const char* message) {
- switch (level) {
- case SPV_MSG_FATAL:
- case SPV_MSG_INTERNAL_ERROR:
- case SPV_MSG_ERROR:
- errorStream << "error: line " << position.index << ": " << message
- << std::endl;
- break;
- case SPV_MSG_WARNING:
- errorStream << "warning: line " << position.index << ": " << message
- << std::endl;
- break;
- case SPV_MSG_INFO:
- errorStream << "info: line " << position.index << ": " << message
- << std::endl;
- break;
- default:
- break;
- }
- });
- opt.RegisterPass(spvtools::CreateGraphicsRobustAccessPass());
-
- std::vector<uint32_t> result;
- if (!opt.Run(spirv.data(), spirv.size(), &result, spvtools::ValidatorOptions(),
- false)) {
- return DAWN_VALIDATION_ERROR(errorStream.str().c_str());
- }
- return std::move(result);
- }
-
MaybeError ValidateCompatibilityWithBindGroupLayout(DeviceBase* device,
BindGroupIndex group,
const EntryPointMetadata& entryPoint,
@@ -713,6 +679,7 @@
return {};
}
+#if defined(DAWN_USE_SPIRV_CROSS)
ResultOrError<std::unique_ptr<EntryPointMetadata>> ExtractSpirvInfo(
const DeviceBase* device,
const spirv_cross::Compiler& compiler,
@@ -956,6 +923,7 @@
return {std::move(metadata)};
}
+#endif
ResultOrError<EntryPointMetadataTable> ReflectShaderUsingTint(
DeviceBase*,
@@ -1656,21 +1624,11 @@
mTintSource = std::move(parseResult->tintSource);
mSpirv = std::move(parseResult->spirv);
- if (GetDevice()->IsToggleEnabled(Toggle::UseTintGenerator)) {
- DAWN_TRY_ASSIGN(mEntryPoints, ReflectShaderUsingTint(GetDevice(), mTintProgram.get()));
- } else {
- // If not using Tint to generate backend code, run the robust buffer access pass now
- // since all backends will use this SPIR-V. If Tint is used, the robustness pass should
- // be run per-backend.
- if (GetDevice()->IsRobustnessEnabled()) {
- DAWN_TRY_ASSIGN(mSpirv, RunRobustBufferAccessPass(mSpirv));
- }
- DAWN_TRY_ASSIGN(mEntryPoints, ReflectShaderUsingSPIRVCross(GetDevice(), mSpirv));
- }
-
+ DAWN_TRY_ASSIGN(mEntryPoints, ReflectShaderUsingTint(GetDevice(), mTintProgram.get()));
return {};
}
+#if defined(DAWN_USE_SPIRV_CROSS)
ResultOrError<EntryPointMetadataTable> ShaderModuleBase::ReflectShaderUsingSPIRVCross(
DeviceBase* device,
const std::vector<uint32_t>& spirv) {
@@ -1688,6 +1646,7 @@
}
return std::move(result);
}
+#endif
size_t PipelineLayoutEntryPointPairHashFunc::operator()(
const PipelineLayoutEntryPointPair& pair) const {
diff --git a/src/dawn_native/ShaderModule.h b/src/dawn_native/ShaderModule.h
index c8ad650..7d92c42 100644
--- a/src/dawn_native/ShaderModule.h
+++ b/src/dawn_native/ShaderModule.h
@@ -240,9 +240,11 @@
protected:
MaybeError InitializeBase(ShaderModuleParseResult* parseResult);
+#if defined(DAWN_USE_SPIRV_CROSS)
static ResultOrError<EntryPointMetadataTable> ReflectShaderUsingSPIRVCross(
DeviceBase* device,
const std::vector<uint32_t>& spirv);
+#endif
private:
ShaderModuleBase(DeviceBase* device, ObjectBase::ErrorTag tag);
diff --git a/src/dawn_native/SpirvUtils.h b/src/dawn_native/SpirvUtils.h
index ff356df..3719794 100644
--- a/src/dawn_native/SpirvUtils.h
+++ b/src/dawn_native/SpirvUtils.h
@@ -18,6 +18,10 @@
#ifndef DAWNNATIVE_SPIRV_UTILS_H_
#define DAWNNATIVE_SPIRV_UTILS_H_
+#if !defined(DAWN_USE_SPIRV_CROSS)
+# error "SpirvCross.h should not be included if dawn_use_spirv_cross is false"
+#endif
+
#include "dawn_native/Format.h"
#include "dawn_native/PerStage.h"
#include "dawn_native/VertexFormat.h"
diff --git a/src/dawn_native/null/DeviceNull.cpp b/src/dawn_native/null/DeviceNull.cpp
index 06945e4..6baad31 100644
--- a/src/dawn_native/null/DeviceNull.cpp
+++ b/src/dawn_native/null/DeviceNull.cpp
@@ -20,8 +20,6 @@
#include "dawn_native/Instance.h"
#include "dawn_native/Surface.h"
-#include <spirv_cross.hpp>
-
namespace dawn_native { namespace null {
// Implementation of pre-Device objects: the null adapter, null backend connection and Connect()