| /* |
| * Copyright 2020 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "src/sksl/codegen/SkSLSPIRVtoHLSL.h" |
| |
| #if defined(SK_ENABLE_SPIRV_CROSS) |
| |
| #include "third_party/externals/spirv-cross/spirv_hlsl.hpp" |
| |
| /* |
| * This translation unit serves as a bridge between Skia/SkSL and SPIRV-Cross. |
| * Each library is built with a separate copy of spirv.h (or spirv.hpp), so we |
| * avoid conflicts by never including both in the same cpp. |
| */ |
| |
| namespace SkSL { |
| |
| bool SPIRVtoHLSL(const std::string& spirv, std::string* hlsl) { |
| spirv_cross::CompilerHLSL hlslCompiler((const uint32_t*)spirv.c_str(), |
| spirv.size() / sizeof(uint32_t)); |
| |
| spirv_cross::CompilerGLSL::Options optionsGLSL; |
| // Force all uninitialized variables to be 0, otherwise they will fail to compile |
| // by FXC. |
| optionsGLSL.force_zero_initialized_variables = true; |
| |
| spirv_cross::CompilerHLSL::Options optionsHLSL; |
| optionsHLSL.shader_model = 51; |
| // PointCoord and PointSize are not supported in HLSL |
| optionsHLSL.point_coord_compat = true; |
| optionsHLSL.point_size_compat = true; |
| |
| hlslCompiler.set_common_options(optionsGLSL); |
| hlslCompiler.set_hlsl_options(optionsHLSL); |
| hlsl->assign(hlslCompiler.compile()); |
| return true; |
| } |
| |
| } |
| |
| #else |
| |
| namespace SkSL { bool SPIRVtoHLSL(const std::string&, std::string*) { return false; } } |
| |
| #endif |