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:
parent
4f2edf576e
commit
5bed1ed838
|
@ -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));
|
||||||
|
|
||||||
if (device->IsToggleEnabled(Toggle::UseTintGenerator)) {
|
|
||||||
parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
|
parseResult->tintProgram = std::make_unique<tint::Program>(std::move(program));
|
||||||
parseResult->tintSource = std::move(tintSource);
|
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 {};
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue