|
8 | 8 |
|
9 | 9 | #include "llvm/MC/DXContainerRootSignature.h" |
10 | 10 | #include "llvm/ADT/bit.h" |
| 11 | +#include "llvm/BinaryFormat/DXContainer.h" |
11 | 12 | #include "llvm/Support/EndianStream.h" |
| 13 | +#include <cstdint> |
| 14 | +#include <sys/types.h> |
12 | 15 |
|
13 | 16 | using namespace llvm; |
14 | 17 | using namespace llvm::mcdxbc; |
15 | 18 |
|
| 19 | +template <typename T> |
| 20 | +static uint32_t getSizeOf () { |
| 21 | + return static_cast<uint32_t>(sizeof(T)); |
| 22 | +} |
| 23 | + |
| 24 | + |
| 25 | + |
16 | 26 | void RootSignatureDesc::write(raw_ostream &OS) const { |
| 27 | + uint32_t Offset = 16; |
| 28 | + const uint32_t ParametersOffset = getSizeOf<dxbc::RootSignatureHeader>() + Offset; |
| 29 | + const uint32_t ParameterByteSize = Parameters.size_in_bytes(); |
17 | 30 |
|
18 | | - support::endian::write(OS, Version, llvm::endianness::little); |
19 | | - support::endian::write(OS, NumParameters, llvm::endianness::little); |
20 | | - support::endian::write(OS, RootParametersOffset, llvm::endianness::little); |
21 | | - support::endian::write(OS, NumStaticSamplers, llvm::endianness::little); |
22 | | - support::endian::write(OS, StaticSamplersOffset, llvm::endianness::little); |
23 | | - support::endian::write(OS, Flags, llvm::endianness::little); |
24 | | -} |
25 | 31 |
|
26 | | -void RootParameter::write(raw_ostream &OS) { |
27 | | - support::endian::write(OS, ParameterType, llvm::endianness::little); |
28 | | - support::endian::write(OS, ShaderVisibility, llvm::endianness::little); |
| 32 | + // Writing header information |
| 33 | + support::endian::write(OS, Header.Version, llvm::endianness::little); |
| 34 | + Offset += getSizeOf<uint32_t>(); |
29 | 35 |
|
30 | | - switch(ParameterType){ |
31 | | - case dxbc::RootParameterType::Constants32Bit: |
32 | | - Constants.write(OS); |
33 | | - break; |
34 | | - } |
35 | | -} |
| 36 | + support::endian::write(OS, (uint32_t)Parameters.size(), llvm::endianness::little); |
| 37 | + Offset += getSizeOf<uint32_t>(); |
36 | 38 |
|
37 | | -void RootConstants::write(raw_ostream &OS) { |
38 | | - support::endian::write(OS, Num32BitValues, llvm::endianness::little); |
39 | | - support::endian::write(OS, RegisterSpace, llvm::endianness::little); |
40 | | - support::endian::write(OS, ShaderRegister, llvm::endianness::little); |
| 39 | + support::endian::write(OS, ParametersOffset, llvm::endianness::little); |
| 40 | + Offset += getSizeOf<uint32_t>(); |
| 41 | + |
| 42 | + support::endian::write(OS, ((uint32_t)0), llvm::endianness::little); |
| 43 | + Offset += getSizeOf<uint32_t>(); |
| 44 | + |
| 45 | + support::endian::write(OS, ParameterByteSize + ParametersOffset, llvm::endianness::little); |
| 46 | + Offset += getSizeOf<uint32_t>(); |
| 47 | + |
| 48 | + support::endian::write(OS, Header.Flags, llvm::endianness::little); |
| 49 | + |
| 50 | + for (const dxbc::RootParameter &P : Parameters){ |
| 51 | + support::endian::write(OS, P.ParameterType, llvm::endianness::little); |
| 52 | + support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little); |
| 53 | + support::endian::write(OS, Offset, llvm::endianness::little); |
| 54 | + Offset += getSizeOf<uint32_t>(); |
| 55 | + |
| 56 | + |
| 57 | + switch(P.ParameterType){ |
| 58 | + case dxbc::RootParameterType::Constants32Bit:{ |
| 59 | + support::endian::write(OS, P.Constants.ShaderRegister, llvm::endianness::little); |
| 60 | + Offset += getSizeOf<uint32_t>(); |
| 61 | + |
| 62 | + support::endian::write(OS, P.Constants.RegisterSpace, llvm::endianness::little); |
| 63 | + Offset += getSizeOf<uint32_t>(); |
| 64 | + |
| 65 | + support::endian::write(OS, P.Constants.Num32BitValues, llvm::endianness::little); |
| 66 | + Offset += getSizeOf<uint32_t>(); |
| 67 | + |
| 68 | + } break; |
| 69 | + } |
| 70 | + } |
41 | 71 | } |
0 commit comments