blob: 50e2593328d188c131edefffac1d64f66e7afd68 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002//
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +00003// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// main.cpp: DLL entry point and management of thread-local data.
9
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000010#include "libGLESv2/main.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000012#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
14static DWORD currentTLS = TLS_OUT_OF_INDEXES;
15
Jamie Madillbbb43c12013-12-09 17:04:29 -050016namespace gl
17{
18
19Current *AllocateCurrent()
20{
21 Current *current = (Current*)LocalAlloc(LPTR, sizeof(Current));
22
23 if (!current)
24 {
25 ERR("Could not allocate thread local storage.");
26 return NULL;
27 }
28
29 ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
30 TlsSetValue(currentTLS, current);
31
32 current->context = NULL;
33 current->display = NULL;
34
35 return current;
36}
37
38void DeallocateCurrent()
39{
40 void *current = TlsGetValue(currentTLS);
41
42 if (current)
43 {
44 LocalFree((HLOCAL)current);
45 }
46}
47
48}
49
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +000050extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051{
52 switch (reason)
53 {
54 case DLL_PROCESS_ATTACH:
55 {
56 currentTLS = TlsAlloc();
57
58 if (currentTLS == TLS_OUT_OF_INDEXES)
59 {
60 return FALSE;
61 }
62 }
63 // Fall throught to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000064 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000065 {
Jamie Madillbbb43c12013-12-09 17:04:29 -050066 gl::AllocateCurrent();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000067 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000068 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069 case DLL_THREAD_DETACH:
70 {
Jamie Madillbbb43c12013-12-09 17:04:29 -050071 gl::DeallocateCurrent();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000072 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000073 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074 case DLL_PROCESS_DETACH:
75 {
Jamie Madillbbb43c12013-12-09 17:04:29 -050076 gl::DeallocateCurrent();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 TlsFree(currentTLS);
78 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000079 break;
80 default:
81 break;
82 }
83
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084 return TRUE;
85}
86
87namespace gl
88{
Jamie Madillbbb43c12013-12-09 17:04:29 -050089
90Current *GetCurrentData()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091{
92 Current *current = (Current*)TlsGetValue(currentTLS);
93
Jamie Madillbbb43c12013-12-09 17:04:29 -050094 // ANGLE issue 488: when the dll is loaded after thread initialization,
95 // thread local storage (current) might not exist yet.
96 return (current ? current : AllocateCurrent());
97}
98
99void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
100{
101 Current *current = GetCurrentData();
102
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000103 current->context = context;
104 current->display = display;
105
106 if (context && display && surface)
107 {
daniel@transgaming.comad629872012-11-28 19:32:06 +0000108 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109 }
110}
111
112Context *getContext()
113{
Jamie Madillbbb43c12013-12-09 17:04:29 -0500114 Current *current = GetCurrentData();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000115
116 return current->context;
117}
118
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000119Context *getNonLostContext()
120{
121 Context *context = getContext();
122
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000123 if (context)
124 {
125 if (context->isContextLost())
126 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000127 gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000128 return NULL;
129 }
130 else
131 {
132 return context;
133 }
134 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000135 return NULL;
136}
137
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000138egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139{
Jamie Madillbbb43c12013-12-09 17:04:29 -0500140 Current *current = GetCurrentData();
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000141
142 return current->display;
143}
144
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145// Records an error code
146void error(GLenum errorCode)
147{
148 gl::Context *context = glGetCurrentContext();
149
150 if (context)
151 {
152 switch (errorCode)
153 {
154 case GL_INVALID_ENUM:
155 context->recordInvalidEnum();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000156 TRACE("\t! Error generated: invalid enum\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000157 break;
158 case GL_INVALID_VALUE:
159 context->recordInvalidValue();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000160 TRACE("\t! Error generated: invalid value\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161 break;
162 case GL_INVALID_OPERATION:
163 context->recordInvalidOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000164 TRACE("\t! Error generated: invalid operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000165 break;
166 case GL_OUT_OF_MEMORY:
167 context->recordOutOfMemory();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000168 TRACE("\t! Error generated: out of memory\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000169 break;
170 case GL_INVALID_FRAMEBUFFER_OPERATION:
171 context->recordInvalidFramebufferOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000172 TRACE("\t! Error generated: invalid framebuffer operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000173 break;
174 default: UNREACHABLE();
175 }
176 }
177}
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000178
179}
180