blob: 6d7a241340f9e7b947b3179589b6532ee1073bcc [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
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +000016extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017{
18 switch (reason)
19 {
20 case DLL_PROCESS_ATTACH:
21 {
22 currentTLS = TlsAlloc();
23
24 if (currentTLS == TLS_OUT_OF_INDEXES)
25 {
26 return FALSE;
27 }
28 }
29 // Fall throught to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000030 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000031 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000032 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
33
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034 if (current)
35 {
36 TlsSetValue(currentTLS, current);
37
38 current->context = NULL;
39 current->display = NULL;
40 }
41 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000042 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000043 case DLL_THREAD_DETACH:
44 {
45 void *current = TlsGetValue(currentTLS);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000046
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047 if (current)
48 {
49 LocalFree((HLOCAL)current);
50 }
51 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000052 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000053 case DLL_PROCESS_DETACH:
54 {
55 void *current = TlsGetValue(currentTLS);
56
57 if (current)
58 {
59 LocalFree((HLOCAL)current);
60 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000061
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000062 TlsFree(currentTLS);
63 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000064 break;
65 default:
66 break;
67 }
68
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069 return TRUE;
70}
71
72namespace gl
73{
74void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
75{
76 Current *current = (Current*)TlsGetValue(currentTLS);
77
78 current->context = context;
79 current->display = display;
80
81 if (context && display && surface)
82 {
daniel@transgaming.comad629872012-11-28 19:32:06 +000083 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000084 }
85}
86
87Context *getContext()
88{
89 Current *current = (Current*)TlsGetValue(currentTLS);
90
91 return current->context;
92}
93
daniel@transgaming.com9d788502011-11-09 17:46:55 +000094Context *getNonLostContext()
95{
96 Context *context = getContext();
97
daniel@transgaming.com82b28912011-12-12 21:01:35 +000098 if (context)
99 {
100 if (context->isContextLost())
101 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000102 gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000103 return NULL;
104 }
105 else
106 {
107 return context;
108 }
109 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000110 return NULL;
111}
112
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000113egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000114{
115 Current *current = (Current*)TlsGetValue(currentTLS);
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000116
117 return current->display;
118}
119
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000120// Records an error code
121void error(GLenum errorCode)
122{
123 gl::Context *context = glGetCurrentContext();
124
125 if (context)
126 {
127 switch (errorCode)
128 {
129 case GL_INVALID_ENUM:
130 context->recordInvalidEnum();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000131 TRACE("\t! Error generated: invalid enum\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132 break;
133 case GL_INVALID_VALUE:
134 context->recordInvalidValue();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000135 TRACE("\t! Error generated: invalid value\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136 break;
137 case GL_INVALID_OPERATION:
138 context->recordInvalidOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000139 TRACE("\t! Error generated: invalid operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140 break;
141 case GL_OUT_OF_MEMORY:
142 context->recordOutOfMemory();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000143 TRACE("\t! Error generated: out of memory\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144 break;
145 case GL_INVALID_FRAMEBUFFER_OPERATION:
146 context->recordInvalidFramebufferOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000147 TRACE("\t! Error generated: invalid framebuffer operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 break;
149 default: UNREACHABLE();
150 }
151 }
152}
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000153
154}
155