2 // Copyright (c) 2002-2012 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"
10 #include "libGLESv2/Context.h"
12 #include "common/tls.h"
14 static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
19 Current *AllocateCurrent()
21 ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
22 if (currentTLS == TLS_OUT_OF_INDEXES)
27 Current *current = new Current();
28 current->context = NULL;
29 current->display = NULL;
31 if (!SetTLSValue(currentTLS, current))
33 ERR("Could not set thread local storage.");
40 void DeallocateCurrent()
42 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
44 SetTLSValue(currentTLS, NULL);
49 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
53 case DLL_PROCESS_ATTACH:
55 currentTLS = CreateTLSIndex();
56 if (currentTLS == TLS_OUT_OF_INDEXES)
61 // Fall through to initialize index
62 case DLL_THREAD_ATTACH:
64 gl::AllocateCurrent();
67 case DLL_THREAD_DETACH:
69 gl::DeallocateCurrent();
72 case DLL_PROCESS_DETACH:
74 gl::DeallocateCurrent();
75 DestroyTLSIndex(currentTLS);
88 Current *GetCurrentData()
90 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
92 // ANGLE issue 488: when the dll is loaded after thread initialization,
93 // thread local storage (current) might not exist yet.
94 return (current ? current : AllocateCurrent());
97 void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
99 Current *current = GetCurrentData();
101 current->context = context;
102 current->display = display;
104 if (context && display && surface)
106 context->makeCurrent(surface);
110 Context *getContext()
112 Current *current = GetCurrentData();
114 return current->context;
117 Context *getNonLostContext()
119 Context *context = getContext();
123 if (context->isContextLost())
125 gl::error(GL_OUT_OF_MEMORY);
136 egl::Display *getDisplay()
138 Current *current = GetCurrentData();
140 return current->display;
143 // Records an error code
144 void error(GLenum errorCode)
146 gl::Context *context = glGetCurrentContext();
147 context->recordError(Error(errorCode));
151 case GL_INVALID_ENUM:
152 TRACE("\t! Error generated: invalid enum\n");
154 case GL_INVALID_VALUE:
155 TRACE("\t! Error generated: invalid value\n");
157 case GL_INVALID_OPERATION:
158 TRACE("\t! Error generated: invalid operation\n");
160 case GL_OUT_OF_MEMORY:
161 TRACE("\t! Error generated: out of memory\n");
163 case GL_INVALID_FRAMEBUFFER_OPERATION:
164 TRACE("\t! Error generated: invalid framebuffer operation\n");
166 default: UNREACHABLE();