================ @@ -7,53 +7,109 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" -#include "llvm/Support/EndianStream.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/Twine.h" +#include "llvm/Support/BinaryStreamWriter.h" +#include <cstdint> +#include <sys/types.h> using namespace llvm; using namespace llvm::mcdxbc; -void RootSignatureDesc::write(raw_ostream &OS) const { - // Root signature header in dxcontainer has 6 uint_32t values. - const uint32_t HeaderSize = 24; - const uint32_t ParameterByteSize = Parameters.size_in_bytes(); - const uint32_t NumParametes = Parameters.size(); +Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) { + const uint32_t DummyValue = std::numeric_limits<uint32_t>::max(); + + Offset = Stream.getOffset(); + + if (Error Err = Stream.writeInteger(DummyValue)) + return Err; + + return Error::success(); +} + +Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) { + uint64_t Value = Stream.getOffset(); + Stream.setOffset(Offset); + if (Error Err = Stream.writeInteger((uint32_t)Value)) + return Err; + + Stream.setOffset(Value); + + return Error::success(); +} + +Error RootSignatureDesc::write(raw_ostream &OS) const { + std::vector<uint8_t> Buffer(getSizeInBytes()); + BinaryStreamWriter Writer(Buffer, llvm::endianness::little); + + const uint32_t NumParameters = Parameters.size(); const uint32_t Zero = 0; - // Writing header information - support::endian::write(OS, Header.Version, llvm::endianness::little); - support::endian::write(OS, NumParametes, llvm::endianness::little); - support::endian::write(OS, HeaderSize, llvm::endianness::little); + if (Error Err = Writer.writeInteger(Header.Version)) + return Err; + + if (Error Err = Writer.writeInteger(NumParameters)) + return Err; + + uint32_t HeaderPoint; + if (Error Err = setRewrite(Writer, HeaderPoint)) + return Err; // Static samplers still not implemented - support::endian::write(OS, Zero, llvm::endianness::little); - support::endian::write(OS, ParameterByteSize + HeaderSize, - llvm::endianness::little); + if (Error Err = Writer.writeInteger(Zero)) + return Err; + + if (Error Err = Writer.writeInteger(Zero)) + return Err; + + if (Error Err = Writer.writeInteger(Header.Flags)) + return Err; + + if (Error Err = rewriteOffset(Writer, HeaderPoint)) + return Err; + + SmallVector<uint32_t> ParamsOffset; + for (const auto &P : Parameters) { - support::endian::write(OS, Header.Flags, llvm::endianness::little); + if (Error Err = Writer.writeEnum(P.ParameterType)) + return Err; - uint32_t ParamsOffset = - HeaderSize + (3 * sizeof(uint32_t) * Parameters.size()); - for (const dxbc::RootParameter &P : Parameters) { - support::endian::write(OS, P.ParameterType, llvm::endianness::little); - support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little); - support::endian::write(OS, ParamsOffset, llvm::endianness::little); + if (Error Err = Writer.writeEnum(P.ShaderVisibility)) + return Err; - // Size of root parameter, removing the ParameterType and ShaderVisibility. - ParamsOffset += sizeof(dxbc::RootParameter) - 2 * sizeof(uint32_t); + uint32_t Offset; + if (Error Err = setRewrite(Writer, Offset)) + return Err; + ParamsOffset.push_back(Offset); } - for (const dxbc::RootParameter &P : Parameters) { + size_t It = 0; ---------------- damyanp wrote:
`It` (to me at least) strongly implies that this is an STL iterator. Here, thought, I think it's just used as an index into ParamsOffset. If Parameters is just an array, it's probably easier just to write this as: ```c++ assert(Parameters.size() == ParamsOffset.size()); for (size_t I = 0; i < Parameters.size(); ++I) { if (Error Err = rewriteOffset(Writer, ParamsOffset[I])) return Err; const auto& P = Parameters[I]; // etc... } https://github.com/llvm/llvm-project/pull/128577 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits