Home | History | Annotate | Download | only in libEGL
      1 //
      2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
      3 // 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 
      9 #include "libEGL/main.h"
     10 
     11 #include "common/debug.h"
     12 
     13 static DWORD currentTLS = TLS_OUT_OF_INDEXES;
     14 
     15 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
     16 {
     17     switch (reason)
     18     {
     19       case DLL_PROCESS_ATTACH:
     20         {
     21             #ifndef NDEBUG
     22                 FILE *debug = fopen("debug.txt", "rt");
     23 
     24                 if (debug)
     25                 {
     26                     fclose(debug);
     27                     debug = fopen("debug.txt", "wt");   // Erase
     28                     fclose(debug);
     29                 }
     30             #endif
     31 
     32             currentTLS = TlsAlloc();
     33 
     34             if (currentTLS == TLS_OUT_OF_INDEXES)
     35             {
     36                 return FALSE;
     37             }
     38         }
     39         // Fall throught to initialize index
     40       case DLL_THREAD_ATTACH:
     41         {
     42             egl::Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
     43 
     44             if (current)
     45             {
     46                 TlsSetValue(currentTLS, current);
     47 
     48                 current->error = EGL_SUCCESS;
     49                 current->API = EGL_OPENGL_ES_API;
     50                 current->display = EGL_NO_DISPLAY;
     51                 current->drawSurface = EGL_NO_SURFACE;
     52                 current->readSurface = EGL_NO_SURFACE;
     53             }
     54         }
     55         break;
     56       case DLL_THREAD_DETACH:
     57         {
     58             void *current = TlsGetValue(currentTLS);
     59 
     60             if (current)
     61             {
     62                 LocalFree((HLOCAL)current);
     63             }
     64         }
     65         break;
     66       case DLL_PROCESS_DETACH:
     67         {
     68             void *current = TlsGetValue(currentTLS);
     69 
     70             if (current)
     71             {
     72                 LocalFree((HLOCAL)current);
     73             }
     74 
     75             TlsFree(currentTLS);
     76         }
     77         break;
     78       default:
     79         break;
     80     }
     81 
     82     return TRUE;
     83 }
     84 
     85 namespace egl
     86 {
     87 void setCurrentError(EGLint error)
     88 {
     89     Current *current = (Current*)TlsGetValue(currentTLS);
     90 
     91     current->error = error;
     92 }
     93 
     94 EGLint getCurrentError()
     95 {
     96     Current *current = (Current*)TlsGetValue(currentTLS);
     97 
     98     return current->error;
     99 }
    100 
    101 void setCurrentAPI(EGLenum API)
    102 {
    103     Current *current = (Current*)TlsGetValue(currentTLS);
    104 
    105     current->API = API;
    106 }
    107 
    108 EGLenum getCurrentAPI()
    109 {
    110     Current *current = (Current*)TlsGetValue(currentTLS);
    111 
    112     return current->API;
    113 }
    114 
    115 void setCurrentDisplay(EGLDisplay dpy)
    116 {
    117     Current *current = (Current*)TlsGetValue(currentTLS);
    118 
    119     current->display = dpy;
    120 }
    121 
    122 EGLDisplay getCurrentDisplay()
    123 {
    124     Current *current = (Current*)TlsGetValue(currentTLS);
    125 
    126     return current->display;
    127 }
    128 
    129 void setCurrentDrawSurface(EGLSurface surface)
    130 {
    131     Current *current = (Current*)TlsGetValue(currentTLS);
    132 
    133     current->drawSurface = surface;
    134 }
    135 
    136 EGLSurface getCurrentDrawSurface()
    137 {
    138     Current *current = (Current*)TlsGetValue(currentTLS);
    139 
    140     return current->drawSurface;
    141 }
    142 
    143 void setCurrentReadSurface(EGLSurface surface)
    144 {
    145     Current *current = (Current*)TlsGetValue(currentTLS);
    146 
    147     current->readSurface = surface;
    148 }
    149 
    150 EGLSurface getCurrentReadSurface()
    151 {
    152     Current *current = (Current*)TlsGetValue(currentTLS);
    153 
    154     return current->readSurface;
    155 }
    156 }
    157 
    158 void error(EGLint errorCode)
    159 {
    160     egl::setCurrentError(errorCode);
    161 }
    162