LLVM 23.0.0git
DXContainer.cpp
Go to the documentation of this file.
1
2//===-- llvm/BinaryFormat/DXContainer.cpp - DXContainer Utils ----*- C++-*-===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains utility functions for working with DXContainers.
11//
12//===----------------------------------------------------------------------===//
13
17
18using namespace llvm;
19using namespace llvm::dxbc;
20
21#define ROOT_PARAMETER(Val, Enum) \
22 case Val: \
23 return true;
25 switch (V) {
26#include "llvm/BinaryFormat/DXContainerConstants.def"
27 }
28 return false;
29}
30
34
35#define SHADER_VISIBILITY(Val, Enum) \
36 case Val: \
37 return true;
39 switch (V) {
40#include "llvm/BinaryFormat/DXContainerConstants.def"
41 }
42 return false;
43}
44
45#define FILTER(Val, Enum) \
46 case Val: \
47 return true;
49 switch (V) {
50#include "llvm/BinaryFormat/DXContainerConstants.def"
51 }
52 return false;
53}
54
55#define TEXTURE_ADDRESS_MODE(Val, Enum) \
56 case Val: \
57 return true;
59 switch (V) {
60#include "llvm/BinaryFormat/DXContainerConstants.def"
61 }
62 return false;
63}
64
65#define COMPARISON_FUNC(Val, Enum) \
66 case Val: \
67 return true;
69 switch (V) {
70#include "llvm/BinaryFormat/DXContainerConstants.def"
71 }
72 return false;
73}
74
75#define STATIC_BORDER_COLOR(Val, Enum) \
76 case Val: \
77 return true;
79 switch (V) {
80#include "llvm/BinaryFormat/DXContainerConstants.def"
81 }
82 return false;
83}
84
85template <typename FlagT>
86static bool isValidFlags(std::underlying_type_t<FlagT> V) {
87 decltype(V) LargestValue =
88 llvm::to_underlying(FlagT::LLVM_BITMASK_LARGEST_ENUMERATOR);
89 return V < NextPowerOf2(LargestValue);
90}
91
95
99
103
107
108template <typename EnumT>
109static bool isValidEnumValue(std::underlying_type_t<EnumT> V) {
110 decltype(V) LargestValue =
111 llvm::to_underlying(EnumT::LLVM_BITMASK_LARGEST_ENUMERATOR);
112 return V <= LargestValue;
113}
114
118
122
124#define CONTAINER_PART(PartName) .Case(#PartName, PartType::PartName)
126#include "llvm/BinaryFormat/DXContainerConstants.def"
128}
129
130bool dxbc::isDebugProgramPart(PartType PT) { return PT == PartType::ILDB; }
131
132const char *dxbc::getProgramPartName(bool IsDebug) {
133 return IsDebug ? "ILDB" : "DXIL";
134}
135
137 return PartName == "DXIL" || PartName == "ILDB";
138}
139
141 static uint8_t Zeros[16] = {0};
142 return Flags > 0 || 0 != memcmp(&Digest, &Zeros, 16);
143}
144
146 constexpr EnumStringDef<SigMinPrecision> SigMinPrecisionNameDefs[] = {
147#define COMPONENT_PRECISION(Val, Enum) {{#Enum}, SigMinPrecision::Enum},
148#include "llvm/BinaryFormat/DXContainerConstants.def"
149 };
150 static constexpr auto SigMinPrecisionNames =
151 BUILD_ENUM_STRINGS(SigMinPrecisionNameDefs);
152 return EnumStrings(SigMinPrecisionNames);
153}
154
156 constexpr EnumStringDef<D3DSystemValue> D3DSystemValueNameDefs[] = {
157#define D3D_SYSTEM_VALUE(Val, Enum) {{#Enum}, D3DSystemValue::Enum},
158#include "llvm/BinaryFormat/DXContainerConstants.def"
159 };
160 static constexpr auto D3DSystemValueNames =
161 BUILD_ENUM_STRINGS(D3DSystemValueNameDefs);
162 return EnumStrings(D3DSystemValueNames);
163}
164
166 constexpr EnumStringDef<SigComponentType> SigComponentTypeDefs[] = {
167#define COMPONENT_TYPE(Val, Enum) {{#Enum}, SigComponentType::Enum},
168#include "llvm/BinaryFormat/DXContainerConstants.def"
169 };
170 static constexpr auto SigComponentTypes =
171 BUILD_ENUM_STRINGS(SigComponentTypeDefs);
172 return EnumStrings(SigComponentTypes);
173}
174
176 constexpr EnumStringDef<RootFlags> RootFlagNameDefs[] = {
177#define ROOT_SIGNATURE_FLAG(Val, Enum) {{#Enum}, RootFlags::Enum},
178#include "llvm/BinaryFormat/DXContainerConstants.def"
179 };
180 static constexpr auto RootFlagNames = BUILD_ENUM_STRINGS(RootFlagNameDefs);
181 return EnumStrings(RootFlagNames);
182}
183
185 constexpr EnumStringDef<RootDescriptorFlags> RootDescriptorFlagNameDefs[] = {
186#define ROOT_DESCRIPTOR_FLAG(Val, Enum, Flag) \
187 {{#Enum}, RootDescriptorFlags::Enum},
188#include "llvm/BinaryFormat/DXContainerConstants.def"
189 };
190 static constexpr auto RootDescriptorFlagNames =
191 BUILD_ENUM_STRINGS(RootDescriptorFlagNameDefs);
192 return EnumStrings(RootDescriptorFlagNames);
193}
194
196 constexpr EnumStringDef<DescriptorRangeFlags> DescriptorRangeFlagNameDefs[] =
197 {
198#define DESCRIPTOR_RANGE_FLAG(Val, Enum, Flag) \
199 {{#Enum}, DescriptorRangeFlags::Enum},
200#include "llvm/BinaryFormat/DXContainerConstants.def"
201 };
202 static constexpr auto DescriptorRangeFlagNames =
203 BUILD_ENUM_STRINGS(DescriptorRangeFlagNameDefs);
204 return EnumStrings(DescriptorRangeFlagNames);
205}
206
208 constexpr EnumStringDef<StaticSamplerFlags> StaticSamplerFlagNameDefs[] = {
209#define STATIC_SAMPLER_FLAG(Val, Enum, Flag) \
210 {{#Enum}, StaticSamplerFlags::Enum},
211#include "llvm/BinaryFormat/DXContainerConstants.def"
212 };
213 static constexpr auto StaticSamplerFlagNames =
214 BUILD_ENUM_STRINGS(StaticSamplerFlagNameDefs);
215 return EnumStrings(StaticSamplerFlagNames);
216}
217
219 constexpr EnumStringDef<ShaderVisibility> ShaderVisibilityValueDefs[] = {
220#define SHADER_VISIBILITY(Val, Enum) {{#Enum}, ShaderVisibility::Enum},
221#include "llvm/BinaryFormat/DXContainerConstants.def"
222 };
223 static constexpr auto ShaderVisibilityValues =
224 BUILD_ENUM_STRINGS(ShaderVisibilityValueDefs);
225 return EnumStrings(ShaderVisibilityValues);
226}
227
229 constexpr EnumStringDef<SamplerFilter> SamplerFilterNameDefs[] = {
230#define FILTER(Val, Enum) {{#Enum}, SamplerFilter::Enum},
231#include "llvm/BinaryFormat/DXContainerConstants.def"
232 };
233 static constexpr auto SamplerFilterNames =
234 BUILD_ENUM_STRINGS(SamplerFilterNameDefs);
235 return EnumStrings(SamplerFilterNames);
236}
237
239 constexpr EnumStringDef<TextureAddressMode> TextureAddressModeNameDefs[] = {
240#define TEXTURE_ADDRESS_MODE(Val, Enum) {{#Enum}, TextureAddressMode::Enum},
241#include "llvm/BinaryFormat/DXContainerConstants.def"
242 };
243 static constexpr auto TextureAddressModeNames =
244 BUILD_ENUM_STRINGS(TextureAddressModeNameDefs);
245 return EnumStrings(TextureAddressModeNames);
246}
247
249 constexpr EnumStringDef<ComparisonFunc> ComparisonFuncNameDefs[] = {
250#define COMPARISON_FUNC(Val, Enum) {{#Enum}, ComparisonFunc::Enum},
251#include "llvm/BinaryFormat/DXContainerConstants.def"
252 };
253 static constexpr auto ComparisonFuncNames =
254 BUILD_ENUM_STRINGS(ComparisonFuncNameDefs);
255 return EnumStrings(ComparisonFuncNames);
256}
257
259 constexpr EnumStringDef<StaticBorderColor> StaticBorderColorValueDefs[] = {
260#define STATIC_BORDER_COLOR(Val, Enum) {{#Enum}, StaticBorderColor::Enum},
261#include "llvm/BinaryFormat/DXContainerConstants.def"
262 };
263 static constexpr auto StaticBorderColorValues =
264 BUILD_ENUM_STRINGS(StaticBorderColorValueDefs);
265 return EnumStrings(StaticBorderColorValues);
266}
267
269 constexpr EnumStringDef<RootParameterType> RootParameterTypeDefs[] = {
270#define ROOT_PARAMETER(Val, Enum) {{#Enum}, RootParameterType::Enum},
271#include "llvm/BinaryFormat/DXContainerConstants.def"
272 };
273 static constexpr auto RootParameterTypes =
274 BUILD_ENUM_STRINGS(RootParameterTypeDefs);
275 return EnumStrings(RootParameterTypes);
276}
277
279 constexpr EnumStringDef<PSV::SemanticKind> SemanticKindNameDefs[] = {
280#define SEMANTIC_KIND(Val, Enum) {{#Enum}, PSV::SemanticKind::Enum},
281#include "llvm/BinaryFormat/DXContainerConstants.def"
282 };
283 static constexpr auto SemanticKindNames =
284 BUILD_ENUM_STRINGS(SemanticKindNameDefs);
285 return EnumStrings(SemanticKindNames);
286}
287
289 constexpr EnumStringDef<PSV::ComponentType> ComponentTypeNameDefs[] = {
290#define COMPONENT_TYPE(Val, Enum) {{#Enum}, PSV::ComponentType::Enum},
291#include "llvm/BinaryFormat/DXContainerConstants.def"
292 };
293 static constexpr auto ComponentTypeNames =
294 BUILD_ENUM_STRINGS(ComponentTypeNameDefs);
295 return EnumStrings(ComponentTypeNames);
296}
297
299 constexpr EnumStringDef<PSV::InterpolationMode> InterpolationModeNameDefs[] =
300 {
301#define INTERPOLATION_MODE(Val, Enum) {{#Enum}, PSV::InterpolationMode::Enum},
302#include "llvm/BinaryFormat/DXContainerConstants.def"
303 };
304 static constexpr auto InterpolationModeNames =
305 BUILD_ENUM_STRINGS(InterpolationModeNameDefs);
306 return EnumStrings(InterpolationModeNames);
307}
308
310 constexpr EnumStringDef<PSV::ResourceType> ResourceTypeNameDefs[] = {
311#define RESOURCE_TYPE(Val, Enum) {{#Enum}, PSV::ResourceType::Enum},
312#include "llvm/BinaryFormat/DXContainerConstants.def"
313 };
314 static constexpr auto ResourceTypeNames =
315 BUILD_ENUM_STRINGS(ResourceTypeNameDefs);
316 return EnumStrings(ResourceTypeNames);
317}
318
320 constexpr EnumStringDef<PSV::ResourceKind> ResourceKindNameDefs[] = {
321#define RESOURCE_KIND(Val, Enum) {{#Enum}, PSV::ResourceKind::Enum},
322#include "llvm/BinaryFormat/DXContainerConstants.def"
323 };
324 static constexpr auto ResourceKindNames =
325 BUILD_ENUM_STRINGS(ResourceKindNameDefs);
326 return EnumStrings(ResourceKindNames);
327}
328
330 constexpr EnumStringDef<SectionType> SectionNameDefs[] = {
331#define SOURCE_INFO_TYPE(Num, Val) {{#Val}, SourceInfo::SectionType::Val},
332#include "llvm/BinaryFormat/DXContainerConstants.def"
333 };
334 static constexpr auto SectionNames = BUILD_ENUM_STRINGS(SectionNameDefs);
336}
337
344
347 constexpr EnumStringDef<CompressionType> CompressionTypeDefs[] = {
348#define COMPRESSION_TYPE(Num, Val) \
349 {{#Val}, SourceInfo::Contents::CompressionType::Val},
350#include "llvm/BinaryFormat/DXContainerConstants.def"
351 };
352 static constexpr auto CompressionTypes =
353 BUILD_ENUM_STRINGS(CompressionTypeDefs);
354 return EnumStrings(CompressionTypes);
355}
static bool isValidEnumValue(std::underlying_type_t< EnumT > V)
static bool isValidFlags(std::underlying_type_t< FlagT > V)
#define BUILD_ENUM_STRINGS(Tab)
Definition Enum.h:120
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A switch()-like statement whose cases are string literals.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static constexpr StringLiteral SectionNames[SectionKindsNum]
LLVM_ABI EnumStrings< SemanticKind, 1 > getSemanticKinds()
LLVM_ABI EnumStrings< InterpolationMode, 1 > getInterpolationModes()
LLVM_ABI EnumStrings< ResourceKind, 1 > getResourceKinds()
LLVM_ABI EnumStrings< ComponentType, 1 > getComponentTypes()
LLVM_ABI EnumStrings< ResourceType, 1 > getResourceTypes()
LLVM_ABI bool isValidCompressionType(uint16_t V)
LLVM_ABI EnumStrings< CompressionType, 1 > getCompressionTypes()
LLVM_ABI bool isValidSectionType(uint16_t V)
LLVM_ABI StringRef getSectionName(SectionType Type)
LLVM_ABI EnumStrings< SectionType, 1 > getSectionTypes()
LLVM_ABI bool isValidShaderVisibility(uint32_t V)
LLVM_ABI PartType parsePartType(StringRef S)
LLVM_ABI bool isValidSamplerFilter(uint32_t V)
LLVM_ABI bool isValidStaticSamplerFlags(uint32_t V)
LLVM_ABI EnumStrings< TextureAddressMode, 1 > getTextureAddressModes()
LLVM_ABI EnumStrings< DescriptorRangeFlags, 1 > getDescriptorRangeFlags()
LLVM_ABI EnumStrings< RootDescriptorFlags, 1 > getRootDescriptorFlags()
LLVM_ABI bool isValidRootDesciptorFlags(uint32_t V)
LLVM_ABI EnumStrings< SigComponentType, 1 > getSigComponentTypes()
LLVM_ABI EnumStrings< D3DSystemValue, 1 > getD3DSystemValues()
LLVM_ABI bool isDebugProgramPart(PartType PT)
LLVM_ABI EnumStrings< RootParameterType, 1 > getRootParameterTypes()
LLVM_ABI bool isProgramPart(StringRef PartName)
LLVM_ABI EnumStrings< SamplerFilter, 1 > getSamplerFilters()
LLVM_ABI EnumStrings< StaticBorderColor, 1 > getStaticBorderColors()
LLVM_ABI bool isValidCompilerVersionFlags(uint32_t V)
LLVM_ABI EnumStrings< ShaderVisibility, 1 > getShaderVisibility()
LLVM_ABI EnumStrings< ComparisonFunc, 1 > getComparisonFuncs()
LLVM_ABI bool isValidDescriptorRangeFlags(uint32_t V)
LLVM_ABI bool isValidBorderColor(uint32_t V)
LLVM_ABI bool isValidComparisonFunc(uint32_t V)
LLVM_ABI bool isValidParameterType(uint32_t V)
LLVM_ABI EnumStrings< RootFlags, 1 > getRootFlags()
LLVM_ABI const char * getProgramPartName(bool IsDebug)
LLVM_ABI EnumStrings< SigMinPrecision, 1 > getSigMinPrecisions()
LLVM_ABI EnumStrings< StaticSamplerFlags, 1 > getStaticSamplerFlags()
LLVM_ABI bool isValidAddress(uint32_t V)
LLVM_ABI bool isValidRangeType(uint32_t V)
This is an optimization pass for GlobalISel generic memory operations.
EnumStrings(const EnumStringsStorage< T, NumStrs, N, StrLen > &) -> EnumStrings< T, NumStrs >
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:373
Compile-time data representation of enum entries.
Definition Enum.h:47
LLVM_ABI bool isPopulated()