blob: 459c58aaa5dd97947c1fb55f75c18bc8658047b2 [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"
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000011#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
Geoff Lang44fa7592014-05-30 11:50:07 -040013#include "common/tls.h"
14
15static TLSIndex currentTLS = TLS_OUT_OF_INDEXES;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
Jamie Madill7a934372013-12-06 18:17:48 -050017namespace gl
18{
19
20Current *AllocateCurrent()
21{
Geoff Lang44fa7592014-05-30 11:50:07 -040022 ASSERT(currentTLS != TLS_OUT_OF_INDEXES);
23 if (currentTLS == TLS_OUT_OF_INDEXES)
Jamie Madill7a934372013-12-06 18:17:48 -050024 {
Jamie Madill7a934372013-12-06 18:17:48 -050025 return NULL;
26 }
27
Geoff Lang44fa7592014-05-30 11:50:07 -040028 Current *current = new Current();
Jamie Madill7a934372013-12-06 18:17:48 -050029 current->context = NULL;
30 current->display = NULL;
31
Geoff Lang44fa7592014-05-30 11:50:07 -040032 if (!SetTLSValue(currentTLS, current))
33 {
34 ERR("Could not set thread local storage.");
35 return NULL;
36 }
37
Jamie Madill7a934372013-12-06 18:17:48 -050038 return current;
39}
40
41void DeallocateCurrent()
42{
Geoff Lang44fa7592014-05-30 11:50:07 -040043 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
44 SafeDelete(current);
45 SetTLSValue(currentTLS, NULL);
Jamie Madill7a934372013-12-06 18:17:48 -050046}
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 {
Geoff Lang44fa7592014-05-30 11:50:07 -040056 currentTLS = CreateTLSIndex();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 if (currentTLS == TLS_OUT_OF_INDEXES)
58 {
59 return FALSE;
60 }
61 }
Geoff Lang44fa7592014-05-30 11:50:07 -040062 // Fall through to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000063 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064 {
Jamie Madill7a934372013-12-06 18:17:48 -050065 gl::AllocateCurrent();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000067 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 case DLL_THREAD_DETACH:
69 {
Jamie Madill7a934372013-12-06 18:17:48 -050070 gl::DeallocateCurrent();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000072 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 case DLL_PROCESS_DETACH:
74 {
Jamie Madill7a934372013-12-06 18:17:48 -050075 gl::DeallocateCurrent();
Geoff Lang44fa7592014-05-30 11:50:07 -040076 DestroyTLSIndex(currentTLS);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000077 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000078 break;
79 default:
80 break;
81 }
82
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083 return TRUE;
84}
85
86namespace gl
87{
Jamie Madill7a934372013-12-06 18:17:48 -050088
89Current *GetCurrentData()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000090{
Geoff Lang44fa7592014-05-30 11:50:07 -040091 Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000092
Jamie Madill7a934372013-12-06 18:17:48 -050093 // 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());
96}
97
98void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
99{
100 Current *current = GetCurrentData();
101
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000102 current->context = context;
103 current->display = display;
104
105 if (context && display && surface)
106 {
daniel@transgaming.comad629872012-11-28 19:32:06 +0000107 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000108 }
109}
110
111Context *getContext()
112{
Jamie Madill7a934372013-12-06 18:17:48 -0500113 Current *current = GetCurrentData();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114
115 return current->context;
116}
117
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000118Context *getNonLostContext()
119{
120 Context *context = getContext();
Geoff Lang44fa7592014-05-30 11:50:07 -0400121
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000122 if (context)
123 {
124 if (context->isContextLost())
125 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000126 gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000127 return NULL;
128 }
129 else
130 {
131 return context;
132 }
133 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000134 return NULL;
135}
136
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000137egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138{
Jamie Madill7a934372013-12-06 18:17:48 -0500139 Current *current = GetCurrentData();
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000140
141 return current->display;
142}
143
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144// Records an error code
145void error(GLenum errorCode)
146{
147 gl::Context *context = glGetCurrentContext();
Geoff Langda5777c2014-07-11 09:52:58 -0400148 context->recordError(Error(errorCode));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149
Geoff Langda5777c2014-07-11 09:52:58 -0400150 switch (errorCode)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151 {
Geoff Langda5777c2014-07-11 09:52:58 -0400152 case GL_INVALID_ENUM:
153 TRACE("\t! Error generated: invalid enum\n");
154 break;
155 case GL_INVALID_VALUE:
156 TRACE("\t! Error generated: invalid value\n");
157 break;
158 case GL_INVALID_OPERATION:
159 TRACE("\t! Error generated: invalid operation\n");
160 break;
161 case GL_OUT_OF_MEMORY:
162 TRACE("\t! Error generated: out of memory\n");
163 break;
164 case GL_INVALID_FRAMEBUFFER_OPERATION:
165 TRACE("\t! Error generated: invalid framebuffer operation\n");
166 break;
167 default: UNREACHABLE();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 }
169}
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000170
171}
172