X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ffinalize.cpp;h=192baec550e111313c76a5cde659e37c6604fba8;hb=59347f76bc985e8c9c769d4a3eee672cba9c920b;hp=6e9a478012e0dad898065da952868d8bf03eff46;hpb=8967d38bc578f1653c1dde01dce49a8f7b0c912e;p=libs%2Fgl.git diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 6e9a4780..192baec5 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -27,17 +27,21 @@ void StructOrganizer::visit(VariableDeclaration &var) if(offset>=0) { int *layout_offset = 0; + bool has_matrix_order = false; if(var.layout) { vector &qualifiers = var.layout->qualifiers; for(vector::iterator i=qualifiers.begin(); i!=qualifiers.end(); ++i) + { if(i->name=="offset" && i->has_value) { layout_offset = &i->value; if(i->value>=offset) offset = i->value; - break; } + else if(i->name=="column_major" || i->name=="row_major") + has_matrix_order = true; + } } MemoryRequirementsCalculator::Result mem_reqs = MemoryRequirementsCalculator().apply(var); @@ -51,11 +55,16 @@ void StructOrganizer::visit(VariableDeclaration &var) if(!var.layout) var.layout = new Layout; - Layout::Qualifier qual; - qual.name = "offset"; - qual.has_value = true; - qual.value = offset; - var.layout->qualifiers.push_back(qual); + var.layout->qualifiers.push_back(Layout::Qualifier("offset", offset)); + } + + if(!has_matrix_order) + { + const BasicTypeDeclaration *basic = dynamic_cast(var.type_declaration); + 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")); } offset += mem_reqs.size; @@ -160,11 +169,7 @@ void LocationAllocator::add_layout_value(RefPtr &layout, const string &n if(!layout) layout = new Layout; - Layout::Qualifier qual; - qual.name = name; - qual.has_value = true; - qual.value = value; - layout->qualifiers.push_back(qual); + layout->qualifiers.push_back(Layout::Qualifier(name, value)); } void LocationAllocator::visit(VariableDeclaration &var)