X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=87e185024f3175c669a639dd14032b04e0cee79e;hp=5307cff93ed1461d1da9c5eab9de770fd6fcd8b0;hb=HEAD;hpb=03b2ea5c9c611cfa5f02afb49ed7e05743e691b4 diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 5307cff9..469cb92d 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -75,7 +75,12 @@ void LocationAllocator::apply(Module &module, const Features &f, bool a) for(VariableDeclaration *b: unbound_blocks) bind_uniform(b->layout, b->block_declaration->block_name, features.uniform_binding_range); for(VariableDeclaration *t: unbound_textures) - bind_uniform(t->layout, t->name, features.texture_binding_range); + { + const TypeDeclaration *base_type = get_ultimate_base_type(t->type_declaration); + unsigned range = (static_cast(base_type)->sampled ? + features.texture_binding_range : features.storage_texture_binding_range); + bind_uniform(t->layout, t->name, range); + } } void LocationAllocator::apply(Stage &stage) @@ -86,6 +91,8 @@ void LocationAllocator::apply(Stage &stage) stage.content.visit(*this); allocate_locations("in"); + if(stage.type==Stage::VERTEX) + swap(used_locations["in"], used_vertex_attribs); allocate_locations("out"); } @@ -116,6 +123,8 @@ void LocationAllocator::allocate_locations(const string &iface) if(!alloc_new) continue; + bool flat = ((*i)->interpolation=="flat" || ((*i)->linked_declaration && (*i)->linked_declaration->interpolation=="flat")); + set &used = used_locations[(*i)->interface]; unsigned size = LocationCounter().apply(**i); @@ -123,7 +132,7 @@ void LocationAllocator::allocate_locations(const string &iface) { int blocking = -1; for(unsigned j=0; j &layout, const string &name, bool LocationAllocator::visit_uniform(const string &name, RefPtr &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 +191,11 @@ bool LocationAllocator::visit_uniform(const string &name, RefPtr &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 +252,89 @@ 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(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) +{ + 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"; + + 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; @@ -379,24 +475,34 @@ void StructuralFeatureConverter::visit(RefPtr &expr) bool StructuralFeatureConverter::supports_stage(Stage::Type st) const { - if(st==Stage::GEOMETRY) + if(st==Stage::TESS_CONTROL || st==Stage::TESS_EVAL) { - 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(4, 0)); + } + else if(st==Stage::GEOMETRY) + { + 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)); @@ -434,9 +540,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 +585,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 +639,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 +651,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 +661,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 +671,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 +681,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 +691,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 +699,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;