Added mechanism to predefine associated macros for extensions. Also refactored the way extension behavior is initialized and updated.
Please note that I still need to add validation that appropriate extensions are enabled before using an extension function.
BUG=25
Review URL: http://codereview.appspot.com/2139042

git-svn-id: https://angleproject.googlecode.com/svn/trunk@413 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/ShaderLang.cpp b/src/compiler/ShaderLang.cpp
index e0c646a..de213d8 100644
--- a/src/compiler/ShaderLang.cpp
+++ b/src/compiler/ShaderLang.cpp
@@ -23,7 +23,8 @@
         TInfoSink& infoSink, TSymbolTable& symbolTable)
 {
     TIntermediate intermediate(infoSink);
-    TParseContext parseContext(symbolTable, intermediate, language, spec, infoSink);
+    TExtensionBehavior extBehavior;
+    TParseContext parseContext(symbolTable, extBehavior, intermediate, language, spec, infoSink);
 
     GlobalParseContext = &parseContext;
 
@@ -79,6 +80,14 @@
     return InitializeSymbolTable(builtIns.getBuiltInStrings(), language, spec, resources, infoSink, symbolTable);
 }
 
+static void DefineExtensionMacros(const TExtensionBehavior& extBehavior)
+{
+    for (TExtensionBehavior::const_iterator iter = extBehavior.begin();
+         iter != extBehavior.end(); ++iter) {
+        PredefineIntMacro(iter->first.c_str(), 1);
+    }
+}
+
 //
 // This is the platform independent interface between an OGL driver
 // and the shading language compiler.
@@ -144,6 +153,7 @@
         ShDestruct(base);
         return 0;
     }
+    InitExtensionBehavior(*resources, compiler->getExtensionBehavior());
 
     return reinterpret_cast<void*>(base);
 }
@@ -196,14 +206,16 @@
 
     TIntermediate intermediate(infoSink);
     TSymbolTable& symbolTable = compiler->getSymbolTable();
+    const TExtensionBehavior& extBehavior = compiler->getExtensionBehavior();
 
-    TParseContext parseContext(symbolTable, intermediate, compiler->getLanguage(), compiler->getSpec(), infoSink);
-    parseContext.initializeExtensionBehavior();
+    TParseContext parseContext(symbolTable, extBehavior, intermediate,
+        compiler->getLanguage(), compiler->getSpec(), infoSink);
     GlobalParseContext = &parseContext;
  
     setInitialState();
 
     InitPreprocessor();
+    DefineExtensionMacros(extBehavior);
     //
     // Parse the application's shaders.  All the following symbol table
     // work will be throw-away, so push a new allocation scope that can