ShaderProgram.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright (C) 2009-2022, 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
  22. && (graphicsMask & (ShaderTypeBit::kVertex | ShaderTypeBit::kFragment))
  23. != (ShaderTypeBit::kVertex | ShaderTypeBit::kFragment))
  24. {
  25. return false;
  26. }
  27. Bool compute = false;
  28. if(m_computeShader)
  29. {
  30. if(m_computeShader->getShaderType() != ShaderType::kCompute)
  31. {
  32. return false;
  33. }
  34. compute = true;
  35. }
  36. if(compute && !!graphicsMask)
  37. {
  38. return false;
  39. }
  40. ShaderTypeBit rtMask = ShaderTypeBit::kNone;
  41. for(const ShaderPtr& s : m_rayTracingShaders.m_rayGenShaders)
  42. {
  43. if(s->getShaderType() != ShaderType::kRayGen)
  44. {
  45. return false;
  46. }
  47. rtMask |= ShaderTypeBit::kRayGen;
  48. }
  49. for(const ShaderPtr& s : m_rayTracingShaders.m_missShaders)
  50. {
  51. if(s->getShaderType() != ShaderType::kMiss)
  52. {
  53. return false;
  54. }
  55. rtMask |= ShaderTypeBit::kMiss;
  56. }
  57. for(const RayTracingHitGroup& group : m_rayTracingShaders.m_hitGroups)
  58. {
  59. ShaderTypeBit localRtMask = ShaderTypeBit::kNone;
  60. if(group.m_anyHitShader)
  61. {
  62. if(group.m_anyHitShader->getShaderType() != ShaderType::kAnyHit)
  63. {
  64. return false;
  65. }
  66. localRtMask |= ShaderTypeBit::kAnyHit;
  67. }
  68. if(group.m_closestHitShader)
  69. {
  70. if(group.m_closestHitShader->getShaderType() != ShaderType::kClosestHit)
  71. {
  72. return false;
  73. }
  74. localRtMask |= ShaderTypeBit::kClosestHit;
  75. }
  76. if(!localRtMask)
  77. {
  78. return false;
  79. }
  80. rtMask |= localRtMask;
  81. }
  82. if(!!rtMask && (!!graphicsMask || compute))
  83. {
  84. return false;
  85. }
  86. if(!graphicsMask && !compute && !rtMask)
  87. {
  88. return false;
  89. }
  90. if(!!rtMask && m_rayTracingShaders.m_maxRecursionDepth == 0)
  91. {
  92. return false;
  93. }
  94. return true;
  95. }
  96. } // end namespace anki