// Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #include namespace anki { Bool ShaderProgramInitInfo::isValid() const { ShaderTypeBit graphicsMask = ShaderTypeBit::kNone; for(ShaderType i = ShaderType::kFirstGraphics; i <= ShaderType::kLastGraphics; ++i) { if(m_graphicsShaders[i]) { if(m_graphicsShaders[i]->getShaderType() != i) { return false; } graphicsMask |= ShaderTypeBit(1 << i); } } if(!!graphicsMask) { if(!(graphicsMask & ShaderTypeBit::kPixel)) { return false; } const Bool hasMesh = !!(graphicsMask & ShaderTypeBit::kAllModernGeometry); const Bool hasVert = !!(graphicsMask & ShaderTypeBit::kAllLegacyGeometry); if(hasMesh && !!(graphicsMask & ShaderTypeBit::kAllLegacyGeometry)) { return false; } if(hasVert && !!(graphicsMask & ShaderTypeBit::kAllModernGeometry)) { return false; } } Bool compute = false; if(m_computeShader) { if(m_computeShader->getShaderType() != ShaderType::kCompute) { return false; } compute = true; } if(compute && !!graphicsMask) { return false; } ShaderTypeBit rtMask = ShaderTypeBit::kNone; for(const Shader* s : m_rayTracingShaders.m_rayGenShaders) { if(s->getShaderType() != ShaderType::kRayGen) { return false; } rtMask |= ShaderTypeBit::kRayGen; } for(const Shader* s : m_rayTracingShaders.m_missShaders) { if(s->getShaderType() != ShaderType::kMiss) { return false; } rtMask |= ShaderTypeBit::kMiss; } for(const RayTracingHitGroup& group : m_rayTracingShaders.m_hitGroups) { ShaderTypeBit localRtMask = ShaderTypeBit::kNone; if(group.m_anyHitShader) { if(group.m_anyHitShader->getShaderType() != ShaderType::kAnyHit) { return false; } localRtMask |= ShaderTypeBit::kAnyHit; } if(group.m_closestHitShader) { if(group.m_closestHitShader->getShaderType() != ShaderType::kClosestHit) { return false; } localRtMask |= ShaderTypeBit::kClosestHit; } if(!localRtMask) { return false; } rtMask |= localRtMask; } if(!!rtMask && m_rayTracingShaders.m_maxRecursionDepth == 0) { return false; } const Bool workGraph = m_workGraph.m_shader != nullptr; const U32 options = !!graphicsMask + compute + !!rtMask + workGraph; if(options != 1) { return false; } return true; } } // end namespace anki