]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/finalize.cpp
Rename LegacyConverter to FeatureConverter
[libs/gl.git] / source / glsl / finalize.cpp
index f005d87dcbf82749e33eb1ba8c55fdbece642b76..27760afeabb4770d9d79028c52019ace496e9d82 100644 (file)
@@ -221,15 +221,25 @@ void LocationAllocator::visit(InterfaceBlock &iface)
 
        if(iface.interface=="uniform")
        {
-               int bind_point = (iface.layout ? get_layout_value(*iface.layout, "binding") : -1);
+               bool push_constant = false;
+               if(iface.layout)
+               {
+                       auto i = find_member(iface.layout->qualifiers, string("push_constant"), &Layout::Qualifier::name);
+                       push_constant = (i!=iface.layout->qualifiers.end());
+               }
 
-               if(bind_point>=0)
+               if(!push_constant)
                {
-                       used_bindings[0].insert(bind_point);
-                       uniforms[iface.block_name].bind_point = bind_point;
+                       int bind_point = (iface.layout ? get_layout_value(*iface.layout, "binding") : -1);
+
+                       if(bind_point>=0)
+                       {
+                               used_bindings[0].insert(bind_point);
+                               uniforms[iface.block_name].bind_point = bind_point;
+                       }
+                       else
+                               unbound_blocks.push_back(&iface);
                }
-               else
-                       unbound_blocks.push_back(&iface);
        }
 }
 
@@ -300,7 +310,7 @@ void PrecisionConverter::visit(VariableDeclaration &var)
 }
 
 
-void LegacyConverter::apply(Stage &s, const Features &feat)
+void FeatureConverter::apply(Stage &s, const Features &feat)
 {
        stage = &s;
        features = feat;
@@ -316,7 +326,7 @@ void LegacyConverter::apply(Stage &s, const Features &feat)
                unsupported(format("Stage %s is not supported", Stage::get_stage_name(s.type)));
 }
 
-void LegacyConverter::unsupported(const string &reason)
+void FeatureConverter::unsupported(const string &reason)
 {
        Diagnostic diagnostic;
        diagnostic.severity = Diagnostic::ERR;
@@ -326,7 +336,7 @@ void LegacyConverter::unsupported(const string &reason)
        stage->diagnostics.push_back(diagnostic);
 }
 
-void LegacyConverter::visit(Block &block)
+void FeatureConverter::visit(Block &block)
 {
        for(auto i=block.body.begin(); i!=block.body.end(); ++i)
        {
@@ -336,7 +346,7 @@ void LegacyConverter::visit(Block &block)
        }
 }
 
-void LegacyConverter::visit(RefPtr<Expression> &expr)
+void FeatureConverter::visit(RefPtr<Expression> &expr)
 {
        r_replaced_reference = 0;
        expr->visit(*this);
@@ -345,7 +355,7 @@ void LegacyConverter::visit(RefPtr<Expression> &expr)
        r_replaced_reference = 0;
 }
 
-bool LegacyConverter::check_version(const Version &feature_version) const
+bool FeatureConverter::check_version(const Version &feature_version) const
 {
        if(features.glsl_version<feature_version)
                return false;
@@ -355,7 +365,7 @@ bool LegacyConverter::check_version(const Version &feature_version) const
        return true;
 }
 
-bool LegacyConverter::check_extension(bool Features::*extension) const
+bool FeatureConverter::check_extension(bool Features::*extension) const
 {
        if(!(features.*extension))
                return false;
@@ -365,7 +375,7 @@ bool LegacyConverter::check_extension(bool Features::*extension) const
        return true;
 }
 
-bool LegacyConverter::supports_stage(Stage::Type st) const
+bool FeatureConverter::supports_stage(Stage::Type st) const
 {
        if(st==Stage::GEOMETRY)
        {
@@ -378,7 +388,7 @@ bool LegacyConverter::supports_stage(Stage::Type st) const
                return true;
 }
 
-bool LegacyConverter::supports_unified_interface_syntax() const
+bool FeatureConverter::supports_unified_interface_syntax() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
@@ -386,7 +396,7 @@ bool LegacyConverter::supports_unified_interface_syntax() const
                return check_version(Version(1, 30));
 }
 
-void LegacyConverter::visit(VariableReference &var)
+void FeatureConverter::visit(VariableReference &var)
 {
        if(var.declaration==frag_out && !supports_unified_interface_syntax())
        {
@@ -395,12 +405,12 @@ void LegacyConverter::visit(VariableReference &var)
        }
 }
 
-void LegacyConverter::visit(InterfaceBlockReference &iface)
+void FeatureConverter::visit(InterfaceBlockReference &iface)
 {
        r_flattened_interface = nodes_to_remove.count(iface.declaration);
 }
 
