|  | // Copyright 2021 The IREE Authors | 
|  | // | 
|  | // Licensed under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  |  | 
|  | #include "compiler/plugins/target/WebGPUSPIRV/SPIRVToWGSL.h" | 
|  |  | 
|  | #include "llvm/Support/Debug.h" | 
|  | #include "llvm/Support/raw_ostream.h" | 
|  | #include "tint/tint.h" | 
|  |  | 
|  | namespace mlir::iree_compiler::IREE::HAL { | 
|  |  | 
|  | std::optional<std::string> | 
|  | compileSPIRVToWGSL(llvm::ArrayRef<uint32_t> spvBinary) { | 
|  | // TODO(scotttodd): reroute to MLIR diagnostics? | 
|  | auto diagPrinter = tint::diag::Printer::create(stderr, true); | 
|  | tint::diag::Formatter diagFormatter; | 
|  |  | 
|  | // TODO(scotttodd): remove this copy (API for std::span or [uint8_t*, size]?) | 
|  | std::vector<uint32_t> binaryVector(spvBinary.size()); | 
|  | std::memcpy(binaryVector.data(), spvBinary.data(), | 
|  | spvBinary.size() * sizeof(uint32_t)); | 
|  |  | 
|  | auto program = | 
|  | std::make_unique<tint::Program>(tint::reader::spirv::Parse(binaryVector)); | 
|  | if (!program) { | 
|  | llvm::errs() << "Tint failed to parse SPIR-V program\n"; | 
|  | return std::nullopt; | 
|  | } | 
|  |  | 
|  | if (program->Diagnostics().contains_errors()) { | 
|  | llvm::errs() << "Tint reported " << program->Diagnostics().error_count() | 
|  | << " error(s) for a SPIR-V program, see diagnostics:\n"; | 
|  | diagFormatter.format(program->Diagnostics(), diagPrinter.get()); | 
|  | return std::nullopt; | 
|  | } | 
|  |  | 
|  | if (!program->IsValid()) { | 
|  | llvm::errs() << "Tint parsed an invalid SPIR-V program\n"; | 
|  | return std::nullopt; | 
|  | } | 
|  |  | 
|  | tint::writer::wgsl::Options genOptions; | 
|  | auto result = tint::writer::wgsl::Generate(program.get(), genOptions); | 
|  | if (!result.success) { | 
|  | llvm::errs() << "Tint failed to generate WGSL: " << result.error << "\n"; | 
|  | return std::nullopt; | 
|  | } | 
|  |  | 
|  | return result.wgsl; | 
|  | } | 
|  |  | 
|  | } // namespace mlir::iree_compiler::IREE::HAL |