]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/program.cpp
Create specialized versions of SPIR-V modules with default spec values
[libs/gl.git] / source / core / program.cpp
index 533dca610c9585f649420edadd34bf4f5e858617..e4250b6c05739b52d8f1e339db7c188ffac35aad 100644 (file)
@@ -33,14 +33,13 @@ void Program::add_stages(const Module &mod, const map<string, int> &spec_values)
        reflect_data = ReflectData();
        const Module *final_module = &mod;
 
-       TransientData transient;
        switch(mod.get_format())
        {
        case Module::GLSL:
-               add_glsl_stages(static_cast<const GlslModule &>(mod), spec_values, transient);
+               add_glsl_stages(static_cast<const GlslModule &>(mod), spec_values);
                break;
        case Module::SPIR_V:
-               if(!spec_values.empty())
+               if(static_cast<const SpirVModule &>(mod).is_specializable())
                {
                        specialized_spirv = static_cast<const SpirVModule &>(mod).specialize(spec_values);
                        final_module = specialized_spirv;
@@ -51,8 +50,6 @@ void Program::add_stages(const Module &mod, const map<string, int> &spec_values)
                throw invalid_argument("Program::add_stages");
        }
 
-       finalize(*final_module, transient);
-
        if(final_module->get_format()==Module::SPIR_V)
        {
                const SpirVModule &spirv_mod = *static_cast<const SpirVModule *>(final_module);
@@ -63,12 +60,7 @@ void Program::add_stages(const Module &mod, const map<string, int> &spec_values)
 
        finalize_uniforms();
 
-       for(const ReflectData::UniformInfo &u: reflect_data.uniforms)
-               if(u.binding>=0)
-                       reflect_data.used_bindings.push_back(u.binding);
-       for(const ReflectData::UniformBlockInfo &b: reflect_data.uniform_blocks)
-               reflect_data.used_bindings.push_back(b.bind_point);
-       sort(reflect_data.used_bindings);
+       reflect_data.update_used_bindings();
 
        for(const ReflectData::UniformInfo &u: reflect_data.uniforms)
                require_type(u.type);