X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=7eb0165dc5b82156d6a71caca7953508ad74aa33;hb=efbce87192ce73ba577684369f759693dccec67c;hp=1a8f75422effd8368b1c9e2d2bee0b1b76cd77a6;hpb=c32051dc7e77faf0fe6bdad2a6f1025e7b43da19;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 1a8f7542..7eb0165d 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -46,12 +46,7 @@ void StructOrganizer::visit(VariableDeclaration &var) if(layout_offset) *layout_offset = offset; else - { - if(!var.layout) - var.layout = new Layout; - - var.layout->qualifiers.push_back(Layout::Qualifier("offset", offset)); - } + add_layout_qualifier(var.layout, Layout::Qualifier("offset", offset)); if(!has_matrix_order) { @@ -59,7 +54,7 @@ void StructOrganizer::visit(VariableDeclaration &var) while(basic && basic->kind==BasicTypeDeclaration::ARRAY) basic = dynamic_cast(basic->base_type); if(basic && basic->kind==BasicTypeDeclaration::MATRIX) - var.layout->qualifiers.push_back(Layout::Qualifier("column_major")); + add_layout_qualifier(var.layout, Layout::Qualifier("column_major")); } offset += mem_reqs.size; @@ -71,7 +66,9 @@ void LocationAllocator::apply(Module &module, const Features &features) { for(Stage &s: module.stages) apply(s); - allocate_locations("uniform"); + + if(features.target_api!=VULKAN) + allocate_locations("uniform"); for(InterfaceBlock *b: unbound_blocks) bind_uniform(b->layout, b->block_name, features.uniform_binding_range); @@ -109,7 +106,7 @@ void LocationAllocator::allocate_locations(const string &iface) auto j = uniforms.find((*i)->name); if(j!=uniforms.end() && j->second.location>=0) { - add_layout_value((*i)->layout, "location", j->second.location); + add_layout_qualifier((*i)->layout, Layout::Qualifier("location", j->second.location)); continue; } } @@ -128,7 +125,7 @@ void LocationAllocator::allocate_locations(const string &iface) next = blocking+1; } - add_layout_value((*i)->layout, "location", next); + add_layout_qualifier((*i)->layout, Layout::Qualifier("location", next)); if((*i)->interface=="uniform") uniforms[(*i)->name].location = next; @@ -144,7 +141,7 @@ void LocationAllocator::bind_uniform(RefPtr &layout, const string &name, { auto i = uniforms.find(name); if(i!=uniforms.end() && i->second.bind_point>=0) - add_layout_value(layout, "binding", i->second.bind_point); + add_layout_qualifier(layout, Layout::Qualifier("binding", i->second.bind_point)); else { set &used = used_bindings[0]; @@ -153,18 +150,21 @@ void LocationAllocator::bind_uniform(RefPtr &layout, const string &name, while(used.count(bind_point)) bind_point = (bind_point+1)%range; - add_layout_value(layout, "binding", bind_point); + add_layout_qualifier(layout, Layout::Qualifier("binding", bind_point)); uniforms[name].bind_point = bind_point; used.insert(bind_point); } } -void LocationAllocator::add_layout_value(RefPtr &layout, const string &name, unsigned value) +bool LocationAllocator::visit_uniform(const string &name, RefPtr &layout) { - if(!layout) - layout = new Layout; - - layout->qualifiers.push_back(Layout::Qualifier(name, value)); + int bind_point = get_layout_value(layout.get(), "binding"); + if(bind_point>=0) + { + used_bindings[0].insert(bind_point); + uniforms[name].bind_point = bind_point; + } + return bind_point>=0; } void LocationAllocator::visit(VariableDeclaration &var) @@ -174,13 +174,13 @@ void LocationAllocator::visit(VariableDeclaration &var) if(!var.interface.empty()) { - int location = (var.layout ? get_layout_value(*var.layout, "location") : -1); + int location = get_layout_value(var.layout.get(), "location"); if(location<0 && var.linked_declaration && var.linked_declaration->layout) { - location = get_layout_value(*var.linked_declaration->layout, "location"); + location = get_layout_value(var.linked_declaration->layout.get(), "location"); if(location>=0) - add_layout_value(var.layout, "location", location); + add_layout_qualifier(var.layout, Layout::Qualifier("location", location)); } if(location>=0) @@ -197,20 +197,9 @@ void LocationAllocator::visit(VariableDeclaration &var) if(var.interface=="uniform") { - const TypeDeclaration *type = var.type_declaration; - while(const BasicTypeDeclaration *basic = dynamic_cast(type)) - type = basic->base_type; - if(dynamic_cast(type)) - { - int bind_point = (var.layout ? get_layout_value(*var.layout, "binding") : -1); - if(bind_point>=0) - { - used_bindings[0].insert(bind_point); - uniforms[var.name].bind_point = bind_point; - } - else - unbound_textures.push_back(&var); - } + const TypeDeclaration *base_type = get_ultimate_base_type(var.type_declaration); + if(dynamic_cast(base_type) && !visit_uniform(var.name, var.layout)) + unbound_textures.push_back(&var); } } @@ -221,25 +210,9 @@ void LocationAllocator::visit(InterfaceBlock &iface) if(iface.interface=="uniform") { - 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(!push_constant) - { - 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); - } + bool push_constant = has_layout_qualifier(iface.layout.get(), "push_constant"); + if(!push_constant && !visit_uniform(iface.block_name, iface.layout)) + unbound_blocks.push_back(&iface); } } @@ -386,7 +359,9 @@ bool StructuralFeatureConverter::supports_stage(Stage::Type st) const { if(st==Stage::GEOMETRY) { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else return check_version(Version(1, 50)); @@ -397,7 +372,9 @@ bool StructuralFeatureConverter::supports_stage(Stage::Type st) const bool StructuralFeatureConverter::supports_unified_interface_syntax() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else return check_version(Version(1, 30)); @@ -438,7 +415,9 @@ void StructuralFeatureConverter::visit(Assignment &assign) bool StructuralFeatureConverter::supports_unified_sampling_functions() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else return check_version(Version(1, 30)); @@ -495,7 +474,9 @@ void StructuralFeatureConverter::visit(VariableDeclaration &var) bool StructuralFeatureConverter::supports_interface_blocks(const string &iface) const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) { if(iface=="uniform") return check_version(Version(3, 0)); @@ -512,14 +493,8 @@ bool StructuralFeatureConverter::supports_interface_blocks(const string &iface) void StructuralFeatureConverter::visit(InterfaceBlock &iface) { - 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((!supports_interface_blocks(iface.interface) || push_constant) && iface.type_declaration) + bool push_constant = has_layout_qualifier(iface.layout.get(), "push_constant"); + if((!supports_interface_blocks(iface.interface) || (push_constant && features.target_api!=VULKAN)) && iface.type_declaration) { if(!iface.instance_name.empty()) unsupported("ARB_uniform_buffer_object required for interface block instances"); @@ -547,7 +522,9 @@ void QualifierConverter::apply() bool QualifierConverter::supports_interface_layouts() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else if(check_version(Version(3, 30))) return true; @@ -559,7 +536,9 @@ bool QualifierConverter::supports_interface_layouts() const bool QualifierConverter::supports_stage_interface_layouts() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else if(check_version(Version(4, 10))) return true; @@ -569,7 +548,9 @@ bool QualifierConverter::supports_stage_interface_layouts() const bool QualifierConverter::supports_centroid_sampling() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else if(check_version(Version(1, 20))) return true; @@ -579,7 +560,9 @@ bool QualifierConverter::supports_centroid_sampling() const bool QualifierConverter::supports_sample_sampling() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else if(check_version(Version(4, 0))) return true; @@ -589,7 +572,9 @@ bool QualifierConverter::supports_sample_sampling() const bool QualifierConverter::supports_uniform_location() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else if(check_version(Version(4, 30))) return true; @@ -599,7 +584,9 @@ bool QualifierConverter::supports_uniform_location() const bool QualifierConverter::supports_binding() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else return check_version(Version(4, 20)); @@ -645,10 +632,7 @@ void QualifierConverter::visit(VariableDeclaration &var) } else if(i->name=="binding" && !supports_binding()) { - const TypeDeclaration *type = var.type_declaration; - while(const BasicTypeDeclaration *basic = dynamic_cast(type)) - type = basic->base_type; - if(dynamic_cast(type)) + if(dynamic_cast(get_ultimate_base_type(var.type_declaration))) stage->texture_bindings[var.name] = i->value; i = var.layout->qualifiers.erase(i); @@ -681,7 +665,9 @@ void QualifierConverter::visit(VariableDeclaration &var) bool QualifierConverter::supports_interface_block_location() const { - if(features.target_api==OPENGL_ES) + if(features.target_api==VULKAN) + return true; + else if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else if(check_version(Version(4, 40))) return true;