[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:36:54 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:
An option for doing this would be to write the root signature to a temporary buffer, where you can do random-access writes as much as you like, and then write the entire root signature to OS in one go.
https://github.com/llvm/llvm-project/pull/127840
More information about the llvm-commits
mailing list