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