14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 211190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// main.cpp: DLL entry point and management of thread-local data. 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 9bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include "libEGL/main.h" 104f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 11ea0e1af4c3db538081d776e4ec1a588ca82cb9d9alokp@chromium.org#include "common/debug.h" 1244fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang#include "common/tls.h" 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1444fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Langstatic TLSIndex currentTLS = TLS_OUT_OF_INDEXES; 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 16a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madillnamespace egl 17a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill{ 18a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 19a4e68d432b1b0355800627eee6ff4a96866ae162Jamie MadillCurrent *AllocateCurrent() 20a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill{ 2144fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang ASSERT(currentTLS != TLS_OUT_OF_INDEXES); 2244fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang if (currentTLS == TLS_OUT_OF_INDEXES) 23a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill { 24a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill return NULL; 25a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill } 26a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 2744fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang Current *current = new Current(); 28a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill current->error = EGL_SUCCESS; 29a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill current->API = EGL_OPENGL_ES_API; 30a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill current->display = EGL_NO_DISPLAY; 31a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill current->drawSurface = EGL_NO_SURFACE; 32a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill current->readSurface = EGL_NO_SURFACE; 33a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 3444fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang if (!SetTLSValue(currentTLS, current)) 3544fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang { 3644fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang ERR("Could not set thread local storage."); 3744fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang return NULL; 3844fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang } 3944fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang 40a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill return current; 41a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill} 42a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 43a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madillvoid DeallocateCurrent() 44a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill{ 4544fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS)); 4644fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang SafeDelete(current); 4744fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang SetTLSValue(currentTLS, NULL); 48a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill} 49a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 50a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill} 51a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 52fad16ed45a5b558becc44cd2352a0cca16ade546daniel@transgaming.comextern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) 534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com switch (reason) 554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_PROCESS_ATTACH: 574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 58f571312409c7895c23ecbf01f9f5f042f0966d35Geoff Lang#if defined(ANGLE_ENABLE_TRACE) 590f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org FILE *debug = fopen(TRACE_OUTPUT_FILE, "rt"); 600f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org 610f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org if (debug) 620f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org { 630f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org fclose(debug); 640f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org debug = fopen(TRACE_OUTPUT_FILE, "wt"); // Erase 6511190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com 6611190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com if (debug) 6711190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com { 6811190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com fclose(debug); 6911190ec66113c17dd6774143c8e491bb25230f86daniel@transgaming.com } 700f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org } 710f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org#endif 724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 7344fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang currentTLS = CreateTLSIndex(); 744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (currentTLS == TLS_OUT_OF_INDEXES) 754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return FALSE; 774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 7944fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang // Fall through to initialize index 804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_THREAD_ATTACH: 814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 82a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill egl::AllocateCurrent(); 834f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 84fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_THREAD_DETACH: 864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 87a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill egl::DeallocateCurrent(); 884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 89fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_PROCESS_DETACH: 914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 92a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill egl::DeallocateCurrent(); 9344fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang DestroyTLSIndex(currentTLS); 944f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 95fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 96fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com default: 97fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 98fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com } 99fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com 1004f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return TRUE; 1014f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1024f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1034f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace egl 1044f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 105a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 106a4e68d432b1b0355800627eee6ff4a96866ae162Jamie MadillCurrent *GetCurrentData() 1074f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 10844fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang Current *current = reinterpret_cast<Current*>(GetTLSValue(currentTLS)); 1094f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 110a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill // ANGLE issue 488: when the dll is loaded after thread initialization, 111a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill // thread local storage (current) might not exist yet. 112a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill return (current ? current : AllocateCurrent()); 113a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill} 114a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 115a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madillvoid setCurrentError(EGLint error) 116a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill{ 117a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 118a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill 1194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->error = error; 1204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLint getCurrentError() 1234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 124a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 1254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return current->error; 1274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid setCurrentAPI(EGLenum API) 1304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 131a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 1324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->API = API; 1344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 1354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comEGLenum getCurrentAPI() 1374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 138a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 1394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return current->API; 1414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 142e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 143e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comvoid setCurrentDisplay(EGLDisplay dpy) 144e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 145a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 146e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 147e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com current->display = dpy; 148e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 149e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 150e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comEGLDisplay getCurrentDisplay() 151e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 152a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 153e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 154e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com return current->display; 155e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 156e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 157e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comvoid setCurrentDrawSurface(EGLSurface surface) 158e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 159a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 160e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 161e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com current->drawSurface = surface; 162e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 163e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 164e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comEGLSurface getCurrentDrawSurface() 165e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 166a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 167e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 168e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com return current->drawSurface; 169e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 170e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 171e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comvoid setCurrentReadSurface(EGLSurface surface) 172e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 173a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 174e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 175e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com current->readSurface = surface; 176e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 177e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 178e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.comEGLSurface getCurrentReadSurface() 179e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com{ 180a4e68d432b1b0355800627eee6ff4a96866ae162Jamie Madill Current *current = GetCurrentData(); 181e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com 182e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com return current->readSurface; 183e37888d1534ce97db0afccf53d79b128b914a763daniel@transgaming.com} 1844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid error(EGLint errorCode) 1864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com egl::setCurrentError(errorCode); 1884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 189779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com 190779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com} 191