ShaderProgram.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. #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. {
  23. if(!(graphicsMask & ShaderTypeBit::kPixel))
  24. {
  25. return false;
  26. }
  27. const Bool hasMesh = !!(graphicsMask & ShaderTypeBit::kAllModernGeometry);
  28. const Bool hasVert = !!(graphicsMask & ShaderTypeBit::kAllLegacyGeometry);
  29. if(hasMesh && !!(graphicsMask & ShaderTypeBit::kAllLegacyGeometry))
  30. {
  31. return false;
  32. }
  33. if(hasVert && !!(graphicsMask & ShaderTypeBit::kAllModernGeometry))
  34. {
  35. return false;
  36. }
  37. }
  38. Bool compute = false;
  39. if(m_computeShader)
  40. {
  41. if(m_computeShader->getShaderType() != ShaderType::kCompute)
  42. {
  43. return false;
  44. }
  45. compute = true;
  46. }
  47. if(compute && !!graphicsMask)
  48. {
  49. return false;
  50. }
  51. ShaderTypeBit rtMask = ShaderTypeBit::kNone;
  52. for(const Shader* s : m_rayTracingShaders.m_rayGenShaders)
  53. {
  54. if(s->getShaderType() != ShaderType::kRayGen)
  55. {
  56. return false;
  57. }
  58. rtMask |= ShaderTypeBit::kRayGen;
  59. }
  60. for(const Shader* s : m_rayTracingShaders.m_missShaders)
  61. {
  62. if(s->getShaderType() != ShaderType::kMiss)
  63. {
  64. return false;
  65. }
  66. rtMask |= ShaderTypeBit::kMiss;
  67. }
  68. for(const RayTracingHitGroup& group : m_rayTracingShaders.m_hitGroups)
  69. {
  70. ShaderTypeBit localRtMask = ShaderTypeBit::kNone;
  71. if(group.m_anyHitShader)
  72. {
  73. if(group.m_anyHitShader->getShaderType() != ShaderType::kAnyHit)
  74. {
  75. return false;
  76. }
  77. localRtMask |= ShaderTypeBit::kAnyHit;
  78. }
  79. if(group.m_closestHitShader)
  80. {
  81. if(group.m_closestHitShader->getShaderType() != ShaderType::kClosestHit)
  82. {
  83. return false;
  84. }
  85. localRtMask |= ShaderTypeBit::kClosestHit;
  86. }
  87. if(!localRtMask)
  88. {
  89. return false;
  90. }
  91. rtMask |= localRtMask;
  92. }
  93. if(!!rtMask && m_rayTracingShaders.m_maxRecursionDepth == 0)
  94. {
  95. return false;
  96. }
  97. const Bool workGraph = m_workGraph.m_shader != nullptr;
  98. const U32 options = !!graphicsMask + compute + !!rtMask + workGraph;
  99. if(options != 1)
  100. {
  101. return false;
  102. }
  103. return true;
  104. }
  105. } // end namespace anki