X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fcompiler.h;h=6448ae6cfa6fe962dc5097ffcf2011f835ebbaf9;hp=1f3cbee4698c466a7b88b562d56373f7f9b0fb6e;hb=c1d3a1d7c1997bc71a30af2e2c25cb4a2b66784b;hpb=30465dd3b9f55ec42c4b19c3c2077eede7237a26 diff --git a/source/glsl/compiler.h b/source/glsl/compiler.h index 1f3cbee4..6448ae6c 100644 --- a/source/glsl/compiler.h +++ b/source/glsl/compiler.h @@ -21,6 +21,23 @@ public: }; private: + enum OptimizeResult + { + NEXT_STAGE, + REDO_STAGE, + REDO_PREVIOUS + }; + + enum ResolveFlags + { + RESOLVE_BLOCKS = 1, + RESOLVE_TYPES = 2, + RESOLVE_VARIABLES = 4, + RESOLVE_EXPRESSIONS = 8, + RESOLVE_FUNCTIONS = 16, + RESOLVE_ALL = 31 + }; + Features features; Module *module; std::vector imported_names; @@ -88,6 +105,10 @@ public: Intended for debugging purposes. */ std::string get_stage_debug(Stage::Type) const; + /** Returns diagnostics from compilation. The output is intended to be + viewed by humans. */ + std::string get_diagnostics() const; + private: /** Appends a module to the target, processing any imports found in it. */ void append_module(Module &, DataFile::Collection *); @@ -102,9 +123,19 @@ private: variables. */ void generate(Stage &, Mode); - /** Applies optimizations to a stage. The return value indicates if the - preceding stage should be processed again. */ - bool optimize(Stage &); + template + bool resolve(Stage &, unsigned &, unsigned); + + /** Resolves various references between nodes. Flags can be specified to + request resolving particular aspects. Resolving may ripple into other + aspects as necessary. */ + void resolve(Stage &, unsigned = RESOLVE_ALL); + + bool validate(Stage &); + + /** Applies optimizations to a stage. The return value indicates which + stage should be optimized next. */ + OptimizeResult optimize(Stage &); /** Performs final adjustments on a stage after compilation. */ void finalize(Stage &, Mode);