X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fcompiler.h;h=e30bd709bb2aadef5cd585e114f6fdb6bc7f5ac8;hb=a3637962f082182d72998a35ea86e48d51e520c3;hp=64cbac4f7cefd801d1c8f38667d488995a0cd6da;hpb=f7b29fcfe408965c9cba79095eb05c49eca4a98e;p=libs%2Fgl.git diff --git a/source/glsl/compiler.h b/source/glsl/compiler.h index 64cbac4f..e30bd709 100644 --- a/source/glsl/compiler.h +++ b/source/glsl/compiler.h @@ -24,12 +24,24 @@ 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; + bool compiled; bool specialized; std::map spec_values; @@ -94,6 +106,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 *); @@ -106,7 +122,25 @@ private: /** Generates any implicitly defines syntactic structures and resolves variables. */ - void generate(Stage &, Mode); + void generate(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); + + /** Runs validators on a stage. Diagnostic messages are recorded in the + stage for later inspection. */ + void validate(Stage &); + + /** Checks a stage's recorded diagnostics for errors. If any are found, + returns true. */ + bool check_errors(Stage &); + + static bool diagnostic_line_order(const Diagnostic &, const Diagnostic &); /** Applies optimizations to a stage. The return value indicates which stage should be optimized next. */