X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=c4e0a9bda8aa6b21d80fca7e92a5b393217d4a53;hb=f526938b407e061c7424adedc34af4d1ff687f90;hp=b0c6e3d67acb29cb178bbdeb1e7d2812ea16f5be;hpb=041ba4b1acd55337239c5ce24cc310118c621206;p=libs%2Fgl.git diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index b0c6e3d6..c4e0a9bd 100644 --- a/source/glsl/validate.cpp +++ b/source/glsl/validate.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -227,6 +228,44 @@ void ReferenceValidator::visit(FunctionDeclaration &func) } +void ExpressionValidator::visit(Swizzle &swizzle) +{ + unsigned size = 0; + if(BasicTypeDeclaration *basic = dynamic_cast(swizzle.left->type)) + { + if(basic->kind==BasicTypeDeclaration::INT || basic->kind==BasicTypeDeclaration::FLOAT) + size = 1; + else if(basic->kind==BasicTypeDeclaration::VECTOR) + size = basic->size; + } + + if(size) + { + static const char component_names[] = { 'x', 'y', 'z', 'w', 'r', 'g', 'b', 'a', 's', 't', 'p', 'q' }; + int flavour = -1; + for(unsigned i=0; i=0 && component_flavour!=static_cast(flavour)) + { + error(swizzle, format("Flavour of swizzle component '%c' is inconsistent with '%c'", + swizzle.component_group[i], swizzle.component_group[0])); + flavour = -2; + } + + if(swizzle.components[i]>=size) + error(swizzle, format("Access to component '%c' which is not present in '%s'", + swizzle.component_group[i], swizzle.left->type->name)); + } + } + else if(swizzle.left->type) + error(swizzle, format("Swizzle applied to '%s' which is neither a scalar nor a vector", swizzle.left->type->name)); + + TraversingVisitor::visit(swizzle); +} + void ExpressionValidator::visit(UnaryExpression &unary) { if(unary.expression->type)