-void LegacyConverter::visit(MemberAccess &memacc)
+void FeatureConverter::visit(MemberAccess &memacc)
 {
        r_flattened_interface = false;
        visit(memacc.left);
@@ -412,14 +422,14 @@ void LegacyConverter::visit(MemberAccess &memacc)
        }
 }
 
-void LegacyConverter::visit(Assignment &assign)
+void FeatureConverter::visit(Assignment &assign)
 {
        TraversingVisitor::visit(assign);
        if(assign.target.declaration==frag_out && !supports_unified_interface_syntax())
                assign.target.declaration = 0;
 }
 
-bool LegacyConverter::supports_unified_sampling_functions() const
+bool FeatureConverter::supports_unified_sampling_functions() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
@@ -427,7 +437,7 @@ bool LegacyConverter::supports_unified_sampling_functions() const
                return check_version(Version(1, 30));
 }
 
-void LegacyConverter::visit(FunctionCall &call)
+void FeatureConverter::visit(FunctionCall &call)
 {
        if(call.declaration && call.declaration->source==BUILTIN_SOURCE)
        {
@@ -464,7 +474,7 @@ void LegacyConverter::visit(FunctionCall &call)
        TraversingVisitor::visit(call);
 }
 
-bool LegacyConverter::supports_interface_layouts() const
+bool FeatureConverter::supports_interface_layouts() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
@@ -476,7 +486,7 @@ bool LegacyConverter::supports_interface_layouts() const
                return false;
 }
 
-bool LegacyConverter::supports_stage_interface_layouts() const
+bool FeatureConverter::supports_stage_interface_layouts() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
@@ -486,7 +496,7 @@ bool LegacyConverter::supports_stage_interface_layouts() const
                return check_extension(&Features::arb_separate_shader_objects);
 }
 
-bool LegacyConverter::supports_centroid_sampling() const
+bool FeatureConverter::supports_centroid_sampling() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
@@ -496,7 +506,7 @@ bool LegacyConverter::supports_centroid_sampling() const
                return check_extension(&Features::ext_gpu_shader4);
 }
 
-bool LegacyConverter::supports_sample_sampling() const
+bool FeatureConverter::supports_sample_sampling() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
@@ -506,7 +516,7 @@ bool LegacyConverter::supports_sample_sampling() const
                return check_extension(&Features::arb_gpu_shader5);
 }
 
-bool LegacyConverter::supports_uniform_location() const
+bool FeatureConverter::supports_uniform_location() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
@@ -516,7 +526,7 @@ bool LegacyConverter::supports_uniform_location() const
                return check_extension(&Features::arb_explicit_uniform_location);
 }
 
-bool LegacyConverter::supports_binding() const
+bool FeatureConverter::supports_binding() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
@@ -524,7 +534,7 @@ bool LegacyConverter::supports_binding() const
                return check_version(Version(4, 20));
 }
 
-void LegacyConverter::visit(VariableDeclaration &var)
+void FeatureConverter::visit(VariableDeclaration &var)
 {
        if(var.layout)
        {
@@ -607,7 +617,7 @@ void LegacyConverter::visit(VariableDeclaration &var)
        TraversingVisitor::visit(var);
 }
 
-bool LegacyConverter::supports_interface_blocks(const string &iface) const
+bool FeatureConverter::supports_interface_blocks(const string &iface) const
 {
        if(features.target_api==OPENGL_ES)
        {
@@ -624,7 +634,7 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const
                return false;
 }
 
-bool LegacyConverter::supports_interface_block_location() const
+bool FeatureConverter::supports_interface_block_location() const
 {
        if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
@@ -634,8 +644,9 @@ bool LegacyConverter::supports_interface_block_location() const
                return check_extension(&Features::arb_enhanced_layouts);
 }
 
-void LegacyConverter::visit(InterfaceBlock &iface)
+void FeatureConverter::visit(InterfaceBlock &iface)
 {
+       bool push_constant = false;
        if(iface.layout)
        {
                for(auto i=iface.layout->qualifiers.begin(); i!=iface.layout->qualifiers.end(); )
@@ -648,14 +659,18 @@ void LegacyConverter::visit(InterfaceBlock &iface)
                                i = iface.layout->qualifiers.erase(i);
                        }
                        else
+                       {
+                               if(i->name=="push_constant")
+                                       push_constant = true;
                                ++i;
+                       }
                }
 
                if(iface.layout->qualifiers.empty())
                        iface.layout = 0;
        }
 
-       if(!supports_interface_blocks(iface.interface) && iface.type_declaration)
+       if((!supports_interface_blocks(iface.interface) || push_constant) && iface.type_declaration)
        {
                if(!iface.instance_name.empty())
                        unsupported("ARB_uniform_buffer_object required for interface block instances");