Initial import from TransGaming

git-svn-id: https://angleproject.googlecode.com/svn/trunk@2 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/libGLESv2/main.cpp b/libGLESv2/main.cpp
new file mode 100644
index 0000000..d729038
--- /dev/null
+++ b/libGLESv2/main.cpp
@@ -0,0 +1,136 @@
+//
+// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// main.cpp: DLL entry point and management of thread-local data.
+
+#include "main.h"
+
+#include "Framebuffer.h"
+#include "Surface.h"
+#include "debug.h"
+
+static DWORD currentTLS = TLS_OUT_OF_INDEXES;
+
+BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
+{
+    switch (reason)
+    {
+      case DLL_PROCESS_ATTACH:
+        {
+            currentTLS = TlsAlloc();
+
+            if (currentTLS == TLS_OUT_OF_INDEXES)
+            {
+                return FALSE;
+            }
+        }
+        // Fall throught to initialize index
+      case DLL_THREAD_ATTACH: 
+        {
+            gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current)); 
+            
+            if (current)
+            {
+                TlsSetValue(currentTLS, current);
+
+                current->context = NULL;
+                current->display = NULL;
+            }
+        }
+        break; 
+      case DLL_THREAD_DETACH:
+        {
+            void *current = TlsGetValue(currentTLS);
+        
+            if (current)
+            {
+                LocalFree((HLOCAL)current);
+            }
+        }
+        break; 
+      case DLL_PROCESS_DETACH:
+        {
+            void *current = TlsGetValue(currentTLS);
+
+            if (current)
+            {
+                LocalFree((HLOCAL)current);
+            }
+ 
+            TlsFree(currentTLS);
+        }
+        break; 
+      default: 
+        break; 
+    } 
+ 
+    return TRUE;
+}
+
+namespace gl
+{
+void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
+{
+    Current *current = (Current*)TlsGetValue(currentTLS);
+
+    current->context = context;
+    current->display = display;
+
+    if (context && display && surface)
+    {
+        context->makeCurrent(display, surface);
+    }
+}
+
+Context *getContext()
+{
+    Current *current = (Current*)TlsGetValue(currentTLS);
+
+    return current->context;
+}
+
+IDirect3DDevice9 *getDevice()
+{
+    Current *current = (Current*)TlsGetValue(currentTLS);
+    egl::Display *display = current->display;
+
+    return display->getDevice();
+}
+}
+
+// Records an error code
+void error(GLenum errorCode)
+{
+    gl::Context *context = glGetCurrentContext();
+
+    if (context)
+    {
+        switch (errorCode)
+        {
+          case GL_INVALID_ENUM:
+            context->recordInvalidEnum();
+            gl::trace("\t! Error generated: invalid enum\n");
+            break;
+          case GL_INVALID_VALUE:
+            context->recordInvalidValue();
+            gl::trace("\t! Error generated: invalid value\n");
+            break;
+          case GL_INVALID_OPERATION:
+            context->recordInvalidOperation();
+            gl::trace("\t! Error generated: invalid operation\n");
+            break;
+          case GL_OUT_OF_MEMORY:
+            context->recordOutOfMemory();
+            gl::trace("\t! Error generated: out of memory\n");
+            break;
+          case GL_INVALID_FRAMEBUFFER_OPERATION:
+            context->recordInvalidFramebufferOperation();
+            gl::trace("\t! Error generated: invalid framebuffer operation\n");
+            break;
+          default: UNREACHABLE();
+        }
+    }
+}