ShaderProgram.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/ShaderProgram.h>
  6. namespace anki {
  7. Bool ShaderProgramInitInfo::isValid() const
  8. {
  9. ShaderTypeBit graphicsMask = ShaderTypeBit::kNone;
  10. for(ShaderType i = ShaderType::kFirstGraphics; i <= ShaderType::kLastGraphics; ++i)
  11. {
  12. if(m_graphicsShaders[i])
  13. {
  14. if(m_graphicsShaders[i]->getShaderType() != i)
  15. {
  16. return false;
  17. }
  18. graphicsMask |= ShaderTypeBit(1 << i);
  19. }
  20. }
  21. if(!!graphicsMask && (graphicsMask & (ShaderTypeBit::kVertex | ShaderTypeBit::kFragment)) != (ShaderTypeBit::kVertex | ShaderTypeBit::kFragment))
  22. {
  23. return false;
  24. }
  25. Bool compute = false;
  26. if(m_computeShader)
  27. {
  28. if(m_computeShader->getShaderType() != ShaderType::kCompute)
  29. {
  30. return false;
  31. }
  32. compute = true;
  33. }
  34. if(compute && !!graphicsMask)
  35. {
  36. return false;
  37. }
  38. ShaderTypeBit rtMask = ShaderTypeBit::kNone;
  39. for(const ShaderPtr& s : m_rayTracingShaders.m_rayGenShaders)
  40. {
  41. if(s->getShaderType() != ShaderType::kRayGen)
  42. {
  43. return false;
  44. }
  45. rtMask |= ShaderTypeBit::kRayGen;
  46. }
  47. for(const ShaderPtr& s : m_rayTracingShaders.m_missShaders)
  48. {
  49. if(s->getShaderType() != ShaderType::kMiss)
  50. {
  51. return false;
  52. }
  53. rtMask |= ShaderTypeBit::kMiss;
  54. }
  55. for(const RayTracingHitGroup& group : m_rayTracingShaders.m_hitGroups)
  56. {
  57. ShaderTypeBit localRtMask = ShaderTypeBit::kNone;
  58. if(group.m_anyHitShader)
  59. {
  60. if(group.m_anyHitShader->getShaderType() != ShaderType::kAnyHit)
  61. {
  62. return false;
  63. }
  64. localRtMask |= ShaderTypeBit::kAnyHit;
  65. }
  66. if(group.m_closestHitShader)
  67. {
  68. if(group.m_closestHitShader->getShaderType() != ShaderType::kClosestHit)
  69. {
  70. return false;
  71. }
  72. localRtMask |= ShaderTypeBit::kClosestHit;
  73. }
  74. if(!localRtMask)
  75. {
  76. return false;
  77. }
  78. rtMask |= localRtMask;
  79. }
  80. if(!!rtMask && (!!graphicsMask || compute))
  81. {
  82. return false;
  83. }
  84. if(!graphicsMask && !compute && !rtMask)
  85. {
  86. return false;
  87. }
  88. if(!!rtMask && m_rayTracingShaders.m_maxRecursionDepth == 0)
  89. {
  90. return false;
  91. }
  92. return true;
  93. }
  94. } // end namespace anki