Added support for loops.
Review URL: http://codereview.appspot.com/802047

git-svn-id: https://angleproject.googlecode.com/svn/trunk@91 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/OutputGLSL.cpp b/src/compiler/OutputGLSL.cpp
index b997c5e..925c5be 100644
--- a/src/compiler/OutputGLSL.cpp
+++ b/src/compiler/OutputGLSL.cpp
@@ -467,8 +467,49 @@
 
 bool TOutputGLSL::visitLoop(Visit visit, TIntermLoop* node)
 {
-    UNIMPLEMENTED();
-    return true;
+    TInfoSinkBase& out = objSink();
+
+    // Loop header.
+    if (node->testFirst())  // for loop
+    {
+        out << "for (";
+        if (node->getInit())
+            node->getInit()->traverse(this);
+        out << "; ";
+
+        ASSERT(node->getTest() != NULL);
+        node->getTest()->traverse(this);
+        out << "; ";
+
+        if (node->getTerminal())
+            node->getTerminal()->traverse(this);
+        out << ") {\n";
+    }
+    else  // do-while loop
+    {
+        out << "do {\n";
+    }
+
+    // Loop body.
+    if (node->getBody())
+        node->getBody()->traverse(this);
+
+    // Loop footer.
+    if (node->testFirst())  // for loop
+    {
+        out << "}\n";
+    }
+    else  // do-while loop
+    {
+        out << "} while (";
+        ASSERT(node->getTest() != NULL);
+        node->getTest()->traverse(this);
+        out << ");\n";
+    }
+
+    // No need to visit children. They have been already processed in
+    // this function.
+    return false;
 }
 
 bool TOutputGLSL::visitBranch(Visit visit, TIntermBranch* node)