2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
7 // main.cpp: DLL entry point and management of thread-local data.
9 #include "libGLESv2/main.h"
11 #include "common/debug.h"
12 #include "libEGL/Surface.h"
14 #include "libGLESv2/Framebuffer.h"
16 static DWORD currentTLS = TLS_OUT_OF_INDEXES;
18 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
22 case DLL_PROCESS_ATTACH:
24 currentTLS = TlsAlloc();
26 if (currentTLS == TLS_OUT_OF_INDEXES)
31 // Fall throught to initialize index
32 case DLL_THREAD_ATTACH:
34 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
38 TlsSetValue(currentTLS, current);
40 current->context = NULL;
41 current->display = NULL;
45 case DLL_THREAD_DETACH:
47 void *current = TlsGetValue(currentTLS);
51 LocalFree((HLOCAL)current);
55 case DLL_PROCESS_DETACH:
57 void *current = TlsGetValue(currentTLS);
61 LocalFree((HLOCAL)current);
76 void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
78 Current *current = (Current*)TlsGetValue(currentTLS);
80 current->context = context;
81 current->display = display;
83 if (context && display && surface)
85 context->makeCurrent(display, surface);
91 Current *current = (Current*)TlsGetValue(currentTLS);
93 return current->context;
96 egl::Display *getDisplay()
98 Current *current = (Current*)TlsGetValue(currentTLS);
100 return current->display;
103 IDirect3DDevice9 *getDevice()
105 egl::Display *display = getDisplay();
107 return display->getDevice();
111 // Records an error code
112 void error(GLenum errorCode)
114 gl::Context *context = glGetCurrentContext();
120 case GL_INVALID_ENUM:
121 context->recordInvalidEnum();
122 TRACE("\t! Error generated: invalid enum\n");
124 case GL_INVALID_VALUE:
125 context->recordInvalidValue();
126 TRACE("\t! Error generated: invalid value\n");
128 case GL_INVALID_OPERATION:
129 context->recordInvalidOperation();
130 TRACE("\t! Error generated: invalid operation\n");
132 case GL_OUT_OF_MEMORY:
133 context->recordOutOfMemory();
134 TRACE("\t! Error generated: out of memory\n");
136 case GL_INVALID_FRAMEBUFFER_OPERATION:
137 context->recordInvalidFramebufferOperation();
138 TRACE("\t! Error generated: invalid framebuffer operation\n");
140 default: UNREACHABLE();