1 //===- llvm/MC/DXContainerPSVInfo.h - DXContainer PSVInfo -*- C++ -------*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_MC_DXCONTAINERPSVINFO_H 10 #define LLVM_MC_DXCONTAINERPSVINFO_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/SmallVector.h" 14 #include "llvm/ADT/StringRef.h" 15 #include "llvm/BinaryFormat/DXContainer.h" 16 #include "llvm/MC/StringTableBuilder.h" 17 #include "llvm/TargetParser/Triple.h" 18 19 #include <array> 20 #include <numeric> 21 #include <stdint.h> 22 23 namespace llvm { 24 25 class raw_ostream; 26 27 namespace mcdxbc { 28 29 struct PSVSignatureElement { 30 StringRef Name; 31 SmallVector<uint32_t> Indices; 32 uint8_t StartRow; 33 uint8_t Cols; 34 uint8_t StartCol; 35 bool Allocated; 36 dxbc::PSV::SemanticKind Kind; 37 dxbc::PSV::ComponentType Type; 38 dxbc::PSV::InterpolationMode Mode; 39 uint8_t DynamicMask; 40 uint8_t Stream; 41 }; 42 43 // This data structure is a helper for reading and writing PSV RuntimeInfo data. 44 // It is implemented in the BinaryFormat library so that it can be used by both 45 // the MC layer and Object tools. 46 // This structure is used to represent the extracted data in an inspectable and 47 // modifiable format, and can be used to serialize the data back into valid PSV 48 // RuntimeInfo. 49 struct PSVRuntimeInfo { PSVRuntimeInfoPSVRuntimeInfo50 PSVRuntimeInfo() : DXConStrTabBuilder(StringTableBuilder::DXContainer) {} 51 bool IsFinalized = false; 52 dxbc::PSV::v3::RuntimeInfo BaseData; 53 SmallVector<dxbc::PSV::v2::ResourceBindInfo> Resources; 54 SmallVector<PSVSignatureElement> InputElements; 55 SmallVector<PSVSignatureElement> OutputElements; 56 SmallVector<PSVSignatureElement> PatchOrPrimElements; 57 58 // TODO: Make this interface user-friendly. 59 // The interface here is bad, and we'll want to change this in the future. We 60 // probably will want to build out these mask vectors as vectors of bools and 61 // have this utility object convert them to the bit masks. I don't want to 62 // over-engineer this API now since we don't know what the data coming in to 63 // feed it will look like, so I kept it extremely simple for the immediate use 64 // case. 65 std::array<SmallVector<uint32_t>, 4> OutputVectorMasks; 66 SmallVector<uint32_t> PatchOrPrimMasks; 67 std::array<SmallVector<uint32_t>, 4> InputOutputMap; 68 SmallVector<uint32_t> InputPatchMap; 69 SmallVector<uint32_t> PatchOutputMap; 70 llvm::StringRef EntryName; 71 72 // Serialize PSVInfo into the provided raw_ostream. The version field 73 // specifies the data version to encode, the default value specifies encoding 74 // the highest supported version. 75 void write(raw_ostream &OS, 76 uint32_t Version = std::numeric_limits<uint32_t>::max()) const; 77 78 void finalize(Triple::EnvironmentType Stage); 79 80 private: 81 SmallVector<uint32_t, 64> IndexBuffer; 82 SmallVector<llvm::dxbc::PSV::v0::SignatureElement, 32> SignatureElements; 83 StringTableBuilder DXConStrTabBuilder; 84 }; 85 86 class Signature { 87 struct Parameter { 88 uint32_t Stream; 89 StringRef Name; 90 uint32_t Index; 91 dxbc::D3DSystemValue SystemValue; 92 dxbc::SigComponentType CompType; 93 uint32_t Register; 94 uint8_t Mask; 95 uint8_t ExclusiveMask; 96 dxbc::SigMinPrecision MinPrecision; 97 }; 98 99 SmallVector<Parameter> Params; 100 101 public: addParam(uint32_t Stream,StringRef Name,uint32_t Index,dxbc::D3DSystemValue SystemValue,dxbc::SigComponentType CompType,uint32_t Register,uint8_t Mask,uint8_t ExclusiveMask,dxbc::SigMinPrecision MinPrecision)102 void addParam(uint32_t Stream, StringRef Name, uint32_t Index, 103 dxbc::D3DSystemValue SystemValue, 104 dxbc::SigComponentType CompType, uint32_t Register, 105 uint8_t Mask, uint8_t ExclusiveMask, 106 dxbc::SigMinPrecision MinPrecision) { 107 Params.push_back(Parameter{Stream, Name, Index, SystemValue, CompType, 108 Register, Mask, ExclusiveMask, MinPrecision}); 109 } 110 111 void write(raw_ostream &OS); 112 }; 113 114 } // namespace mcdxbc 115 } // namespace llvm 116 117 #endif // LLVM_MC_DXCONTAINERPSVINFO_H 118