|
13 | 13 | #include "llvm/Frontend/HLSL/HLSLRootSignatureUtils.h"
|
14 | 14 | #include "llvm/ADT/SmallString.h"
|
15 | 15 | #include "llvm/ADT/bit.h"
|
16 |
| -#include "llvm/IR/IRBuilder.h" |
17 |
| -#include "llvm/IR/Metadata.h" |
18 | 16 | #include "llvm/Support/ScopedPrinter.h"
|
19 | 17 |
|
20 | 18 | namespace llvm {
|
@@ -210,8 +208,7 @@ raw_ostream &operator<<(raw_ostream &OS, const StaticSampler &Sampler) {
|
210 | 208 | namespace {
|
211 | 209 |
|
212 | 210 | // We use the OverloadVisit with std::visit to ensure the compiler catches if a
|
213 |
| -// new RootElement variant type is added but it's operator<< or metadata |
214 |
| -// generation isn't handled. |
| 211 | +// new RootElement variant type is added but it's operator<< isn't handled. |
215 | 212 | template <class... Ts> struct OverloadedVisit : Ts... {
|
216 | 213 | using Ts::operator()...;
|
217 | 214 | };
|
@@ -244,151 +241,6 @@ void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements) {
|
244 | 241 | OS << "}";
|
245 | 242 | }
|
246 | 243 |
|
247 |
| -MDNode *MetadataBuilder::BuildRootSignature() { |
248 |
| - const auto Visitor = OverloadedVisit{ |
249 |
| - [this](const dxbc::RootFlags &Flags) -> MDNode * { |
250 |
| - return BuildRootFlags(Flags); |
251 |
| - }, |
252 |
| - [this](const RootConstants &Constants) -> MDNode * { |
253 |
| - return BuildRootConstants(Constants); |
254 |
| - }, |
255 |
| - [this](const RootDescriptor &Descriptor) -> MDNode * { |
256 |
| - return BuildRootDescriptor(Descriptor); |
257 |
| - }, |
258 |
| - [this](const DescriptorTableClause &Clause) -> MDNode * { |
259 |
| - return BuildDescriptorTableClause(Clause); |
260 |
| - }, |
261 |
| - [this](const DescriptorTable &Table) -> MDNode * { |
262 |
| - return BuildDescriptorTable(Table); |
263 |
| - }, |
264 |
| - [this](const StaticSampler &Sampler) -> MDNode * { |
265 |
| - return BuildStaticSampler(Sampler); |
266 |
| - }, |
267 |
| - }; |
268 |
| - |
269 |
| - for (const RootElement &Element : Elements) { |
270 |
| - MDNode *ElementMD = std::visit(Visitor, Element); |
271 |
| - assert(ElementMD != nullptr && |
272 |
| - "Root Element must be initialized and validated"); |
273 |
| - GeneratedMetadata.push_back(ElementMD); |
274 |
| - } |
275 |
| - |
276 |
| - return MDNode::get(Ctx, GeneratedMetadata); |
277 |
| -} |
278 |
| - |
279 |
| -MDNode *MetadataBuilder::BuildRootFlags(const dxbc::RootFlags &Flags) { |
280 |
| - IRBuilder<> Builder(Ctx); |
281 |
| - Metadata *Operands[] = { |
282 |
| - MDString::get(Ctx, "RootFlags"), |
283 |
| - ConstantAsMetadata::get(Builder.getInt32(llvm::to_underlying(Flags))), |
284 |
| - }; |
285 |
| - return MDNode::get(Ctx, Operands); |
286 |
| -} |
287 |
| - |
288 |
| -MDNode *MetadataBuilder::BuildRootConstants(const RootConstants &Constants) { |
289 |
| - IRBuilder<> Builder(Ctx); |
290 |
| - Metadata *Operands[] = { |
291 |
| - MDString::get(Ctx, "RootConstants"), |
292 |
| - ConstantAsMetadata::get( |
293 |
| - Builder.getInt32(llvm::to_underlying(Constants.Visibility))), |
294 |
| - ConstantAsMetadata::get(Builder.getInt32(Constants.Reg.Number)), |
295 |
| - ConstantAsMetadata::get(Builder.getInt32(Constants.Space)), |
296 |
| - ConstantAsMetadata::get(Builder.getInt32(Constants.Num32BitConstants)), |
297 |
| - }; |
298 |
| - return MDNode::get(Ctx, Operands); |
299 |
| -} |
300 |
| - |
301 |
| -MDNode *MetadataBuilder::BuildRootDescriptor(const RootDescriptor &Descriptor) { |
302 |
| - IRBuilder<> Builder(Ctx); |
303 |
| - std::optional<StringRef> TypeName = |
304 |
| - getEnumName(dxil::ResourceClass(llvm::to_underlying(Descriptor.Type)), |
305 |
| - ArrayRef(ResourceClassNames)); |
306 |
| - assert(TypeName && "Provided an invalid Resource Class"); |
307 |
| - llvm::SmallString<7> Name({"Root", *TypeName}); |
308 |
| - Metadata *Operands[] = { |
309 |
| - MDString::get(Ctx, Name), |
310 |
| - ConstantAsMetadata::get( |
311 |
| - Builder.getInt32(llvm::to_underlying(Descriptor.Visibility))), |
312 |
| - ConstantAsMetadata::get(Builder.getInt32(Descriptor.Reg.Number)), |
313 |
| - ConstantAsMetadata::get(Builder.getInt32(Descriptor.Space)), |
314 |
| - ConstantAsMetadata::get( |
315 |
| - Builder.getInt32(llvm::to_underlying(Descriptor.Flags))), |
316 |
| - }; |
317 |
| - return MDNode::get(Ctx, Operands); |
318 |
| -} |
319 |
| - |
320 |
| -MDNode *MetadataBuilder::BuildDescriptorTable(const DescriptorTable &Table) { |
321 |
| - IRBuilder<> Builder(Ctx); |
322 |
| - SmallVector<Metadata *> TableOperands; |
323 |
| - // Set the mandatory arguments |
324 |
| - TableOperands.push_back(MDString::get(Ctx, "DescriptorTable")); |
325 |
| - TableOperands.push_back(ConstantAsMetadata::get( |
326 |
| - Builder.getInt32(llvm::to_underlying(Table.Visibility)))); |
327 |
| - |
328 |
| - // Remaining operands are references to the table's clauses. The in-memory |
329 |
| - // representation of the Root Elements created from parsing will ensure that |
330 |
| - // the previous N elements are the clauses for this table. |
331 |
| - assert(Table.NumClauses <= GeneratedMetadata.size() && |
332 |
| - "Table expected all owned clauses to be generated already"); |
333 |
| - // So, add a refence to each clause to our operands |
334 |
| - TableOperands.append(GeneratedMetadata.end() - Table.NumClauses, |
335 |
| - GeneratedMetadata.end()); |
336 |
| - // Then, remove those clauses from the general list of Root Elements |
337 |
| - GeneratedMetadata.pop_back_n(Table.NumClauses); |
338 |
| - |
339 |
| - return MDNode::get(Ctx, TableOperands); |
340 |
| -} |
341 |
| - |
342 |
| -MDNode *MetadataBuilder::BuildDescriptorTableClause( |
343 |
| - const DescriptorTableClause &Clause) { |
344 |
| - IRBuilder<> Builder(Ctx); |
345 |
| - std::optional<StringRef> Name = |
346 |
| - getEnumName(dxil::ResourceClass(llvm::to_underlying(Clause.Type)), |
347 |
| - ArrayRef(ResourceClassNames)); |
348 |
| - assert(Name && "Provided an invalid Resource Class"); |
349 |
| - Metadata *Operands[] = { |
350 |
| - MDString::get(Ctx, *Name), |
351 |
| - ConstantAsMetadata::get(Builder.getInt32(Clause.NumDescriptors)), |
352 |
| - ConstantAsMetadata::get(Builder.getInt32(Clause.Reg.Number)), |
353 |
| - ConstantAsMetadata::get(Builder.getInt32(Clause.Space)), |
354 |
| - ConstantAsMetadata::get(Builder.getInt32(Clause.Offset)), |
355 |
| - ConstantAsMetadata::get( |
356 |
| - Builder.getInt32(llvm::to_underlying(Clause.Flags))), |
357 |
| - }; |
358 |
| - return MDNode::get(Ctx, Operands); |
359 |
| -} |
360 |
| - |
361 |
| -MDNode *MetadataBuilder::BuildStaticSampler(const StaticSampler &Sampler) { |
362 |
| - IRBuilder<> Builder(Ctx); |
363 |
| - Metadata *Operands[] = { |
364 |
| - MDString::get(Ctx, "StaticSampler"), |
365 |
| - ConstantAsMetadata::get( |
366 |
| - Builder.getInt32(llvm::to_underlying(Sampler.Filter))), |
367 |
| - ConstantAsMetadata::get( |
368 |
| - Builder.getInt32(llvm::to_underlying(Sampler.AddressU))), |
369 |
| - ConstantAsMetadata::get( |
370 |
| - Builder.getInt32(llvm::to_underlying(Sampler.AddressV))), |
371 |
| - ConstantAsMetadata::get( |
372 |
| - Builder.getInt32(llvm::to_underlying(Sampler.AddressW))), |
373 |
| - ConstantAsMetadata::get(llvm::ConstantFP::get(llvm::Type::getFloatTy(Ctx), |
374 |
| - Sampler.MipLODBias)), |
375 |
| - ConstantAsMetadata::get(Builder.getInt32(Sampler.MaxAnisotropy)), |
376 |
| - ConstantAsMetadata::get( |
377 |
| - Builder.getInt32(llvm::to_underlying(Sampler.CompFunc))), |
378 |
| - ConstantAsMetadata::get( |
379 |
| - Builder.getInt32(llvm::to_underlying(Sampler.BorderColor))), |
380 |
| - ConstantAsMetadata::get( |
381 |
| - llvm::ConstantFP::get(llvm::Type::getFloatTy(Ctx), Sampler.MinLOD)), |
382 |
| - ConstantAsMetadata::get( |
383 |
| - llvm::ConstantFP::get(llvm::Type::getFloatTy(Ctx), Sampler.MaxLOD)), |
384 |
| - ConstantAsMetadata::get(Builder.getInt32(Sampler.Reg.Number)), |
385 |
| - ConstantAsMetadata::get(Builder.getInt32(Sampler.Space)), |
386 |
| - ConstantAsMetadata::get( |
387 |
| - Builder.getInt32(llvm::to_underlying(Sampler.Visibility))), |
388 |
| - }; |
389 |
| - return MDNode::get(Ctx, Operands); |
390 |
| -} |
391 |
| - |
392 | 244 | } // namespace rootsig
|
393 | 245 | } // namespace hlsl
|
394 | 246 | } // namespace llvm
|
0 commit comments