|
9 | 9 | #include "llvm/MC/DXContainerRootSignature.h" |
10 | 10 | #include "llvm/ADT/SmallVector.h" |
11 | 11 | #include "llvm/ADT/Twine.h" |
12 | | -#include "llvm/Support/BinaryStreamWriter.h" |
| 12 | +#include "llvm/Support/EndianStream.h" |
| 13 | +#include "llvm/Support/Error.h" |
13 | 14 | #include <cstdint> |
14 | | -#include <sys/types.h> |
15 | 15 |
|
16 | 16 | using namespace llvm; |
17 | 17 | using namespace llvm::mcdxbc; |
18 | 18 |
|
19 | | -Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) { |
| 19 | +void setRewrite(raw_ostream &Stream, uint32_t &Offset) { |
20 | 20 | const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); |
21 | | - |
22 | | - Offset = Stream.getOffset(); |
23 | | - |
24 | | - if (Error Err = Stream.writeInteger(DummyValue)) |
25 | | - return Err; |
26 | | - |
27 | | - return Error::success(); |
| 21 | + Offset = Stream.tell(); |
| 22 | + support::endian::write(Stream, DummyValue, llvm::endianness::little); |
28 | 23 | } |
29 | 24 |
|
30 | | -Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) { |
31 | | - uint64_t Value = Stream.getOffset(); |
32 | | - Stream.setOffset(Offset); |
33 | | - if (Error Err = Stream.writeInteger((uint32_t)Value)) |
34 | | - return Err; |
35 | | - |
36 | | - Stream.setOffset(Value); |
37 | | - |
38 | | - return Error::success(); |
| 25 | +void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) { |
| 26 | + uint32_t Value = Stream.tell(); |
| 27 | + auto *InsertPoint = &Stream.buffer()[Offset]; |
| 28 | + support::endian::write(InsertPoint, Value, llvm::endianness::little); |
39 | 29 | } |
40 | 30 |
|
41 | 31 | Error RootSignatureDesc::write(raw_ostream &OS) const { |
42 | | - std::vector<uint8_t> Buffer(getSizeInBytes()); |
43 | | - BinaryStreamWriter Writer(Buffer, llvm::endianness::little); |
44 | | - |
| 32 | + buffer_ostream Writer(OS); |
45 | 33 | const uint32_t NumParameters = Parameters.size(); |
46 | 34 | const uint32_t Zero = 0; |
47 | 35 |
|
48 | | - if (Error Err = Writer.writeInteger(Header.Version)) |
49 | | - return Err; |
50 | | - |
51 | | - if (Error Err = Writer.writeInteger(NumParameters)) |
52 | | - return Err; |
| 36 | + support::endian::write(Writer, Header.Version, llvm::endianness::little); |
| 37 | + support::endian::write(Writer, NumParameters, llvm::endianness::little); |
53 | 38 |
|
54 | 39 | uint32_t HeaderPoint; |
55 | | - if (Error Err = setRewrite(Writer, HeaderPoint)) |
56 | | - return Err; |
57 | | - |
58 | | - // Static samplers still not implemented |
59 | | - if (Error Err = Writer.writeInteger(Zero)) |
60 | | - return Err; |
| 40 | + setRewrite(Writer, HeaderPoint); |
61 | 41 |
|
62 | | - if (Error Err = Writer.writeInteger(Zero)) |
63 | | - return Err; |
| 42 | + support::endian::write(Writer, Zero, llvm::endianness::little); |
| 43 | + support::endian::write(Writer, Zero, llvm::endianness::little); |
| 44 | + support::endian::write(Writer, Header.Flags, llvm::endianness::little); |
64 | 45 |
|
65 | | - if (Error Err = Writer.writeInteger(Header.Flags)) |
66 | | - return Err; |
67 | | - |
68 | | - if (Error Err = rewriteOffset(Writer, HeaderPoint)) |
69 | | - return Err; |
| 46 | + rewriteOffset(Writer, HeaderPoint); |
70 | 47 |
|
71 | 48 | SmallVector<uint32_t> ParamsOffset; |
72 | 49 | for (const auto &P : Parameters) { |
73 | | - |
74 | | - if (Error Err = Writer.writeEnum(P.ParameterType)) |
75 | | - return Err; |
76 | | - |
77 | | - if (Error Err = Writer.writeEnum(P.ShaderVisibility)) |
78 | | - return Err; |
| 50 | + support::endian::write(Writer, P.ParameterType, llvm::endianness::little); |
| 51 | + support::endian::write(Writer, P.ShaderVisibility, |
| 52 | + llvm::endianness::little); |
79 | 53 |
|
80 | 54 | uint32_t Offset; |
81 | | - if (Error Err = setRewrite(Writer, Offset)) |
82 | | - return Err; |
| 55 | + setRewrite(Writer, Offset); |
| 56 | + |
83 | 57 | ParamsOffset.push_back(Offset); |
84 | 58 | } |
85 | 59 |
|
86 | 60 | assert(NumParameters == ParamsOffset.size()); |
87 | 61 | for (size_t I = 0; I < NumParameters; ++I) { |
88 | | - if (Error Err = rewriteOffset(Writer, ParamsOffset[I])) |
89 | | - return Err; |
90 | | - |
| 62 | + rewriteOffset(Writer, ParamsOffset[I]); |
91 | 63 | const auto &P = Parameters[I]; |
92 | 64 |
|
93 | 65 | switch (P.ParameterType) { |
94 | 66 | case dxbc::RootParameterType::Constants32Bit: { |
95 | | - if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister)) |
96 | | - return Err; |
97 | | - if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace)) |
98 | | - return Err; |
99 | | - if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues)) |
100 | | - return Err; |
| 67 | + support::endian::write(Writer, P.Constants.ShaderRegister, |
| 68 | + llvm::endianness::little); |
| 69 | + support::endian::write(Writer, P.Constants.RegisterSpace, |
| 70 | + llvm::endianness::little); |
| 71 | + support::endian::write(Writer, P.Constants.Num32BitValues, |
| 72 | + llvm::endianness::little); |
101 | 73 | } break; |
102 | 74 | case dxbc::RootParameterType::Empty: |
103 | 75 | llvm_unreachable("Invalid RootParameterType"); |
104 | 76 | } |
105 | 77 | } |
106 | 78 |
|
107 | | - llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()), |
108 | | - Buffer.size()); |
109 | | - OS.write(BufferRef.data(), BufferRef.size()); |
110 | | - |
111 | 79 | return Error::success(); |
112 | 80 | } |
0 commit comments