DxilSignature.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilSignature.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Representation of HLSL shader signature. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. #include "dxc/HLSL/DxilSignatureElement.h"
  13. #include <memory>
  14. #include <string>
  15. #include <vector>
  16. namespace hlsl {
  17. /// Use this class to represent HLSL signature.
  18. class DxilSignature {
  19. public:
  20. using Kind = DXIL::SignatureKind;
  21. DxilSignature(DXIL::ShaderKind shaderKind, DXIL::SignatureKind sigKind, bool useMinPrecision);
  22. DxilSignature(DXIL::SigPointKind sigPointKind);
  23. DxilSignature(const DxilSignature &src);
  24. virtual ~DxilSignature();
  25. bool IsInput() const;
  26. bool IsOutput() const;
  27. virtual std::unique_ptr<DxilSignatureElement> CreateElement();
  28. unsigned AppendElement(std::unique_ptr<DxilSignatureElement> pSE, bool bSetID = true);
  29. DxilSignatureElement &GetElement(unsigned idx);
  30. const DxilSignatureElement &GetElement(unsigned idx) const;
  31. const std::vector<std::unique_ptr<DxilSignatureElement> > &GetElements() const;
  32. // Packs the signature elements per DXIL constraints and returns the number of rows used for the signature
  33. unsigned PackElements(DXIL::PackingStrategy packing);
  34. // Returns true if all signature elements that should be allocated are allocated
  35. bool IsFullyAllocated() const;
  36. // Returns the number of allocated vectors used to contain signature
  37. unsigned NumVectorsUsed(unsigned streamIndex = 0) const;
  38. bool UseMinPrecision() const { return m_UseMinPrecision; }
  39. private:
  40. DXIL::SigPointKind m_sigPointKind;
  41. std::vector<std::unique_ptr<DxilSignatureElement> > m_Elements;
  42. bool m_UseMinPrecision;
  43. };
  44. struct DxilEntrySignature {
  45. DxilEntrySignature(DXIL::ShaderKind shaderKind, bool useMinPrecision)
  46. : InputSignature(shaderKind, DxilSignature::Kind::Input, useMinPrecision),
  47. OutputSignature(shaderKind, DxilSignature::Kind::Output, useMinPrecision),
  48. PatchConstantSignature(shaderKind, DxilSignature::Kind::PatchConstant, useMinPrecision) {
  49. }
  50. DxilEntrySignature(const DxilEntrySignature &src);
  51. DxilSignature InputSignature;
  52. DxilSignature OutputSignature;
  53. DxilSignature PatchConstantSignature;
  54. };
  55. } // namespace hlsl