blob: 8f63bf0380c5a8344925cc936bf2ce91002c7821 [file] [log] [blame]
/*
* 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