X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=864a128b9230543913a629ff25e4b031af4981aa;hb=3fe1aab63922eec99d8bf6fd4fd60bec10df173c;hp=1a8f75422effd8368b1c9e2d2bee0b1b76cd77a6;hpb=c32051dc7e77faf0fe6bdad2a6f1025e7b43da19;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 1a8f7542..864a128b 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -71,7 +71,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); @@ -167,6 +169,17 @@ void LocationAllocator::add_layout_value(RefPtr &layout, const string &n layout->qualifiers.push_back(Layout::Qualifier(name, value)); } +bool LocationAllocator::visit_uniform(const string &name, RefPtr &layout) +{ + int bind_point = (layout ? get_layout_value(*layout, "binding") : -1); + 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) { if(!var.name.compare(0, 3, "gl_")) @@ -200,17 +213,8 @@ void LocationAllocator::visit(VariableDeclaration &var) 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); - } + if(dynamic_cast(type) && !visit_uniform(var.name, var.layout)) + unbound_textures.push_back(&var); } } @@ -228,18 +232,8 @@ void LocationAllocator::visit(InterfaceBlock &iface) 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); - } + if(!push_constant && !visit_uniform(iface.block_name, iface.layout)) + unbound_blocks.push_back(&iface); } } @@ -386,7 +380,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 +393,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 +436,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 +495,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)); @@ -519,7 +521,7 @@ void StructuralFeatureConverter::visit(InterfaceBlock &iface) push_constant = (i!=iface.layout->qualifiers.end()); } - if((!supports_interface_blocks(iface.interface) || push_constant) && iface.type_declaration) + 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 +549,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 +563,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 +575,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 +587,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 +599,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 +611,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)); @@ -681,7 +695,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;