X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=94052432296e2dc1dc629e68ad4618b595f4d63d;hb=30c7ba8f7fd08c13562c86bf651bdc3ec8d30ab5;hp=fcf48c61cd0ae1fbce706cff7744384525be7d7c;hpb=1a5dafe20e47c764f2914c341fb7b8f1fba59fb8;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index fcf48c61..94052432 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -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(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"; @@ -440,6 +473,13 @@ bool StructuralFeatureConverter::supports_stage(Stage::Type st) const 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; }