X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.h;h=aba2c353f827239f7f4aaf3b2d2d73560d680db2;hb=b6c4e1a794276ca343c0c9bb0a300e729ca41931;hp=73b933bfb63b0f04155c80ab2bb7e484f2529f03;hpb=03b2ea5c9c611cfa5f02afb49ed7e05743e691b4;p=libs%2Fgl.git diff --git a/source/glsl/generate.h b/source/glsl/generate.h index 73b933bf..aba2c353 100644 --- a/source/glsl/generate.h +++ b/source/glsl/generate.h @@ -63,6 +63,46 @@ private: virtual void visit(Passthrough &); }; +class LayoutDefaulter: private TraversingVisitor +{ +private: + InterfaceLayout *in_iface = 0; + bool need_winding = true; + bool need_spacing = true; + +public: + void apply(Stage &); + +private: + virtual void visit(InterfaceLayout &); +}; + +/** +Assigns sizes to arrays which don't have a size. Geometry shader inputs are +sized by topology. Other arrays are sized by their use with literal indices. +*/ +class ArraySizer: private TraversingVisitor +{ +private: + std::map max_indices; + unsigned input_size = 0; + VariableDeclaration *r_declaration; + +public: + void apply(Stage &); + +private: + virtual void visit(VariableReference &); + virtual void visit(MemberAccess &); + virtual void visit(Swizzle &); + virtual void visit(UnaryExpression&); + virtual void visit(BinaryExpression &); + virtual void visit(TernaryExpression &); + virtual void visit(FunctionCall &); + virtual void visit(InterfaceLayout &); + virtual void visit(VariableDeclaration &); +}; + } // namespace SL } // namespace GL } // namespace Msp