blob: 09d64ec1637f7ed888dd23ee741c2839a92acd69 [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.com78d44862011-11-09 17:46:33 +000010#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000012#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000013
14#include "libGLESv2/Framebuffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000015
16static DWORD currentTLS = TLS_OUT_OF_INDEXES;
17
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +000018extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019{
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
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000032 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000033 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000034 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
35
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000036 if (current)
37 {
38 TlsSetValue(currentTLS, current);
39
40 current->context = NULL;
41 current->display = NULL;
42 }
43 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000044 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000045 case DLL_THREAD_DETACH:
46 {
47 void *current = TlsGetValue(currentTLS);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000048
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049 if (current)
50 {
51 LocalFree((HLOCAL)current);
52 }
53 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000054 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055 case DLL_PROCESS_DETACH:
56 {
57 void *current = TlsGetValue(currentTLS);
58
59 if (current)
60 {
61 LocalFree((HLOCAL)current);
62 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000063
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000064 TlsFree(currentTLS);
65 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000066 break;
67 default:
68 break;
69 }
70
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000071 return TRUE;
72}
73
74namespace gl
75{
76void 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 {
daniel@transgaming.comad629872012-11-28 19:32:06 +000085 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000086 }
87}
88
89Context *getContext()
90{
91 Current *current = (Current*)TlsGetValue(currentTLS);
92
93 return current->context;
94}
95
daniel@transgaming.com9d788502011-11-09 17:46:55 +000096Context *getNonLostContext()
97{
98 Context *context = getContext();
99
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000100 if (context)
101 {
102 if (context->isContextLost())
103 {
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000104 gl::error(GL_OUT_OF_MEMORY);
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000105 return NULL;
106 }
107 else
108 {
109 return context;
110 }
111 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000112 return NULL;
113}
114
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000115egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116{
117 Current *current = (Current*)TlsGetValue(currentTLS);
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000118
119 return current->display;
120}
121
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122// Records an error code
123void error(GLenum errorCode)
124{
125 gl::Context *context = glGetCurrentContext();
126
127 if (context)
128 {
129 switch (errorCode)
130 {
131 case GL_INVALID_ENUM:
132 context->recordInvalidEnum();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000133 TRACE("\t! Error generated: invalid enum\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134 break;
135 case GL_INVALID_VALUE:
136 context->recordInvalidValue();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000137 TRACE("\t! Error generated: invalid value\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138 break;
139 case GL_INVALID_OPERATION:
140 context->recordInvalidOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 TRACE("\t! Error generated: invalid operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142 break;
143 case GL_OUT_OF_MEMORY:
144 context->recordOutOfMemory();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000145 TRACE("\t! Error generated: out of memory\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146 break;
147 case GL_INVALID_FRAMEBUFFER_OPERATION:
148 context->recordInvalidFramebufferOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000149 TRACE("\t! Error generated: invalid framebuffer operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150 break;
151 default: UNREACHABLE();
152 }
153 }
154}
shannon.woods@transgaming.com779aa262013-02-28 23:04:58 +0000155
156}
157