|
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