DiShaderProgram* DiShaderManager::LoadShader(const DiString& filename, uint64 flag) { DiShaderProgram* shader = NULL; ShaderLibsIt it = mShaderLibs.find(filename); if(it != mShaderLibs.end()) { DiMap<uint64,DiShaderProgram*>::iterator flagIt = it->second.find(flag); if(flagIt != it->second.end()) return flagIt->second; } shader = DI_NEW DiShaderProgram(filename); BOOL ret = shader->Load(); if(!ret) { DI_WARNING("Failed to load the shader : %s", filename.c_str()); DI_DELETE shader; return NULL; } DiShaderType type = shader->GetShaderType(); DiCompileDesc desc; desc.entryName = type == SHADER_VERTEX?"vs_main":"ps_main"; desc.profile = DiShaderProgram::GetDefaultProfile(type); ModifyMarcosByFlag(flag,desc); shader->Compile(desc); mShaderLibs[filename].insert(DiMap<uint64,DiShaderProgram*>::iterator::value_type(flag,shader)); return shader; }