X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=27760afeabb4770d9d79028c52019ace496e9d82;hb=37e2139a0c5721ea7e0104b5afc4cd97ad2dcb6c;hp=eee8a5198efa8b2037848bcc7a34bd8cd0d333ff;hpb=e9a898f315b5d1396f196d785913a283c30940f2;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index eee8a519..27760afe 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -12,10 +12,6 @@ namespace Msp { namespace GL { namespace SL { -StructOrganizer::StructOrganizer(): - offset(-1) -{ } - void StructOrganizer::visit(StructDeclaration &strct) { SetForScope set_offset(offset, 0); @@ -225,23 +221,29 @@ void LocationAllocator::visit(InterfaceBlock &iface) if(iface.interface=="uniform") { - int bind_point = (iface.layout ? get_layout_value(*iface.layout, "binding") : -1); + 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(bind_point>=0) + if(!push_constant) { - used_bindings[0].insert(bind_point); - uniforms[iface.block_name].bind_point = bind_point; + 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); } - else - unbound_blocks.push_back(&iface); } } -PrecisionConverter::PrecisionConverter(): - stage(0) -{ } - void PrecisionConverter::apply(Stage &s) { stage = &s; @@ -261,7 +263,7 @@ void PrecisionConverter::visit(Block &block) void PrecisionConverter::visit(Precision &prec) { - if(stage->required_features.gl_api==OPENGL_ES2) + if(stage->required_features.target_api==OPENGL_ES) have_default.insert(prec.type); else nodes_to_remove.insert(&prec); @@ -269,7 +271,7 @@ void PrecisionConverter::visit(Precision &prec) void PrecisionConverter::visit(VariableDeclaration &var) { - if(stage->required_features.gl_api!=OPENGL_ES2) + if(stage->required_features.target_api!=OPENGL_ES) { var.precision.clear(); return; @@ -308,11 +310,7 @@ void PrecisionConverter::visit(VariableDeclaration &var) } -LegacyConverter::LegacyConverter(): - frag_out(0) -{ } - -void LegacyConverter::apply(Stage &s, const Features &feat) +void FeatureConverter::apply(Stage &s, const Features &feat) { stage = &s; features = feat; @@ -322,13 +320,13 @@ void LegacyConverter::apply(Stage &s, const Features &feat) NodeRemover().apply(s, nodes_to_remove); if(!stage->required_features.glsl_version) - stage->required_features.glsl_version = Version(1, (stage->required_features.gl_api==OPENGL_ES2 ? 0 : 10)); + stage->required_features.glsl_version = Version(1, (stage->required_features.target_api==OPENGL_ES ? 0 : 10)); } else unsupported(format("Stage %s is not supported", Stage::get_stage_name(s.type))); } -void LegacyConverter::unsupported(const string &reason) +void FeatureConverter::unsupported(const string &reason) { Diagnostic diagnostic; diagnostic.severity = Diagnostic::ERR; @@ -338,7 +336,7 @@ void LegacyConverter::unsupported(const string &reason) stage->diagnostics.push_back(diagnostic); } -void LegacyConverter::visit(Block &block) +void FeatureConverter::visit(Block &block) { for(auto i=block.body.begin(); i!=block.body.end(); ++i) { @@ -348,7 +346,16 @@ void LegacyConverter::visit(Block &block) } } -bool LegacyConverter::check_version(const Version &feature_version) const +void FeatureConverter::visit(RefPtr &expr) +{ + r_replaced_reference = 0; + expr->visit(*this); + if(r_replaced_reference) + expr = r_replaced_reference; + r_replaced_reference = 0; +} + +bool FeatureConverter::check_version(const Version &feature_version) const { if(features.glsl_versionname = memacc.member; + r_replaced_reference = var; + } +} + +void FeatureConverter::visit(Assignment &assign) { TraversingVisitor::visit(assign); if(assign.target.declaration==frag_out && !supports_unified_interface_syntax()) assign.target.declaration = 0; } -bool LegacyConverter::supports_unified_sampling_functions() const +bool FeatureConverter::supports_unified_sampling_functions() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else return check_version(Version(1, 30)); } -void LegacyConverter::visit(FunctionCall &call) +void FeatureConverter::visit(FunctionCall &call) { if(call.declaration && call.declaration->source==BUILTIN_SOURCE) { @@ -450,9 +474,9 @@ void LegacyConverter::visit(FunctionCall &call) TraversingVisitor::visit(call); } -bool LegacyConverter::supports_interface_layouts() const +bool FeatureConverter::supports_interface_layouts() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else if(check_version(Version(3, 30))) return true; @@ -462,9 +486,9 @@ bool LegacyConverter::supports_interface_layouts() const return false; } -bool LegacyConverter::supports_stage_interface_layouts() const +bool FeatureConverter::supports_stage_interface_layouts() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else if(check_version(Version(4, 10))) return true; @@ -472,9 +496,9 @@ bool LegacyConverter::supports_stage_interface_layouts() const return check_extension(&Features::arb_separate_shader_objects); } -bool LegacyConverter::supports_centroid_sampling() const +bool FeatureConverter::supports_centroid_sampling() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 0)); else if(check_version(Version(1, 20))) return true; @@ -482,9 +506,9 @@ bool LegacyConverter::supports_centroid_sampling() const return check_extension(&Features::ext_gpu_shader4); } -bool LegacyConverter::supports_sample_sampling() const +bool FeatureConverter::supports_sample_sampling() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else if(check_version(Version(4, 0))) return true; @@ -492,9 +516,9 @@ bool LegacyConverter::supports_sample_sampling() const return check_extension(&Features::arb_gpu_shader5); } -bool LegacyConverter::supports_uniform_location() const +bool FeatureConverter::supports_uniform_location() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else if(check_version(Version(4, 30))) return true; @@ -502,15 +526,15 @@ bool LegacyConverter::supports_uniform_location() const return check_extension(&Features::arb_explicit_uniform_location); } -bool LegacyConverter::supports_binding() const +bool FeatureConverter::supports_binding() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 10)); else return check_version(Version(4, 20)); } -void LegacyConverter::visit(VariableDeclaration &var) +void FeatureConverter::visit(VariableDeclaration &var) { if(var.layout) { @@ -586,12 +610,16 @@ void LegacyConverter::visit(VariableDeclaration &var) } } + if(var.name=="gl_ClipDistance") + if(const Literal *literal_size = dynamic_cast(var.array_size.get())) + stage->n_clip_distances = literal_size->value.value(); + TraversingVisitor::visit(var); } -bool LegacyConverter::supports_interface_blocks(const string &iface) const +bool FeatureConverter::supports_interface_blocks(const string &iface) const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) { if(iface=="uniform") return check_version(Version(3, 0)); @@ -606,9 +634,9 @@ bool LegacyConverter::supports_interface_blocks(const string &iface) const return false; } -bool LegacyConverter::supports_interface_block_location() const +bool FeatureConverter::supports_interface_block_location() const { - if(features.gl_api==OPENGL_ES2) + if(features.target_api==OPENGL_ES) return check_version(Version(3, 20)); else if(check_version(Version(4, 40))) return true; @@ -616,8 +644,9 @@ bool LegacyConverter::supports_interface_block_location() const return check_extension(&Features::arb_enhanced_layouts); } -void LegacyConverter::visit(InterfaceBlock &iface) +void FeatureConverter::visit(InterfaceBlock &iface) { + bool push_constant = false; if(iface.layout) { for(auto i=iface.layout->qualifiers.begin(); i!=iface.layout->qualifiers.end(); ) @@ -630,19 +659,26 @@ void LegacyConverter::visit(InterfaceBlock &iface) i = iface.layout->qualifiers.erase(i); } else + { + if(i->name=="push_constant") + push_constant = true; ++i; + } } if(iface.layout->qualifiers.empty()) iface.layout = 0; } - if(!supports_interface_blocks(iface.interface) && iface.type_declaration) + if((!supports_interface_blocks(iface.interface) || push_constant) && iface.type_declaration) { if(!iface.instance_name.empty()) unsupported("ARB_uniform_buffer_object required for interface block instances"); else if(iface.struct_declaration) { + for(const RefPtr &s: iface.struct_declaration->members.body) + if(VariableDeclaration *var = dynamic_cast(s.get())) + var->interface = iface.interface; stage->content.body.splice(uniform_insert_point, iface.struct_declaration->members.body); nodes_to_remove.insert(&iface); nodes_to_remove.insert(iface.struct_declaration);