1bdf2d80f459d43f5a6df074431bacf41584f81b7shannon.woods@transgaming.com#include "precompiled.h" 24f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 3fad16ed45a5b558becc44cd2352a0cca16ade546daniel@transgaming.com// Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be 54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file. 64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// main.cpp: DLL entry point and management of thread-local data. 94f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 10bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#include "libGLESv2/main.h" 114f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 12486d9e9b6b4ed31f66d2624b8e822020fe40a1f7shannon.woods@transgaming.com#include "libGLESv2/Context.h" 134f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comstatic DWORD currentTLS = TLS_OUT_OF_INDEXES; 154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 16fad16ed45a5b558becc44cd2352a0cca16ade546daniel@transgaming.comextern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) 174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 184f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com switch (reason) 194f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_PROCESS_ATTACH: 214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com currentTLS = TlsAlloc(); 234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (currentTLS == TLS_OUT_OF_INDEXES) 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return FALSE; 274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com // Fall throught to initialize index 30fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com case DLL_THREAD_ATTACH: 314f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 32fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com gl::Current *current = (gl::Current*)LocalAlloc(LPTR, sizeof(gl::Current)); 33fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com 344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (current) 354f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TlsSetValue(currentTLS, current); 374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->context = NULL; 394f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->display = NULL; 404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 42fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 434f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_THREAD_DETACH: 444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com void *current = TlsGetValue(currentTLS); 46fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com 474f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (current) 484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com LocalFree((HLOCAL)current); 504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 52fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 534f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case DLL_PROCESS_DETACH: 544f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 554f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com void *current = TlsGetValue(currentTLS); 564f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 574f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (current) 584f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 594f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com LocalFree((HLOCAL)current); 604f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 61fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com 624f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TlsFree(currentTLS); 634f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 64fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 65fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com default: 66fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com break; 67fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com } 68fab5a1ae7809758c6c2fd4a39f3cc5122b262c32daniel@transgaming.com 694f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return TRUE; 704f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 714f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 724f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comnamespace gl 734f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 744f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid makeCurrent(Context *context, egl::Display *display, egl::Surface *surface) 754f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 764f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com Current *current = (Current*)TlsGetValue(currentTLS); 774f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 784f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->context = context; 794f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com current->display = display; 804f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 814f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (context && display && surface) 824f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 83ad62987f1ef6e34ed362e7a7ee125ffcd1690241daniel@transgaming.com context->makeCurrent(surface); 844f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 854f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 864f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 874f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comContext *getContext() 884f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 894f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com Current *current = (Current*)TlsGetValue(currentTLS); 904f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 914f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com return current->context; 924f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 934f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 949d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.comContext *getNonLostContext() 959d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com{ 969d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com Context *context = getContext(); 979d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com 9882b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com if (context) 9982b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com { 10082b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com if (context->isContextLost()) 10182b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com { 102779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com gl::error(GL_OUT_OF_MEMORY); 10382b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com return NULL; 10482b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com } 10582b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com else 10682b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com { 10782b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com return context; 10882b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com } 10982b289138e7a818d343429d52023e3e2e560142edaniel@transgaming.com } 1109d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com return NULL; 1119d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com} 1129d78850211eddee0ffdd6d02d7eecbb2bbf9a854daniel@transgaming.com 113ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.comegl::Display *getDisplay() 1144f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1154f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com Current *current = (Current*)TlsGetValue(currentTLS); 116ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com 117ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com return current->display; 118ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com} 119ae072afe19ea491e1008318c9a659e5c07a27a11daniel@transgaming.com 1204f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Records an error code 1214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.comvoid error(GLenum errorCode) 1224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com{ 1234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com gl::Context *context = glGetCurrentContext(); 1244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 1254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com if (context) 1264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 1274f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com switch (errorCode) 1284f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com { 1294f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case GL_INVALID_ENUM: 1304f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com context->recordInvalidEnum(); 1310f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org TRACE("\t! Error generated: invalid enum\n"); 1324f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com break; 1334f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case GL_INVALID_VALUE: 1344f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com context->recordInvalidValue(); 1350f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org TRACE("\t! Error generated: invalid value\n"); 1364f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com break; 1374f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case GL_INVALID_OPERATION: 1384f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com context->recordInvalidOperation(); 1390f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org TRACE("\t! Error generated: invalid operation\n"); 1404f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com break; 1414f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case GL_OUT_OF_MEMORY: 1424f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com context->recordOutOfMemory(); 1430f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org TRACE("\t! Error generated: out of memory\n"); 1444f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com break; 1454f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com case GL_INVALID_FRAMEBUFFER_OPERATION: 1464f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com context->recordInvalidFramebufferOperation(); 1470f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org TRACE("\t! Error generated: invalid framebuffer operation\n"); 1484f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com break; 1494f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com default: UNREACHABLE(); 1504f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 1514f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com } 1524f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com} 153779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com 154779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com} 155779aa2618c1333c034768f3a4ca7826a14753b60shannon.woods@transgaming.com 156