blob: 97b99565f7ec75d069f1f89b931789c922fbc312 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +00002// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// main.cpp: DLL entry point and management of thread-local data.
8
daniel@transgaming.combbf56f72010-04-20 18:52:13 +00009#include "libGLESv2/main.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010
shannon.woods@transgaming.com486d9e92013-02-28 23:15:41 +000011#include "libGLESv2/Context.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
13static DWORD currentTLS = TLS_OUT_OF_INDEXES;
14
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +000015extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016{
17 switch (reason)
18 {
19 case DLL_PROCESS_ATTACH:
20 {
21 currentTLS = TlsAlloc();
22
23 if (currentTLS == TLS_OUT_OF_INDEXES)
24 {
25 return FALSE;
26 }
27 }
28 // Fall throught to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000029 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000031 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
32
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033 if (current)
34 {
35 TlsSetValue(currentTLS, current);
36
37 current->context = NULL;
38 current->display = NULL;
39 }
40 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000041 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000042 case DLL_THREAD_DETACH:
43 {
44 void *current = TlsGetValue(currentTLS);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000045
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000046 if (current)
47 {
48 LocalFree((HLOCAL)current);
49 }
50 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000051 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052 case DLL_PROCESS_DETACH:
53 {
54 void *current = TlsGetValue(currentTLS);
55
56 if (current)
57 {
58 LocalFree((HLOCAL)current);
59 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000060
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000061 TlsFree(currentTLS);
62 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000063 break;
64 default:
65 break;
66 }
67
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 return TRUE;
69}
70
71namespace gl
72{
73void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
74{
75 Current *current = (Current*)TlsGetValue(currentTLS);
76
77 current->context = context;
78 current->display = display;
79
80 if (context && display && surface)
81 {
daniel@transgaming.comad629872012-11-28 19:32:06 +000082 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083 }
84}
85
86Context *getContext()
87{
88 Current *current = (Current*)TlsGetValue(currentTLS);
89
90 return current->context;
91}
92
daniel@transgaming.com9d788502011-11-09 17:46:55 +000093Context *getNonLostContext()
94{
95 Context *context = getContext();
96
daniel@transgaming.com82b28912011-12-12 21:01:35 +000097 if (context)
98 {
99 if (context->isContextLost())
100 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000101 gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000102 return NULL;
103 }
104 else
105 {
106 return context;
107 }
108 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000109 return NULL;
110}
111
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000112egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000113{
114 Current *current = (Current*)TlsGetValue(currentTLS);
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000115
116 return current->display;
117}
118
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000119// Records an error code
120void error(GLenum errorCode)
121{
122 gl::Context *context = glGetCurrentContext();
123
124 if (context)
125 {
126 switch (errorCode)
127 {
128 case GL_INVALID_ENUM:
129 context->recordInvalidEnum();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000130 TRACE("\t! Error generated: invalid enum\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131 break;
132 case GL_INVALID_VALUE:
133 context->recordInvalidValue();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000134 TRACE("\t! Error generated: invalid value\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135 break;
136 case GL_INVALID_OPERATION:
137 context->recordInvalidOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000138 TRACE("\t! Error generated: invalid operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000139 break;
140 case GL_OUT_OF_MEMORY:
141 context->recordOutOfMemory();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000142 TRACE("\t! Error generated: out of memory\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143 break;
144 case GL_INVALID_FRAMEBUFFER_OPERATION:
145 context->recordInvalidFramebufferOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000146 TRACE("\t! Error generated: invalid framebuffer operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000147 break;
148 default: UNREACHABLE();
149 }
150 }
151}
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000152
153}
154