| 18 | } |
| 19 | |
| 20 | UberShaderInstance* UberShaderPreprocessor::Get(const ParameterList& parameters) const |
| 21 | { |
| 22 | // Première étape, transformer les paramètres en un flag |
| 23 | UInt32 flags = 0; |
| 24 | for (auto it = m_flags.begin(); it != m_flags.end(); ++it) |
| 25 | { |
| 26 | if (parameters.HasParameter(it->first)) |
| 27 | { |
| 28 | bool value; |
| 29 | if (parameters.GetBooleanParameter(it->first, &value) && value) |
| 30 | flags |= it->second; |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | // Le shader fait-il partie du cache ? |
| 35 | auto shaderIt = m_cache.find(flags); |
| 36 | |
| 37 | // Si non, il nous faut le construire |
| 38 | if (shaderIt == m_cache.end()) |
| 39 | { |
| 40 | try |
| 41 | { |
| 42 | // Une exception sera lancée à la moindre erreur et celle-ci ne sera pas enregistrée dans le log (car traitée dans le bloc catch) |
| 43 | ErrorFlags errFlags(ErrorFlag_Silent | ErrorFlag_ThrowException, true); |
| 44 | |
| 45 | ShaderRef shader = Shader::New(); |
| 46 | shader->Create(); |
| 47 | |
| 48 | for (unsigned int i = 0; i <= ShaderStageType_Max; ++i) |
| 49 | { |
| 50 | const CachedShader& shaderStage = m_shaders[i]; |
| 51 | |
| 52 | // Le shader stage est-il activé dans cette version du shader ? |
| 53 | if (shaderStage.present && (flags & shaderStage.requiredFlags) == shaderStage.requiredFlags) |
| 54 | { |
| 55 | UInt32 stageFlags = 0; |
| 56 | for (auto it = shaderStage.flags.begin(); it != shaderStage.flags.end(); ++it) |
| 57 | { |
| 58 | if (parameters.HasParameter(it->first)) |
| 59 | { |
| 60 | bool value; |
| 61 | if (parameters.GetBooleanParameter(it->first, &value) && value) |
| 62 | stageFlags |= it->second; |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | auto stageIt = shaderStage.cache.find(stageFlags); |
| 67 | if (stageIt == shaderStage.cache.end()) |
| 68 | { |
| 69 | ShaderStage stage; |
| 70 | stage.Create(static_cast<ShaderStageType>(i)); |
| 71 | |
| 72 | unsigned int glslVersion = OpenGL::GetGLSLVersion(); |
| 73 | |
| 74 | StringStream code; |
| 75 | code << "#version " << glslVersion << "\n\n"; |
| 76 | |
| 77 | code << "#define GLSL_VERSION " << glslVersion << "\n\n"; |
nothing calls this directly
no test coverage detected