More spirv-cross related removal

Bug: dawn:1036
Change-Id: Ia60c71558bd2c47a6b7148d86b8dcedfaa79ba89
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/61585
Reviewed-by: Stephen White <senorblanco@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
Austin Eng 2021-08-11 21:15:26 +00:00 committed by Dawn LUCI CQ
parent 4f2edf576e
commit 5bed1ed838
4 changed files with 9 additions and 173 deletions

View File

@ -26,13 +26,6 @@
#include "dawn_native/RenderPipeline.h" #include "dawn_native/RenderPipeline.h"
#include "dawn_native/TintUtils.h" #include "dawn_native/TintUtils.h"
#include <spirv-tools/libspirv.hpp>
#include <spirv-tools/optimizer.hpp>
// 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
// is at 3 while spirv-headers is at 4.
#undef SPV_REVISION
#include <tint/tint.h> #include <tint/tint.h>
#include <sstream> #include <sstream>
@ -400,50 +393,6 @@ namespace dawn_native {
} }
} }
MaybeError ValidateSpirv(const uint32_t* code, uint32_t codeSize) {
spvtools::SpirvTools spirvTools(SPV_ENV_VULKAN_1_1);
std::ostringstream errorStream;
errorStream << "SPIRV Validation failure:" << std::endl;
spirvTools.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;
}
});
if (!spirvTools.Validate(code, codeSize)) {
std::string disassembly;
if (spirvTools.Disassemble(std::vector<uint32_t>(code, code + codeSize),
&disassembly,
SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES |
SPV_BINARY_TO_TEXT_OPTION_INDENT)) {
errorStream << "disassembly:" << std::endl << disassembly;
}
return DAWN_VALIDATION_ERROR(errorStream.str().c_str());
}
return {};
}
ResultOrError<tint::Program> ParseWGSL(const tint::Source::File* file, ResultOrError<tint::Program> ParseWGSL(const tint::Source::File* file,
OwnedCompilationMessages* outMessages) { OwnedCompilationMessages* outMessages) {
std::ostringstream errorStream; std::ostringstream errorStream;
@ -482,21 +431,6 @@ namespace dawn_native {
return std::move(program); return std::move(program);
} }
ResultOrError<std::vector<uint32_t>> ModuleToSPIRV(const tint::Program* program) {
std::ostringstream errorStream;
errorStream << "Tint SPIR-V writer failure:" << std::endl;
tint::writer::spirv::Options options;
options.emit_vertex_point_size = true;
auto result = tint::writer::spirv::Generate(program, options);
if (!result.success) {
errorStream << "Generator: " << result.error << std::endl;
return DAWN_VALIDATION_ERROR(errorStream.str().c_str());
}
return std::move(result.spirv);
}
std::vector<uint64_t> GetBindGroupMinBufferSizes( std::vector<uint64_t> GetBindGroupMinBufferSizes(
const EntryPointMetadata::BindingGroupInfoMap& shaderBindings, const EntryPointMetadata::BindingGroupInfoMap& shaderBindings,
const BindGroupLayoutBase* layout) { const BindGroupLayoutBase* layout) {
@ -653,13 +587,6 @@ namespace dawn_native {
} }
case BindingInfoType::Sampler: case BindingInfoType::Sampler:
// Allow mismatched samplers when using SPIRV-Cross since we can't reflect
// data that's precise enough.
// TODO(dawn:571): Remove once we use Tint unconditionnally for reflection.
if (!device->IsToggleEnabled(Toggle::UseTintGenerator)) {
break;
}
if ((layoutInfo.sampler.type == wgpu::SamplerBindingType::Comparison) != if ((layoutInfo.sampler.type == wgpu::SamplerBindingType::Comparison) !=
shaderInfo.sampler.isComparison) { shaderInfo.sampler.isComparison) {
return DAWN_VALIDATION_ERROR( return DAWN_VALIDATION_ERROR(
@ -993,7 +920,7 @@ namespace dawn_native {
default; default;
bool ShaderModuleParseResult::HasParsedShader() const { bool ShaderModuleParseResult::HasParsedShader() const {
return tintProgram != nullptr || spirv.size() > 0; return tintProgram != nullptr;
} }
// TintSource is a PIMPL container for a tint::Source::File, which needs to be kept alive for as // TintSource is a PIMPL container for a tint::Source::File, which needs to be kept alive for as
@ -1059,16 +986,9 @@ namespace dawn_native {
} }
std::vector<uint32_t> spirv(spirvDesc->code, spirvDesc->code + spirvDesc->codeSize); std::vector<uint32_t> spirv(spirvDesc->code, spirvDesc->code + spirvDesc->codeSize);
if (device->IsToggleEnabled(Toggle::UseTintGenerator)) { tint::Program program;
tint::Program program; DAWN_TRY_ASSIGN(program, ParseSPIRV(spirv, outMessages));
DAWN_TRY_ASSIGN(program, ParseSPIRV(spirv, outMessages)); parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
} else {
if (device->IsValidationEnabled()) {
DAWN_TRY(ValidateSpirv(spirv.data(), spirv.size()));
}
parseResult->spirv = std::move(spirv);
}
} else if (wgslDesc) { } else if (wgslDesc) {
auto tintSource = std::make_unique<TintSource>("", wgslDesc->source); auto tintSource = std::make_unique<TintSource>("", wgslDesc->source);
@ -1080,17 +1000,8 @@ namespace dawn_native {
tint::Program program; tint::Program program;
DAWN_TRY_ASSIGN(program, ParseWGSL(&tintSource->file, outMessages)); DAWN_TRY_ASSIGN(program, ParseWGSL(&tintSource->file, outMessages));
parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
if (device->IsToggleEnabled(Toggle::UseTintGenerator)) { parseResult->tintSource = std::move(tintSource);
parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
parseResult->tintSource = std::move(tintSource);
} else {
std::vector<uint32_t> spirv;
DAWN_TRY_ASSIGN(spirv, ModuleToSPIRV(&program));
DAWN_TRY(ValidateSpirv(spirv.data(), spirv.size()));
parseResult->spirv = std::move(spirv);
}
} }
return {}; return {};
@ -1269,13 +1180,8 @@ namespace dawn_native {
a->mWgsl == b->mWgsl; a->mWgsl == b->mWgsl;
} }
const std::vector<uint32_t>& ShaderModuleBase::GetSpirv() const {
ASSERT(!GetDevice()->IsToggleEnabled(Toggle::UseTintGenerator));
return mSpirv;
}
const tint::Program* ShaderModuleBase::GetTintProgram() const { const tint::Program* ShaderModuleBase::GetTintProgram() const {
ASSERT(GetDevice()->IsToggleEnabled(Toggle::UseTintGenerator)); ASSERT(mTintProgram);
return mTintProgram.get(); return mTintProgram.get();
} }
@ -1325,60 +1231,9 @@ namespace dawn_native {
return mCompilationMessages.get(); return mCompilationMessages.get();
} }
ResultOrError<std::vector<uint32_t>> ShaderModuleBase::GeneratePullingSpirv(
const std::vector<uint32_t>& spirv,
const VertexState& vertexState,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet) const {
tint::Program program;
DAWN_TRY_ASSIGN(program, ParseSPIRV(spirv, nullptr));
return GeneratePullingSpirv(&program, vertexState, entryPoint, pullingBufferBindingSet);
}
ResultOrError<std::vector<uint32_t>> ShaderModuleBase::GeneratePullingSpirv(
const tint::Program* programIn,
const VertexState& vertexState,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet) const {
std::ostringstream errorStream;
errorStream << "Tint vertex pulling failure:" << std::endl;
tint::transform::Manager transformManager;
transformManager.Add<tint::transform::VertexPulling>();
if (GetDevice()->IsRobustnessEnabled()) {
transformManager.Add<tint::transform::BoundArrayAccessors>();
}
tint::transform::DataMap transformInputs;
AddVertexPullingTransformConfig(vertexState, entryPoint, pullingBufferBindingSet,
&transformInputs);
// A nullptr is passed in for the CompilationMessages here since this method is called
// during RenderPipeline creation, by which point the shader module's CompilationInfo
// may have already been queried.
tint::Program program;
DAWN_TRY_ASSIGN(program, RunTransforms(&transformManager, programIn, transformInputs,
nullptr, nullptr));
tint::writer::spirv::Options options;
options.emit_vertex_point_size = true;
auto result = tint::writer::spirv::Generate(&program, options);
if (!result.success) {
errorStream << "Generator: " << result.error << std::endl;
return DAWN_VALIDATION_ERROR(errorStream.str().c_str());
}
std::vector<uint32_t> spirv = std::move(result.spirv);
DAWN_TRY(ValidateSpirv(spirv.data(), spirv.size()));
return std::move(spirv);
}
MaybeError ShaderModuleBase::InitializeBase(ShaderModuleParseResult* parseResult) { MaybeError ShaderModuleBase::InitializeBase(ShaderModuleParseResult* parseResult) {
mTintProgram = std::move(parseResult->tintProgram); mTintProgram = std::move(parseResult->tintProgram);
mTintSource = std::move(parseResult->tintSource); mTintSource = std::move(parseResult->tintSource);
mSpirv = std::move(parseResult->spirv);
DAWN_TRY_ASSIGN(mEntryPoints, ReflectShaderUsingTint(GetDevice(), mTintProgram.get())); DAWN_TRY_ASSIGN(mEntryPoints, ReflectShaderUsingTint(GetDevice(), mTintProgram.get()));
return {}; return {};

View File

@ -45,10 +45,6 @@ namespace tint {
} // namespace tint } // namespace tint
namespace spirv_cross {
class Compiler;
}
namespace dawn_native { namespace dawn_native {
struct EntryPointMetadata; struct EntryPointMetadata;
@ -95,7 +91,6 @@ namespace dawn_native {
std::unique_ptr<tint::Program> tintProgram; std::unique_ptr<tint::Program> tintProgram;
std::unique_ptr<TintSource> tintSource; std::unique_ptr<TintSource> tintSource;
std::vector<uint32_t> spirv;
}; };
MaybeError ValidateShaderModuleDescriptor(DeviceBase* device, MaybeError ValidateShaderModuleDescriptor(DeviceBase* device,
@ -220,7 +215,6 @@ namespace dawn_native {
bool operator()(const ShaderModuleBase* a, const ShaderModuleBase* b) const; bool operator()(const ShaderModuleBase* a, const ShaderModuleBase* b) const;
}; };
const std::vector<uint32_t>& GetSpirv() const;
const tint::Program* GetTintProgram() const; const tint::Program* GetTintProgram() const;
void APIGetCompilationInfo(wgpu::CompilationInfoCallback callback, void* userdata); void APIGetCompilationInfo(wgpu::CompilationInfoCallback callback, void* userdata);
@ -230,18 +224,6 @@ namespace dawn_native {
OwnedCompilationMessages* GetCompilationMessages() const; OwnedCompilationMessages* GetCompilationMessages() const;
ResultOrError<std::vector<uint32_t>> GeneratePullingSpirv(
const std::vector<uint32_t>& spirv,
const VertexState& vertexState,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet) const;
ResultOrError<std::vector<uint32_t>> GeneratePullingSpirv(
const tint::Program* program,
const VertexState& vertexState,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet) const;
protected: protected:
MaybeError InitializeBase(ShaderModuleParseResult* parseResult); MaybeError InitializeBase(ShaderModuleParseResult* parseResult);
@ -254,10 +236,7 @@ namespace dawn_native {
std::vector<uint32_t> mOriginalSpirv; std::vector<uint32_t> mOriginalSpirv;
std::string mWgsl; std::string mWgsl;
// Data computed from what is in the descriptor. mSpirv is set iff !UseTintGenerator while
// mTintProgram is set iff UseTintGenerator.
EntryPointMetadataTable mEntryPoints; EntryPointMetadataTable mEntryPoints;
std::vector<uint32_t> mSpirv;
std::unique_ptr<tint::Program> mTintProgram; std::unique_ptr<tint::Program> mTintProgram;
std::unique_ptr<TintSource> mTintSource; // Keep the tint::Source::File alive std::unique_ptr<TintSource> mTintSource; // Keep the tint::Source::File alive

View File

@ -29,6 +29,7 @@
// is at 3 while spirv-headers is at 4. // is at 3 while spirv-headers is at 4.
#undef SPV_REVISION #undef SPV_REVISION
#include <tint/tint.h> #include <tint/tint.h>
#include <spirv-tools/libspirv.hpp>
#include <sstream> #include <sstream>

View File

@ -22,6 +22,7 @@
#include "dawn_native/vulkan/VulkanError.h" #include "dawn_native/vulkan/VulkanError.h"
#include <tint/tint.h> #include <tint/tint.h>
#include <spirv-tools/libspirv.hpp>
namespace dawn_native { namespace vulkan { namespace dawn_native { namespace vulkan {