VkShaderProgram.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // Copyright (C) 2009-present, 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/VkDescriptor.h>
  8. #include <AnKi/Gr/Vulkan/VkBuffer.h>
  9. namespace anki {
  10. // Forward
  11. class GraphicsPipelineFactory;
  12. /// @addtogroup vulkan
  13. /// @{
  14. /// Shader program implementation.
  15. class ShaderProgramImpl final : public ShaderProgram
  16. {
  17. public:
  18. ShaderProgramImpl(CString name)
  19. : ShaderProgram(name)
  20. {
  21. }
  22. ~ShaderProgramImpl();
  23. Error init(const ShaderProgramInitInfo& inf);
  24. Bool isGraphics() const
  25. {
  26. return !!(m_shaderTypes & ShaderTypeBit::kAllGraphics);
  27. }
  28. const VkPipelineShaderStageCreateInfo* getShaderCreateInfos(U32& count) const
  29. {
  30. ANKI_ASSERT(isGraphics());
  31. count = m_graphics.m_shaderCreateInfoCount;
  32. return &m_graphics.m_shaderCreateInfos[0];
  33. }
  34. const PipelineLayout2& getPipelineLayout() const
  35. {
  36. return *m_pplineLayout;
  37. }
  38. /// Only for graphics programs.
  39. GraphicsPipelineFactory& getGraphicsPipelineFactory()
  40. {
  41. ANKI_ASSERT(m_graphics.m_pplineFactory);
  42. return *m_graphics.m_pplineFactory;
  43. }
  44. VkPipeline getComputePipelineHandle() const
  45. {
  46. ANKI_ASSERT(m_compute.m_ppline);
  47. return m_compute.m_ppline;
  48. }
  49. VkPipeline getRayTracingPipelineHandle() const
  50. {
  51. ANKI_ASSERT(m_rt.m_ppline);
  52. return m_rt.m_ppline;
  53. }
  54. ShaderTypeBit getStages() const
  55. {
  56. ANKI_ASSERT(!!m_shaderTypes);
  57. return m_shaderTypes;
  58. }
  59. U32 getMissShaderCount() const
  60. {
  61. ANKI_ASSERT(m_rt.m_missShaderCount > 0);
  62. return m_rt.m_missShaderCount;
  63. }
  64. ConstWeakArray<U8> getShaderGroupHandlesInternal() const
  65. {
  66. ANKI_ASSERT(m_rt.m_allHandles.getSize() > 0);
  67. return m_rt.m_allHandles;
  68. }
  69. Buffer& getShaderGroupHandlesGpuBufferInternal() const
  70. {
  71. return *m_rt.m_allHandlesBuff;
  72. }
  73. private:
  74. GrDynamicArray<ShaderInternalPtr> m_shaders;
  75. PipelineLayout2* m_pplineLayout = nullptr;
  76. class
  77. {
  78. public:
  79. Array<VkPipelineShaderStageCreateInfo, U32(ShaderType::kPixel - ShaderType::kVertex) + 1> m_shaderCreateInfos = {};
  80. U32 m_shaderCreateInfoCount = 0;
  81. GraphicsPipelineFactory* m_pplineFactory = nullptr;
  82. } m_graphics;
  83. class
  84. {
  85. public:
  86. VkPipeline m_ppline = VK_NULL_HANDLE;
  87. } m_compute;
  88. class
  89. {
  90. public:
  91. VkPipeline m_ppline = VK_NULL_HANDLE;
  92. GrDynamicArray<U8> m_allHandles;
  93. U32 m_missShaderCount = 0;
  94. BufferInternalPtr m_allHandlesBuff;
  95. } m_rt;
  96. void rewriteSpirv(ShaderReflectionDescriptorRelated& refl, GrDynamicArray<GrDynamicArray<U32>>& rewrittenSpirvs);
  97. };
  98. /// @}
  99. } // end namespace anki