Implemented function prototyping and in/out parameters
TRAC #11725
Signed-off-by: Shannon Woods
Signed-off-by: Daniel Koch

Author:    Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@120 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index 9875f0a..fdb7f49 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -870,6 +870,34 @@
             out << ", ";
         }
         break;
+      case EOpPrototype:
+        if (visit == PreVisit)
+        {
+            out << typeString(node->getType()) << " " << node->getName() << "(";
+
+            TIntermSequence &arguments = node->getSequence();
+
+            for (unsigned int i = 0; i < arguments.size(); i++)
+            {
+                TIntermSymbol *symbol = arguments[i]->getAsSymbolNode();
+
+                if (symbol)
+                {
+                    out << argumentString(symbol);
+
+                    if (i < arguments.size() - 1)
+                    {
+                        out << ", ";
+                    }
+                }
+                else UNREACHABLE();
+            }
+
+            out << ");\n";
+
+            return false;
+        }
+        break;
       case EOpComma:         UNIMPLEMENTED(); /* FIXME */ out << "Comma\n"; return true;
       case EOpFunction:
         {
@@ -893,10 +921,7 @@
 
                     if (symbol)
                     {
-                        const TType &type = symbol->getType();
-                        const TString &name = symbol->getSymbol();
-
-                        out << typeString(type) + " " + name;
+                        out << argumentString(symbol);
 
                         if (i < arguments.size() - 1)
                         {
@@ -1477,6 +1502,29 @@
     }
 }
 
+TString OutputHLSL::argumentString(const TIntermSymbol *symbol)
+{
+    TQualifier qualifier = symbol->getQualifier();
+    const TType &type = symbol->getType();
+    const TString &name = symbol->getSymbol();
+
+    return qualifierString(qualifier) + " " + typeString(type) + " " + name + arrayString(type);
+}
+
+TString OutputHLSL::qualifierString(TQualifier qualifier)
+{
+    switch(qualifier)
+    {
+      case EvqIn:            return "in";
+      case EvqOut:           return "out";
+      case EvqInOut:         return "inout";
+      case EvqConstReadOnly: return "const";
+      default: UNREACHABLE();
+    }
+
+    return "";
+}
+
 TString OutputHLSL::typeString(const TType &type)
 {
     if (type.getBasicType() == EbtStruct)