| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
- // All rights reserved.
- // Code licensed under the BSD License.
- // http://www.anki3d.org/LICENSE
- #include <AnKi/Gr/ShaderProgram.h>
- namespace anki {
- Bool ShaderProgramInitInfo::isValid() const
- {
- ShaderTypeBit graphicsMask = ShaderTypeBit::NONE;
- for(ShaderType i = ShaderType::FIRST_GRAPHICS; i <= ShaderType::LAST_GRAPHICS; ++i)
- {
- if(m_graphicsShaders[i])
- {
- if(m_graphicsShaders[i]->getShaderType() != i)
- {
- return false;
- }
- graphicsMask |= ShaderTypeBit(1 << i);
- }
- }
- if(!!graphicsMask
- && (graphicsMask & (ShaderTypeBit::VERTEX | ShaderTypeBit::FRAGMENT))
- != (ShaderTypeBit::VERTEX | ShaderTypeBit::FRAGMENT))
- {
- return false;
- }
- Bool compute = false;
- if(m_computeShader)
- {
- if(m_computeShader->getShaderType() != ShaderType::COMPUTE)
- {
- return false;
- }
- compute = true;
- }
- if(compute && !!graphicsMask)
- {
- return false;
- }
- ShaderTypeBit rtMask = ShaderTypeBit::NONE;
- for(const ShaderPtr& s : m_rayTracingShaders.m_rayGenShaders)
- {
- if(s->getShaderType() != ShaderType::RAY_GEN)
- {
- return false;
- }
- rtMask |= ShaderTypeBit::RAY_GEN;
- }
- for(const ShaderPtr& s : m_rayTracingShaders.m_missShaders)
- {
- if(s->getShaderType() != ShaderType::MISS)
- {
- return false;
- }
- rtMask |= ShaderTypeBit::MISS;
- }
- for(const RayTracingHitGroup& group : m_rayTracingShaders.m_hitGroups)
- {
- ShaderTypeBit localRtMask = ShaderTypeBit::NONE;
- if(group.m_anyHitShader)
- {
- if(group.m_anyHitShader->getShaderType() != ShaderType::ANY_HIT)
- {
- return false;
- }
- localRtMask |= ShaderTypeBit::ANY_HIT;
- }
- if(group.m_closestHitShader)
- {
- if(group.m_closestHitShader->getShaderType() != ShaderType::CLOSEST_HIT)
- {
- return false;
- }
- localRtMask |= ShaderTypeBit::CLOSEST_HIT;
- }
- if(!localRtMask)
- {
- return false;
- }
- rtMask |= localRtMask;
- }
- if(!!rtMask && (!!graphicsMask || compute))
- {
- return false;
- }
- if(!graphicsMask && !compute && !rtMask)
- {
- return false;
- }
- if(!!rtMask && m_rayTracingShaders.m_maxRecursionDepth == 0)
- {
- return false;
- }
- return true;
- }
- } // end namespace anki
|