]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/finalize.cpp
Remove Vulkan checks from feature converters
[libs/gl.git] / source / glsl / finalize.cpp
index 5307cff93ed1461d1da9c5eab9de770fd6fcd8b0..fcf48c61cd0ae1fbce706cff7744384525be7d7c 100644 (file)
@@ -168,12 +168,11 @@ void LocationAllocator::bind_uniform(RefPtr<Layout> &layout, const string &name,
 
 bool LocationAllocator::visit_uniform(const string &name, RefPtr<Layout> &layout)
 {
-       int desc_set = 0;
+       int desc_set = get_layout_value(layout.get(), "set");
        int bind_point = get_layout_value(layout.get(), "binding");
 
        if(features.target_api==VULKAN)
        {
-               desc_set = get_layout_value(layout.get(), "set");
                if(desc_set<0 && bind_point>=0)
                {
                        desc_set = 0;
@@ -183,6 +182,11 @@ bool LocationAllocator::visit_uniform(const string &name, RefPtr<Layout> &layout
                if(desc_set>=0)
                        uniforms[name].desc_set = desc_set;
        }
+       else if(desc_set>=0 && bind_point<0)
+       {
+               auto i = find_member(layout->qualifiers, string("set"), &Layout::Qualifier::name);
+               layout->qualifiers.erase(i);
+       }
 
        if(bind_point>=0)
        {
@@ -239,6 +243,56 @@ void LocationAllocator::visit(VariableDeclaration &var)
 }
 
 
+void DepthRangeConverter::apply(Stage &stage, const Features &features)
+{
+       if(stage.type!=Stage::VERTEX || features.target_api==VULKAN)
+               return;
+
+       stage.content.visit(*this);
+}
+
+void DepthRangeConverter::visit(FunctionDeclaration &func)
+{
+       if(func.definition==&func && func.name=="main")
+       {
+               VariableReference *position = new VariableReference;
+               position->name = "gl_Position";
+
+               MemberAccess *z = new MemberAccess;
+               z->left = position;
+               z->member = "z";
+
+               Literal *scale = new Literal;
+               scale->token = "2.0";
+               scale->value = 2.0f;
+
+               BinaryExpression *multiply = new BinaryExpression;
+               multiply->oper = &Operator::get_operator("*", Operator::BINARY);
+               multiply->left = z;
+               multiply->right = scale;
+
+               MemberAccess *w = new MemberAccess;
+               w->left = position->clone();
+               w->member = "w";
+
+               BinaryExpression *subtract = new BinaryExpression;
+               subtract->oper = &Operator::get_operator("-", Operator::BINARY);
+               subtract->left = multiply;
+               subtract->right = w;
+
+               Assignment *assign = new Assignment;
+               assign->oper = &Operator::get_operator("=", Operator::BINARY);
+               assign->left = z->clone();
+               assign->right = subtract;
+
+               ExpressionStatement *statement = new ExpressionStatement;
+               statement->expression = assign;
+
+               func.body.body.push_back(statement);
+       }
+}
+
+
 void PrecisionConverter::apply(Stage &s)
 {
        stage = &s;
@@ -381,9 +435,7 @@ 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));
@@ -394,9 +446,7 @@ bool StructuralFeatureConverter::supports_stage(Stage::Type st) const
 
 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));
@@ -434,9 +484,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));
@@ -481,9 +529,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));
@@ -537,9 +583,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;
@@ -551,9 +595,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;
@@ -563,9 +605,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;
@@ -575,9 +615,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;
@@ -587,9 +625,7 @@ bool QualifierConverter::supports_sample_sampling() const
 
 bool QualifierConverter::supports_uniform_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, 10));
        else if(check_version(Version(4, 30)))
                return true;
@@ -599,9 +635,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));
@@ -609,9 +643,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;