in Source/Core/ShaderConductor.cpp [1216:1254]
Compiler::ResultDesc Compiler::Link(const LinkDesc& modules, const Compiler::Options& options, const TargetDesc& target)
{
auto linker = Dxcompiler::Instance().CreateLinker();
IFTPTR(linker);
auto* library = Dxcompiler::Instance().Library();
std::vector<std::wstring> moduleNames(modules.numModules);
std::vector<const wchar_t*> moduleNamesUtf16(modules.numModules);
std::vector<CComPtr<IDxcBlobEncoding>> moduleBlobs(modules.numModules);
for (uint32_t i = 0; i < modules.numModules; ++i)
{
IFTARG(modules.modules[i] != nullptr);
IFT(library->CreateBlobWithEncodingOnHeapCopy(modules.modules[i]->target.Data(), modules.modules[i]->target.Size(), CP_UTF8,
&moduleBlobs[i]));
IFTARG(moduleBlobs[i]->GetBufferSize() >= 4);
Unicode::UTF8ToUTF16String(modules.modules[i]->name, &moduleNames[i]);
moduleNamesUtf16[i] = moduleNames[i].c_str();
IFT(linker->RegisterLibrary(moduleNamesUtf16[i], moduleBlobs[i]));
}
std::wstring entryPointUtf16;
Unicode::UTF8ToUTF16String(modules.entryPoint, &entryPointUtf16);
const std::wstring shaderProfile = ShaderProfileName(modules.stage, options.shaderModel);
CComPtr<IDxcOperationResult> linkResult;
IFT(linker->Link(entryPointUtf16.c_str(), shaderProfile.c_str(), moduleNamesUtf16.data(),
static_cast<UINT32>(moduleNamesUtf16.size()), nullptr, 0, &linkResult));
Compiler::ResultDesc binaryResult{};
ConvertDxcResult(binaryResult, linkResult, ShadingLanguage::Dxil, false);
Compiler::SourceDesc source{};
source.entryPoint = modules.entryPoint;
source.stage = modules.stage;
return ConvertBinary(binaryResult, source, options, target);
}