blob: 9eaf75cd256c4feb0608a9e94c7a64fce0c89247 [file]
//===-- 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 <typename FlagT>
static bool isValidFlags(std::underlying_type_t<FlagT> 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<dxbc::RootDescriptorFlags>(V);
}
bool llvm::dxbc::isValidDescriptorRangeFlags(uint32_t V) {
return isValidFlags<dxbc::DescriptorRangeFlags>(V);
}
bool llvm::dxbc::isValidStaticSamplerFlags(uint32_t V) {
return isValidFlags<dxbc::StaticSamplerFlags>(V);
}
bool llvm::dxbc::isValidCompilerVersionFlags(uint32_t V) {
return isValidFlags<dxbc::CompilerVersionFlags>(V);
}
template <typename EnumT>
static bool isValidEnumValue(std::underlying_type_t<EnumT> 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<CompressionType>(V);
}
bool SourceInfo::isValidSectionType(uint16_t V) {
return isValidEnumValue<SourceInfo::SectionType>(V);
}
dxbc::PartType dxbc::parsePartType(StringRef S) {
#define CONTAINER_PART(PartName) .Case(#PartName, PartType::PartName)
return StringSwitch<dxbc::PartType>(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<SigMinPrecision> dxbc::getSigMinPrecisions() {
constexpr EnumStringDef<SigMinPrecision> 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<D3DSystemValue> dxbc::getD3DSystemValues() {
constexpr EnumStringDef<D3DSystemValue> 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<SigComponentType> dxbc::getSigComponentTypes() {
constexpr EnumStringDef<SigComponentType> 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<RootFlags> dxbc::getRootFlags() {
constexpr EnumStringDef<RootFlags> 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<RootDescriptorFlags> dxbc::getRootDescriptorFlags() {
constexpr EnumStringDef<RootDescriptorFlags> 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<DescriptorRangeFlags> dxbc::getDescriptorRangeFlags() {
constexpr EnumStringDef<DescriptorRangeFlags> 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<StaticSamplerFlags> dxbc::getStaticSamplerFlags() {
constexpr EnumStringDef<StaticSamplerFlags> 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<ShaderVisibility> dxbc::getShaderVisibility() {
constexpr EnumStringDef<ShaderVisibility> 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<SamplerFilter> dxbc::getSamplerFilters() {
constexpr EnumStringDef<SamplerFilter> 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<TextureAddressMode> dxbc::getTextureAddressModes() {
constexpr EnumStringDef<TextureAddressMode> 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<ComparisonFunc> dxbc::getComparisonFuncs() {
constexpr EnumStringDef<ComparisonFunc> 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<StaticBorderColor> dxbc::getStaticBorderColors() {
constexpr EnumStringDef<StaticBorderColor> 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<RootParameterType> dxbc::getRootParameterTypes() {
constexpr EnumStringDef<RootParameterType> 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::SemanticKind> PSV::getSemanticKinds() {
constexpr EnumStringDef<PSV::SemanticKind> 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::ComponentType> PSV::getComponentTypes() {
constexpr EnumStringDef<PSV::ComponentType> 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::InterpolationMode> PSV::getInterpolationModes() {
constexpr EnumStringDef<PSV::InterpolationMode> 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::ResourceType> PSV::getResourceTypes() {
constexpr EnumStringDef<PSV::ResourceType> 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::ResourceKind> PSV::getResourceKinds() {
constexpr EnumStringDef<PSV::ResourceKind> 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::SectionType> SourceInfo::getSectionTypes() {
constexpr EnumStringDef<SectionType> 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::CompressionType>
SourceInfo::Contents::getCompressionTypes() {
constexpr EnumStringDef<CompressionType> 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);
}