ShaderProgramImpl.h 3.1 KB

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