initial import
[vuplus_webkit] / Source / ThirdParty / ANGLE / src / libGLESv2 / main.cpp
1 //
2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3 // 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
9 #include "libGLESv2/main.h"
10
11 #include "common/debug.h"
12 #include "libEGL/Surface.h"
13
14 #include "libGLESv2/Framebuffer.h"
15
16 static DWORD currentTLS = TLS_OUT_OF_INDEXES;
17
18 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
19 {
20     switch (reason)
21     {
22       case DLL_PROCESS_ATTACH:
23         {
24             currentTLS = TlsAlloc();
25
26             if (currentTLS == TLS_OUT_OF_INDEXES)
27             {
28                 return FALSE;
29             }
30         }
31         // Fall throught to initialize index
32       case DLL_THREAD_ATTACH:
33         {
34             gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
35
36             if (current)
37             {
38                 TlsSetValue(currentTLS, current);
39
40                 current->context = NULL;
41                 current->display = NULL;
42             }
43         }
44         break;
45       case DLL_THREAD_DETACH:
46         {
47             void *current = TlsGetValue(currentTLS);
48
49             if (current)
50             {
51                 LocalFree((HLOCAL)current);
52             }
53         }
54         break;
55       case DLL_PROCESS_DETACH:
56         {
57             void *current = TlsGetValue(currentTLS);
58
59             if (current)
60             {
61                 LocalFree((HLOCAL)current);
62             }
63
64             TlsFree(currentTLS);
65         }
66         break;
67       default:
68         break;
69     }
70
71     return TRUE;
72 }
73
74 namespace gl
75 {
76 void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
77 {
78     Current *current = (Current*)TlsGetValue(currentTLS);
79
80     current->context = context;
81     current->display = display;
82
83     if (context && display && surface)
84     {
85         context->makeCurrent(display, surface);
86     }
87 }
88
89 Context *getContext()
90 {
91     Current *current = (Current*)TlsGetValue(currentTLS);
92
93     return current->context;
94 }
95
96 egl::Display *getDisplay()
97 {
98     Current *current = (Current*)TlsGetValue(currentTLS);
99
100     return current->display;
101 }
102
103 IDirect3DDevice9 *getDevice()
104 {
105     egl::Display *display = getDisplay();
106
107     return display->getDevice();
108 }
109 }
110
111 // Records an error code
112 void error(GLenum errorCode)
113 {
114     gl::Context *context = glGetCurrentContext();
115
116     if (context)
117     {
118         switch (errorCode)
119         {
120           case GL_INVALID_ENUM:
121             context->recordInvalidEnum();
122             TRACE("\t! Error generated: invalid enum\n");
123             break;
124           case GL_INVALID_VALUE:
125             context->recordInvalidValue();
126             TRACE("\t! Error generated: invalid value\n");
127             break;
128           case GL_INVALID_OPERATION:
129             context->recordInvalidOperation();
130             TRACE("\t! Error generated: invalid operation\n");
131             break;
132           case GL_OUT_OF_MEMORY:
133             context->recordOutOfMemory();
134             TRACE("\t! Error generated: out of memory\n");
135             break;
136           case GL_INVALID_FRAMEBUFFER_OPERATION:
137             context->recordInvalidFramebufferOperation();
138             TRACE("\t! Error generated: invalid framebuffer operation\n");
139             break;
140           default: UNREACHABLE();
141         }
142     }
143 }