1 #include "precompiled.h"
3 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
8 // main.cpp: DLL entry point and management of thread-local data.
10 #include "libGLESv2/main.h"
11 #include "libGLESv2/Context.h"
13 #include "common/tls.h"
15 static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
20 Current *AllocateCurrent()
22 ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
23 if (currentTLS == TLS_OUT_OF_INDEXES)
28 Current *current = new Current();
29 current->context = NULL;
30 current->display = NULL;
32 if (!SetTLSValue(currentTLS, current))
34 ERR("Could not set thread local storage.");
41 void DeallocateCurrent()
43 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
45 SetTLSValue(currentTLS, NULL);
50 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
54 case DLL_PROCESS_ATTACH:
56 currentTLS = CreateTLSIndex();
57 if (currentTLS == TLS_OUT_OF_INDEXES)
62 // Fall through to initialize index
63 case DLL_THREAD_ATTACH:
65 gl::AllocateCurrent();
68 case DLL_THREAD_DETACH:
70 gl::DeallocateCurrent();
73 case DLL_PROCESS_DETACH:
75 gl::DeallocateCurrent();
76 DestroyTLSIndex(currentTLS);
89 Current *GetCurrentData()
91 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
93 // ANGLE issue 488: when the dll is loaded after thread initialization,
94 // thread local storage (current) might not exist yet.
95 return (current ? current : AllocateCurrent());
98 void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
100 Current *current = GetCurrentData();
102 current->context = context;
103 current->display = display;
105 if (context && display && surface)
107 context->makeCurrent(surface);
111 Context *getContext()
113 Current *current = GetCurrentData();
115 return current->context;
118 Context *getNonLostContext()
120 Context *context = getContext();
124 if (context->isContextLost())
126 gl::error(GL_OUT_OF_MEMORY);
137 egl::Display *getDisplay()
139 Current *current = GetCurrentData();
141 return current->display;
144 // Records an error code
145 void error(GLenum errorCode)
147 gl::Context *context = glGetCurrentContext();
153 case GL_INVALID_ENUM:
154 context->recordInvalidEnum();
155 TRACE("\t! Error generated: invalid enum\n");
157 case GL_INVALID_VALUE:
158 context->recordInvalidValue();
159 TRACE("\t! Error generated: invalid value\n");
161 case GL_INVALID_OPERATION:
162 context->recordInvalidOperation();
163 TRACE("\t! Error generated: invalid operation\n");
165 case GL_OUT_OF_MEMORY:
166 context->recordOutOfMemory();
167 TRACE("\t! Error generated: out of memory\n");
169 case GL_INVALID_FRAMEBUFFER_OPERATION:
170 context->recordInvalidFramebufferOperation();
171 TRACE("\t! Error generated: invalid framebuffer operation\n");
173 default: UNREACHABLE();