/* * Copyright (C) 2018-2024 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/utilities/arrayref.h" #include "shared/source/utilities/spinlock.h" #include "cif/common/cif_main.h" #include "ocl_igc_interface/code_type.h" #include "ocl_igc_interface/fcl_ocl_device_ctx.h" #include "ocl_igc_interface/igc_ocl_device_ctx.h" #include #include namespace NEO { enum class SipKernelType : std::uint32_t; class OsLibrary; class CompilerCache; class Device; struct TargetDevice; using specConstValuesMap = std::unordered_map; struct TranslationInput { TranslationInput(IGC::CodeType::CodeType_t srcType, IGC::CodeType::CodeType_t outType, IGC::CodeType::CodeType_t preferredIntermediateType = IGC::CodeType::undefined) : srcType(srcType), preferredIntermediateType(preferredIntermediateType), outType(outType) { } bool allowCaching = true; ArrayRef src; ArrayRef apiOptions; ArrayRef internalOptions; const char *tracingOptions = nullptr; uint32_t tracingOptionsCount = 0; IGC::CodeType::CodeType_t srcType = IGC::CodeType::invalid; IGC::CodeType::CodeType_t preferredIntermediateType = IGC::CodeType::invalid; IGC::CodeType::CodeType_t outType = IGC::CodeType::invalid; void *gtPinInput = nullptr; specConstValuesMap specializedValues; }; struct TranslationOutput { enum class ErrorCode { success = 0, compilerNotAvailable, compilationFailure, buildFailure, linkFailure, alreadyCompiled, unknownError, }; struct MemAndSize { std::unique_ptr mem; size_t size = 0; }; IGC::CodeType::CodeType_t intermediateCodeType = IGC::CodeType::invalid; MemAndSize intermediateRepresentation; MemAndSize deviceBinary; MemAndSize debugData; std::string frontendCompilerLog; std::string backendCompilerLog; template static void makeCopy(ContainerT &dst, CIF::Builtins::BufferSimple *src) { if ((nullptr == src) || (src->GetSizeRaw() == 0)) { dst.clear(); return; } dst.assign(src->GetMemory(), src->GetSize()); } static void makeCopy(MemAndSize &dst, CIF::Builtins::BufferSimple *src); }; struct SpecConstantInfo { CIF::RAII::UPtr_t idsBuffer; CIF::RAII::UPtr_t sizesBuffer; }; class CompilerInterface { public: CompilerInterface(); CompilerInterface(const CompilerInterface &) = delete; CompilerInterface &operator=(const CompilerInterface &) = delete; CompilerInterface(CompilerInterface &&) = delete; CompilerInterface &operator=(CompilerInterface &&) = delete; virtual ~CompilerInterface(); template static CompilerInterfaceT *createInstance(std::unique_ptr &&cache, bool requireFcl) { auto instance = new CompilerInterfaceT(); if (!instance->initialize(std::move(cache), requireFcl)) { delete instance; instance = nullptr; } return instance; } MOCKABLE_VIRTUAL TranslationOutput::ErrorCode build(const NEO::Device &device, const TranslationInput &input, TranslationOutput &output); MOCKABLE_VIRTUAL TranslationOutput::ErrorCode compile(const NEO::Device &device, const TranslationInput &input, TranslationOutput &output); MOCKABLE_VIRTUAL TranslationOutput::ErrorCode link(const NEO::Device &device, const TranslationInput &input, TranslationOutput &output); MOCKABLE_VIRTUAL TranslationOutput::ErrorCode getSpecConstantsInfo(const NEO::Device &device, ArrayRef srcSpirV, SpecConstantInfo &output); TranslationOutput::ErrorCode createLibrary(NEO::Device &device, const TranslationInput &input, TranslationOutput &output); MOCKABLE_VIRTUAL TranslationOutput::ErrorCode getSipKernelBinary(NEO::Device &device, SipKernelType type, std::vector &retBinary, std::vector &stateSaveAreaHeader); MOCKABLE_VIRTUAL CIF::RAII::UPtr_t getIgcFeaturesAndWorkarounds(const NEO::Device &device); bool addOptionDisableZebin(std::string &options, std::string &internalOptions); bool disableZebin(std::string &options, std::string &internalOptions); protected: MOCKABLE_VIRTUAL bool initialize(std::unique_ptr &&cache, bool requireFcl); MOCKABLE_VIRTUAL bool loadFcl(); MOCKABLE_VIRTUAL bool loadIgc(); template