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