Example #1
0
    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;
    }