]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/finalize.cpp
Support compute shaders in the shader compiler
[libs/gl.git] / source / glsl / finalize.cpp
index 87e185024f3175c669a639dd14032b04e0cee79e..94052432296e2dc1dc629e68ad4618b595f4d63d 100644 (file)
@@ -251,9 +251,42 @@ void DepthRangeConverter::apply(Stage &stage, const Features &features)
        stage.content.visit(*this);
 }
 
+void DepthRangeConverter::visit(VariableReference &var)
+{
+       const StructDeclaration *strct = dynamic_cast<const StructDeclaration *>(var.type);
+       r_gl_pervertex = (strct && strct->block_name=="gl_PerVertex");
+}
+
+void DepthRangeConverter::visit(MemberAccess &memacc)
+{
+       r_gl_pervertex = false;
+       memacc.left->visit(*this);
+       r_gl_position = (r_gl_pervertex && memacc.member=="gl_Position");
+}
+
+void DepthRangeConverter::visit(Swizzle &swiz)
+{
+       r_gl_position = false;
+       swiz.left->visit(*this);
+       if(assignment_target && r_gl_position && swiz.count==1 && swiz.components[0]==2)
+               r_position_z_assigned = true;
+}
+
+void DepthRangeConverter::visit(Assignment &assign)
+{
+       {
+               SetFlag set_target(assignment_target);
+               assign.left->visit(*this);
+       }
+       assign.right->visit(*this);
+}
+
 void DepthRangeConverter::visit(FunctionDeclaration &func)
 {
-       if(func.definition==&func && func.name=="main")
+       r_position_z_assigned = false;
+       TraversingVisitor::visit(func);
+
+       if(func.definition==&func && func.name=="main" && !r_position_z_assigned)
        {
                VariableReference *position = new VariableReference;
                position->name = "gl_Position";
@@ -435,22 +468,25 @@ bool StructuralFeatureConverter::supports_stage(Stage::Type st) const
 {
        if(st==Stage::GEOMETRY)
        {
-               if(features.target_api==VULKAN)
-                       return true;
-               else if(features.target_api==OPENGL_ES)
+               if(features.target_api==OPENGL_ES)
                        return check_version(Version(3, 20));
                else
                        return check_version(Version(1, 50));
        }
+       else if(st==Stage::COMPUTE)
+       {
+               if(features.target_api==OPENGL_ES)
+                       return check_version(Version(3, 10));
+               else
+                       return check_version(Version(4, 30));
+       }
        else
                return true;
 }
 
 bool StructuralFeatureConverter::supports_unified_interface_syntax() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else
                return check_version(Version(1, 30));
@@ -488,9 +524,7 @@ void StructuralFeatureConverter::visit(Assignment &assign)
 
 bool StructuralFeatureConverter::supports_unified_sampling_functions() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else
                return check_version(Version(1, 30));
@@ -535,9 +569,7 @@ void StructuralFeatureConverter::visit(FunctionCall &call)
 
 bool StructuralFeatureConverter::supports_interface_blocks(const string &iface) const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
        {
                if(iface=="uniform")
                        return check_version(Version(3, 0));
@@ -591,9 +623,7 @@ void QualifierConverter::apply()
 
 bool QualifierConverter::supports_interface_layouts() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else if(check_version(Version(3, 30)))
                return true;
@@ -605,9 +635,7 @@ bool QualifierConverter::supports_interface_layouts() const
 
 bool QualifierConverter::supports_stage_interface_layouts() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else if(check_version(Version(4, 10)))
                return true;
@@ -617,9 +645,7 @@ bool QualifierConverter::supports_stage_interface_layouts() const
 
 bool QualifierConverter::supports_centroid_sampling() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 0));
        else if(check_version(Version(1, 20)))
                return true;
@@ -629,9 +655,7 @@ bool QualifierConverter::supports_centroid_sampling() const
 
 bool QualifierConverter::supports_sample_sampling() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
        else if(check_version(Version(4, 0)))
                return true;
@@ -641,9 +665,7 @@ bool QualifierConverter::supports_sample_sampling() const
 
 bool QualifierConverter::supports_uniform_location() const
 {
-       if(features.target_api==VULKAN)
-               return false;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else if(check_version(Version(4, 30)))
                return true;
@@ -653,9 +675,7 @@ bool QualifierConverter::supports_uniform_location() const
 
 bool QualifierConverter::supports_binding() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 10));
        else
                return check_version(Version(4, 20));
@@ -663,9 +683,7 @@ bool QualifierConverter::supports_binding() const
 
 bool QualifierConverter::supports_interface_block_location() const
 {
-       if(features.target_api==VULKAN)
-               return true;
-       else if(features.target_api==OPENGL_ES)
+       if(features.target_api==OPENGL_ES)
                return check_version(Version(3, 20));
        else if(check_version(Version(4, 40)))
                return true;