blob: 65256157100cc1794f838bcd351fd6dc4b4b1fe8 [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.coma60160b2012-11-28 19:41:15 +000011#include "libGLESv2/renderer/renderer9_utils.h" // D3D9_REPLACE
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000012
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000013#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000014#include "libEGL/Surface.h"
15
16#include "libGLESv2/Framebuffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
18static DWORD currentTLS = TLS_OUT_OF_INDEXES;
19
daniel@transgaming.comfad16ed2012-10-17 18:24:01 +000020extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021{
22 switch (reason)
23 {
24 case DLL_PROCESS_ATTACH:
25 {
26 currentTLS = TlsAlloc();
27
28 if (currentTLS == TLS_OUT_OF_INDEXES)
29 {
30 return FALSE;
31 }
32 }
33 // Fall throught to initialize index
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000034 case DLL_THREAD_ATTACH:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035 {
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000036 gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current));
37
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000038 if (current)
39 {
40 TlsSetValue(currentTLS, current);
41
42 current->context = NULL;
43 current->display = NULL;
44 }
45 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000046 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000047 case DLL_THREAD_DETACH:
48 {
49 void *current = TlsGetValue(currentTLS);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000050
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000051 if (current)
52 {
53 LocalFree((HLOCAL)current);
54 }
55 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000056 break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 case DLL_PROCESS_DETACH:
58 {
59 void *current = TlsGetValue(currentTLS);
60
61 if (current)
62 {
63 LocalFree((HLOCAL)current);
64 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000065
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066 TlsFree(currentTLS);
67 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000068 break;
69 default:
70 break;
71 }
72
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073 return TRUE;
74}
75
76namespace gl
77{
78void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
79{
80 Current *current = (Current*)TlsGetValue(currentTLS);
81
82 current->context = context;
83 current->display = display;
84
85 if (context && display && surface)
86 {
daniel@transgaming.comad629872012-11-28 19:32:06 +000087 context->makeCurrent(surface);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000088 }
89}
90
91Context *getContext()
92{
93 Current *current = (Current*)TlsGetValue(currentTLS);
94
95 return current->context;
96}
97
daniel@transgaming.com9d788502011-11-09 17:46:55 +000098Context *getNonLostContext()
99{
100 Context *context = getContext();
101
daniel@transgaming.com82b28912011-12-12 21:01:35 +0000102 if (context)
103 {
104 if (context->isContextLost())
105 {
106 error(GL_OUT_OF_MEMORY);
107 return NULL;
108 }
109 else
110 {
111 return context;
112 }
113 }
daniel@transgaming.com9d788502011-11-09 17:46:55 +0000114 return NULL;
115}
116
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000117egl::Display *getDisplay()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118{
119 Current *current = (Current*)TlsGetValue(currentTLS);
daniel@transgaming.comae072af2010-05-05 18:47:28 +0000120
121 return current->display;
122}
123
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000124}
125
126// Records an error code
127void error(GLenum errorCode)
128{
129 gl::Context *context = glGetCurrentContext();
130
131 if (context)
132 {
133 switch (errorCode)
134 {
135 case GL_INVALID_ENUM:
136 context->recordInvalidEnum();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000137 TRACE("\t! Error generated: invalid enum\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000138 break;
139 case GL_INVALID_VALUE:
140 context->recordInvalidValue();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000141 TRACE("\t! Error generated: invalid value\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142 break;
143 case GL_INVALID_OPERATION:
144 context->recordInvalidOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000145 TRACE("\t! Error generated: invalid operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146 break;
147 case GL_OUT_OF_MEMORY:
148 context->recordOutOfMemory();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000149 TRACE("\t! Error generated: out of memory\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150 break;
151 case GL_INVALID_FRAMEBUFFER_OPERATION:
152 context->recordInvalidFramebufferOperation();
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000153 TRACE("\t! Error generated: invalid framebuffer operation\n");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154 break;
155 default: UNREACHABLE();
156 }
157 }
158}