ShaderProgramImpl.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Gr/ShaderProgram.h>
  7. #include <AnKi/Gr/Vulkan/VulkanObject.h>
  8. #include <AnKi/Gr/Vulkan/PipelineLayout.h>
  9. namespace anki {
  10. // Forward
  11. class PipelineFactory;
  12. /// @addtogroup vulkan
  13. /// @{
  14. class ShaderProgramReflectionInfo
  15. {
  16. public:
  17. BitSet<MAX_COLOR_ATTACHMENTS, U8> m_colorAttachmentWritemask = {false};
  18. BitSet<MAX_VERTEX_ATTRIBUTES, U8> m_attributeMask = {false};
  19. BitSet<MAX_DESCRIPTOR_SETS, U8> m_descriptorSetMask = {false};
  20. Array<BitSet<MAX_BINDINGS_PER_DESCRIPTOR_SET, U8>, MAX_DESCRIPTOR_SETS> m_activeBindingMask = {{{false}, {false}}};
  21. U32 m_pushConstantsSize = 0;
  22. };
  23. /// Shader program implementation.
  24. class ShaderProgramImpl final : public ShaderProgram, public VulkanObject<ShaderProgram, ShaderProgramImpl>
  25. {
  26. public:
  27. ShaderProgramImpl(GrManager* manager, CString name)
  28. : ShaderProgram(manager, name)
  29. {
  30. }
  31. ~ShaderProgramImpl();
  32. Error init(const ShaderProgramInitInfo& inf);
  33. Bool isGraphics() const
  34. {
  35. return !!(m_stages & ShaderTypeBit::ALL_GRAPHICS);
  36. }
  37. const VkPipelineShaderStageCreateInfo* getShaderCreateInfos(U32& count) const
  38. {
  39. ANKI_ASSERT(isGraphics());
  40. count = m_graphics.m_shaderCreateInfoCount;
  41. return &m_graphics.m_shaderCreateInfos[0];
  42. }
  43. const PipelineLayout& getPipelineLayout() const
  44. {
  45. return m_pplineLayout;
  46. }
  47. const DescriptorSetLayout& getDescriptorSetLayout(U32 set) const
  48. {
  49. ANKI_ASSERT(m_descriptorSetLayouts[set].isCreated());
  50. return m_descriptorSetLayouts[set];
  51. }
  52. const ShaderProgramReflectionInfo& getReflectionInfo() const
  53. {
  54. return m_refl;
  55. }
  56. /// Only for graphics programs.
  57. PipelineFactory& getPipelineFactory()
  58. {
  59. ANKI_ASSERT(m_graphics.m_pplineFactory);
  60. return *m_graphics.m_pplineFactory;
  61. }
  62. VkPipeline getComputePipelineHandle() const
  63. {
  64. ANKI_ASSERT(m_compute.m_ppline);
  65. return m_compute.m_ppline;
  66. }
  67. VkPipeline getRayTracingPipelineHandle() const
  68. {
  69. ANKI_ASSERT(m_rt.m_ppline);
  70. return m_rt.m_ppline;
  71. }
  72. ShaderTypeBit getStages() const
  73. {
  74. ANKI_ASSERT(!!m_stages);
  75. return m_stages;
  76. }
  77. U32 getMissShaderCount() const
  78. {
  79. ANKI_ASSERT(m_rt.m_missShaderCount > 0);
  80. return m_rt.m_missShaderCount;
  81. }
  82. ConstWeakArray<U8> getShaderGroupHandles() const
  83. {
  84. ANKI_ASSERT(m_rt.m_allHandles.getSize() > 0);
  85. return m_rt.m_allHandles;
  86. }
  87. private:
  88. DynamicArray<ShaderPtr> m_shaders;
  89. ShaderTypeBit m_stages = ShaderTypeBit::NONE;
  90. PipelineLayout m_pplineLayout = {};
  91. Array<DescriptorSetLayout, MAX_DESCRIPTOR_SETS> m_descriptorSetLayouts;
  92. ShaderProgramReflectionInfo m_refl;
  93. class
  94. {
  95. public:
  96. Array<VkPipelineShaderStageCreateInfo, U32(ShaderType::FRAGMENT - ShaderType::VERTEX) + 1> m_shaderCreateInfos;
  97. U32 m_shaderCreateInfoCount = 0;
  98. PipelineFactory* m_pplineFactory = nullptr;
  99. } m_graphics;
  100. class
  101. {
  102. public:
  103. VkPipeline m_ppline = VK_NULL_HANDLE;
  104. } m_compute;
  105. class
  106. {
  107. public:
  108. VkPipeline m_ppline = VK_NULL_HANDLE;
  109. DynamicArray<U8> m_allHandles;
  110. U32 m_missShaderCount = 0;
  111. } m_rt;
  112. };
  113. /// @}
  114. } // end namespace anki