blob: c26fc70ada217ac0dc2c2644f04e13f1c6070a34 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
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 "main.h"
10
11#include "Framebuffer.h"
12#include "Surface.h"
13#include "debug.h"
14
15static DWORD currentTLS = TLS_OUT_OF_INDEXES;
16
17BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
18{
19 switch (reason)
20 {
21 case DLL_PROCESS_ATTACH:
22 {
23 currentTLS = TlsAlloc();
24
25 if (currentTLS == TLS_OUT_OF_INDEXES)
26 {
27 return FALSE;
28 }
29 }
30 // Fall throught to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000031 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000033 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
34
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035 if (current)
36 {
37 TlsSetValue(currentTLS, current);
38
39 current->context = NULL;
40 current->display = NULL;
41 }
42 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000043 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044 case DLL_THREAD_DETACH:
45 {
46 void *current = TlsGetValue(currentTLS);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000047
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048 if (current)
49 {
50 LocalFree((HLOCAL)current);
51 }
52 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000053 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000054 case DLL_PROCESS_DETACH:
55 {
56 void *current = TlsGetValue(currentTLS);
57
58 if (current)
59 {
60 LocalFree((HLOCAL)current);
61 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000062
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063 TlsFree(currentTLS);
64 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000065 break;
66 default:
67 break;
68 }
69
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070 return TRUE;
71}
72
73namespace gl
74{
75void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
76{
77 Current *current = (Current*)TlsGetValue(currentTLS);
78
79 current->context = context;
80 current->display = display;
81
82 if (context && display && surface)
83 {
84 context->makeCurrent(display, surface);
85 }
86}
87
88Context *getContext()
89{
90 Current *current = (Current*)TlsGetValue(currentTLS);
91
92 return current->context;
93}
94
95IDirect3DDevice9 *getDevice()
96{
97 Current *current = (Current*)TlsGetValue(currentTLS);
98 egl::Display *display = current->display;
99
100 return display->getDevice();
101}
102}
103
104// Records an error code
105void error(GLenum errorCode)
106{
107 gl::Context *context = glGetCurrentContext();
108
109 if (context)
110 {
111 switch (errorCode)
112 {
113 case GL_INVALID_ENUM:
114 context->recordInvalidEnum();
115 gl::trace("\t! Error generated: invalid enum\n");
116 break;
117 case GL_INVALID_VALUE:
118 context->recordInvalidValue();
119 gl::trace("\t! Error generated: invalid value\n");
120 break;
121 case GL_INVALID_OPERATION:
122 context->recordInvalidOperation();
123 gl::trace("\t! Error generated: invalid operation\n");
124 break;
125 case GL_OUT_OF_MEMORY:
126 context->recordOutOfMemory();
127 gl::trace("\t! Error generated: out of memory\n");
128 break;
129 case GL_INVALID_FRAMEBUFFER_OPERATION:
130 context->recordInvalidFramebufferOperation();
131 gl::trace("\t! Error generated: invalid framebuffer operation\n");
132 break;
133 default: UNREACHABLE();
134 }
135 }
136}