//===-- llvm/BinaryFormat/DXContainer.cpp - DXContainer Utils ----*- C++-*-===// // // Part of the LLVM Project, 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 // //===----------------------------------------------------------------------===// // // This file contains utility functions for working with DXContainers. // //===----------------------------------------------------------------------===// #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ScopedPrinter.h" using namespace llvm; using namespace llvm::dxbc; #define ROOT_PARAMETER(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidParameterType(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } bool llvm::dxbc::isValidRangeType(uint32_t V) { return V <= llvm::to_underlying(dxil::ResourceClass::LastEntry); } #define SHADER_VISIBILITY(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidShaderVisibility(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } #define FILTER(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidSamplerFilter(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } #define TEXTURE_ADDRESS_MODE(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidAddress(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } #define COMPARISON_FUNC(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidComparisonFunc(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } #define STATIC_BORDER_COLOR(Val, Enum) \ case Val: \ return true; bool llvm::dxbc::isValidBorderColor(uint32_t V) { switch (V) { #include "llvm/BinaryFormat/DXContainerConstants.def" } return false; } template static bool isValidFlags(std::underlying_type_t V) { decltype(V) LargestValue = llvm::to_underlying(FlagT::LLVM_BITMASK_LARGEST_ENUMERATOR); return V < NextPowerOf2(LargestValue); } bool llvm::dxbc::isValidRootDesciptorFlags(uint32_t V) { return isValidFlags(V); } bool llvm::dxbc::isValidDescriptorRangeFlags(uint32_t V) { return isValidFlags(V); } bool llvm::dxbc::isValidStaticSamplerFlags(uint32_t V) { return isValidFlags(V); } bool llvm::dxbc::isValidCompilerVersionFlags(uint32_t V) { return isValidFlags(V); } template static bool isValidEnumValue(std::underlying_type_t V) { decltype(V) LargestValue = llvm::to_underlying(EnumT::LLVM_BITMASK_LARGEST_ENUMERATOR); return V <= LargestValue; } bool llvm::dxbc::SourceInfo::Contents::isValidCompressionType(uint16_t V) { return isValidEnumValue(V); } bool SourceInfo::isValidSectionType(uint16_t V) { return isValidEnumValue(V); } dxbc::PartType dxbc::parsePartType(StringRef S) { #define CONTAINER_PART(PartName) .Case(#PartName, PartType::PartName) return StringSwitch(S) #include "llvm/BinaryFormat/DXContainerConstants.def" .Default(dxbc::PartType::Unknown); } bool dxbc::isDebugProgramPart(PartType PT) { return PT == PartType::ILDB; } const char *dxbc::getProgramPartName(bool IsDebug) { return IsDebug ? "ILDB" : "DXIL"; } bool dxbc::isProgramPart(StringRef PartName) { return PartName == "DXIL" || PartName == "ILDB"; } bool ShaderHash::isPopulated() { static uint8_t Zeros[16] = {0}; return Flags > 0 || 0 != memcmp(&Digest, &Zeros, 16); } EnumStrings dxbc::getSigMinPrecisions() { constexpr EnumStringDef SigMinPrecisionNameDefs[] = { #define COMPONENT_PRECISION(Val, Enum) {{#Enum}, SigMinPrecision::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto SigMinPrecisionNames = BUILD_ENUM_STRINGS(SigMinPrecisionNameDefs); return EnumStrings(SigMinPrecisionNames); } EnumStrings dxbc::getD3DSystemValues() { constexpr EnumStringDef D3DSystemValueNameDefs[] = { #define D3D_SYSTEM_VALUE(Val, Enum) {{#Enum}, D3DSystemValue::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto D3DSystemValueNames = BUILD_ENUM_STRINGS(D3DSystemValueNameDefs); return EnumStrings(D3DSystemValueNames); } EnumStrings dxbc::getSigComponentTypes() { constexpr EnumStringDef SigComponentTypeDefs[] = { #define COMPONENT_TYPE(Val, Enum) {{#Enum}, SigComponentType::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto SigComponentTypes = BUILD_ENUM_STRINGS(SigComponentTypeDefs); return EnumStrings(SigComponentTypes); } EnumStrings dxbc::getRootFlags() { constexpr EnumStringDef RootFlagNameDefs[] = { #define ROOT_SIGNATURE_FLAG(Val, Enum) {{#Enum}, RootFlags::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto RootFlagNames = BUILD_ENUM_STRINGS(RootFlagNameDefs); return EnumStrings(RootFlagNames); } EnumStrings dxbc::getRootDescriptorFlags() { constexpr EnumStringDef RootDescriptorFlagNameDefs[] = { #define ROOT_DESCRIPTOR_FLAG(Val, Enum, Flag) \ {{#Enum}, RootDescriptorFlags::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto RootDescriptorFlagNames = BUILD_ENUM_STRINGS(RootDescriptorFlagNameDefs); return EnumStrings(RootDescriptorFlagNames); } EnumStrings dxbc::getDescriptorRangeFlags() { constexpr EnumStringDef DescriptorRangeFlagNameDefs[] = { #define DESCRIPTOR_RANGE_FLAG(Val, Enum, Flag) \ {{#Enum}, DescriptorRangeFlags::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto DescriptorRangeFlagNames = BUILD_ENUM_STRINGS(DescriptorRangeFlagNameDefs); return EnumStrings(DescriptorRangeFlagNames); } EnumStrings dxbc::getStaticSamplerFlags() { constexpr EnumStringDef StaticSamplerFlagNameDefs[] = { #define STATIC_SAMPLER_FLAG(Val, Enum, Flag) \ {{#Enum}, StaticSamplerFlags::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto StaticSamplerFlagNames = BUILD_ENUM_STRINGS(StaticSamplerFlagNameDefs); return EnumStrings(StaticSamplerFlagNames); } EnumStrings dxbc::getShaderVisibility() { constexpr EnumStringDef ShaderVisibilityValueDefs[] = { #define SHADER_VISIBILITY(Val, Enum) {{#Enum}, ShaderVisibility::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto ShaderVisibilityValues = BUILD_ENUM_STRINGS(ShaderVisibilityValueDefs); return EnumStrings(ShaderVisibilityValues); } EnumStrings dxbc::getSamplerFilters() { constexpr EnumStringDef SamplerFilterNameDefs[] = { #define FILTER(Val, Enum) {{#Enum}, SamplerFilter::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto SamplerFilterNames = BUILD_ENUM_STRINGS(SamplerFilterNameDefs); return EnumStrings(SamplerFilterNames); } EnumStrings dxbc::getTextureAddressModes() { constexpr EnumStringDef TextureAddressModeNameDefs[] = { #define TEXTURE_ADDRESS_MODE(Val, Enum) {{#Enum}, TextureAddressMode::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto TextureAddressModeNames = BUILD_ENUM_STRINGS(TextureAddressModeNameDefs); return EnumStrings(TextureAddressModeNames); } EnumStrings dxbc::getComparisonFuncs() { constexpr EnumStringDef ComparisonFuncNameDefs[] = { #define COMPARISON_FUNC(Val, Enum) {{#Enum}, ComparisonFunc::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto ComparisonFuncNames = BUILD_ENUM_STRINGS(ComparisonFuncNameDefs); return EnumStrings(ComparisonFuncNames); } EnumStrings dxbc::getStaticBorderColors() { constexpr EnumStringDef StaticBorderColorValueDefs[] = { #define STATIC_BORDER_COLOR(Val, Enum) {{#Enum}, StaticBorderColor::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto StaticBorderColorValues = BUILD_ENUM_STRINGS(StaticBorderColorValueDefs); return EnumStrings(StaticBorderColorValues); } EnumStrings dxbc::getRootParameterTypes() { constexpr EnumStringDef RootParameterTypeDefs[] = { #define ROOT_PARAMETER(Val, Enum) {{#Enum}, RootParameterType::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto RootParameterTypes = BUILD_ENUM_STRINGS(RootParameterTypeDefs); return EnumStrings(RootParameterTypes); } EnumStrings PSV::getSemanticKinds() { constexpr EnumStringDef SemanticKindNameDefs[] = { #define SEMANTIC_KIND(Val, Enum) {{#Enum}, PSV::SemanticKind::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto SemanticKindNames = BUILD_ENUM_STRINGS(SemanticKindNameDefs); return EnumStrings(SemanticKindNames); } EnumStrings PSV::getComponentTypes() { constexpr EnumStringDef ComponentTypeNameDefs[] = { #define COMPONENT_TYPE(Val, Enum) {{#Enum}, PSV::ComponentType::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto ComponentTypeNames = BUILD_ENUM_STRINGS(ComponentTypeNameDefs); return EnumStrings(ComponentTypeNames); } EnumStrings PSV::getInterpolationModes() { constexpr EnumStringDef InterpolationModeNameDefs[] = { #define INTERPOLATION_MODE(Val, Enum) {{#Enum}, PSV::InterpolationMode::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto InterpolationModeNames = BUILD_ENUM_STRINGS(InterpolationModeNameDefs); return EnumStrings(InterpolationModeNames); } EnumStrings PSV::getResourceTypes() { constexpr EnumStringDef ResourceTypeNameDefs[] = { #define RESOURCE_TYPE(Val, Enum) {{#Enum}, PSV::ResourceType::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto ResourceTypeNames = BUILD_ENUM_STRINGS(ResourceTypeNameDefs); return EnumStrings(ResourceTypeNames); } EnumStrings PSV::getResourceKinds() { constexpr EnumStringDef ResourceKindNameDefs[] = { #define RESOURCE_KIND(Val, Enum) {{#Enum}, PSV::ResourceKind::Enum}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto ResourceKindNames = BUILD_ENUM_STRINGS(ResourceKindNameDefs); return EnumStrings(ResourceKindNames); } EnumStrings SourceInfo::getSectionTypes() { constexpr EnumStringDef SectionNameDefs[] = { #define SOURCE_INFO_TYPE(Num, Val) {{#Val}, SourceInfo::SectionType::Val}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto SectionNames = BUILD_ENUM_STRINGS(SectionNameDefs); return EnumStrings(SectionNames); } StringRef SourceInfo::getSectionName(SourceInfo::SectionType Type) { auto V = to_underlying(Type); if (!isValidSectionType(V)) return StringRef(); return getSectionTypes()[V].name(); } EnumStrings SourceInfo::Contents::getCompressionTypes() { constexpr EnumStringDef CompressionTypeDefs[] = { #define COMPRESSION_TYPE(Num, Val) \ {{#Val}, SourceInfo::Contents::CompressionType::Val}, #include "llvm/BinaryFormat/DXContainerConstants.def" }; static constexpr auto CompressionTypes = BUILD_ENUM_STRINGS(CompressionTypeDefs); return EnumStrings(CompressionTypes); }