[llvm] [DirectX] adding support in obj2yaml and yaml2obj to root constants (PR #127840)
Damyan Pepper via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 21 14:24:36 PST 2025
================
@@ -13,11 +13,47 @@ 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();
+ const uint32_t Zero = 0;
- support::endian::write(OS, Version, llvm::endianness::little);
- support::endian::write(OS, NumParameters, llvm::endianness::little);
- support::endian::write(OS, RootParametersOffset, llvm::endianness::little);
- support::endian::write(OS, NumStaticSamplers, llvm::endianness::little);
- support::endian::write(OS, StaticSamplersOffset, llvm::endianness::little);
- support::endian::write(OS, Flags, llvm::endianness::little);
+ // 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);
+
+ // Static samplers still not implemented
+ support::endian::write(OS, Zero, llvm::endianness::little);
+ support::endian::write(OS, ParameterByteSize + HeaderSize,
+ llvm::endianness::little);
+
+ support::endian::write(OS, Header.Flags, llvm::endianness::little);
+
+ 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);
+
+ // Size of root parameter, removing the ParameterType and ShaderVisibility.
+ ParamsOffset += sizeof(dxbc::RootParameter) - 2 * sizeof(uint32_t);
----------------
damyanp wrote:
So I somehow missed that ParamsOffset is getting written inside the loop (I even looked specifically for that and failed to find it!).
I'd normally write code like this by using tell() to figure out where the actual offset is, just before we write it, and then going back and updating the place where it needs to be written. But you can't do that with a raw_ostream, you need a raw_pwrite_stream.
https://github.com/llvm/llvm-project/pull/127840
More information about the llvm-commits
mailing list