gfx/angle/src/libGLESv2/main.cpp

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:23b2cc6d9ee9
1 #include "precompiled.h"
2 //
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.
6 //
7
8 // main.cpp: DLL entry point and management of thread-local data.
9
10 #include "libGLESv2/main.h"
11
12 #include "libGLESv2/Context.h"
13
14 static DWORD currentTLS = TLS_OUT_OF_INDEXES;
15
16 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
17 {
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
30 case DLL_THREAD_ATTACH:
31 {
32 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
33
34 if (current)
35 {
36 TlsSetValue(currentTLS, current);
37
38 current->context = NULL;
39 current->display = NULL;
40 }
41 }
42 break;
43 case DLL_THREAD_DETACH:
44 {
45 void *current = TlsGetValue(currentTLS);
46
47 if (current)
48 {
49 LocalFree((HLOCAL)current);
50 }
51 }
52 break;
53 case DLL_PROCESS_DETACH:
54 {
55 void *current = TlsGetValue(currentTLS);
56
57 if (current)
58 {
59 LocalFree((HLOCAL)current);
60 }
61
62 TlsFree(currentTLS);
63 }
64 break;
65 default:
66 break;
67 }
68
69 return TRUE;
70 }
71
72 namespace gl
73 {
74 void 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 {
83 context->makeCurrent(surface);
84 }
85 }
86
87 Context *getContext()
88 {
89 Current *current = (Current*)TlsGetValue(currentTLS);
90
91 return current->context;
92 }
93
94 Context *getNonLostContext()
95 {
96 Context *context = getContext();
97
98 if (context)
99 {
100 if (context->isContextLost())
101 {
102 gl::error(GL_OUT_OF_MEMORY);
103 return NULL;
104 }
105 else
106 {
107 return context;
108 }
109 }
110 return NULL;
111 }
112
113 egl::Display *getDisplay()
114 {
115 Current *current = (Current*)TlsGetValue(currentTLS);
116
117 return current->display;
118 }
119
120 // Records an error code
121 void 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();
131 TRACE("\t! Error generated: invalid enum\n");
132 break;
133 case GL_INVALID_VALUE:
134 context->recordInvalidValue();
135 TRACE("\t! Error generated: invalid value\n");
136 break;
137 case GL_INVALID_OPERATION:
138 context->recordInvalidOperation();
139 TRACE("\t! Error generated: invalid operation\n");
140 break;
141 case GL_OUT_OF_MEMORY:
142 context->recordOutOfMemory();
143 TRACE("\t! Error generated: out of memory\n");
144 break;
145 case GL_INVALID_FRAMEBUFFER_OPERATION:
146 context->recordInvalidFramebufferOperation();
147 TRACE("\t! Error generated: invalid framebuffer operation\n");
148 break;
149 default: UNREACHABLE();
150 }
151 }
152 }
153
154 }
155

mercurial