OSDN Git Service

Implement a Radiance prototype.
[android-x86/external-swiftshader.git] / src / Radiance / libRAD / main.cpp
1 // SwiftShader Software Renderer\r
2 //\r
3 // Copyright(c) 2005-2013 TransGaming Inc.\r
4 //\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,\r
6 // transcribed, stored in a retrieval system, translated into any human or computer\r
7 // language by any means, or disclosed to third parties without the explicit written\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express\r
9 // or implied, including but not limited to any patent rights, are granted to you.\r
10 //\r
11 \r
12 // main.cpp: DLL entry point and management of thread-local data.\r
13 \r
14 #include "main.h"\r
15 \r
16 #include "Framebuffer.h"\r
17 #include "libEGL/Surface.h"\r
18 #include "Common/Thread.hpp"\r
19 #include "Common/SharedLibrary.hpp"\r
20 #include "common/debug.h"\r
21 \r
22 #if !defined(_MSC_VER)\r
23 #define CONSTRUCTOR __attribute__((constructor))\r
24 #define DESTRUCTOR __attribute__((destructor))\r
25 #else\r
26 #define CONSTRUCTOR\r
27 #define DESTRUCTOR\r
28 #endif\r
29 \r
30 static void glAttachThread()\r
31 {\r
32     TRACE("()");\r
33 }\r
34 \r
35 static void glDetachThread()\r
36 {\r
37     TRACE("()");\r
38 }\r
39 \r
40 CONSTRUCTOR static bool glAttachProcess()\r
41 {\r
42     TRACE("()");\r
43 \r
44     glAttachThread();\r
45 \r
46     #if defined(_WIN32)\r
47         const char *libEGL_lib = "libEGL.dll";\r
48         #else\r
49         const char *libEGL_lib = "libEGL.so.1";\r
50         #endif\r
51 \r
52         libEGL = loadLibrary(libEGL_lib);\r
53         egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "clientGetCurrentContext");\r
54         egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "clientGetCurrentDisplay");\r
55 \r
56     return libEGL != 0;\r
57 }\r
58 \r
59 DESTRUCTOR static void glDetachProcess()\r
60 {\r
61     TRACE("()");\r
62 \r
63         glDetachThread();\r
64         freeLibrary(libEGL);\r
65 }\r
66 \r
67 #if defined(_WIN32)\r
68 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)\r
69 {\r
70     switch(reason)\r
71     {\r
72     case DLL_PROCESS_ATTACH:\r
73         return glAttachProcess();\r
74         break;\r
75     case DLL_THREAD_ATTACH:\r
76         glAttachThread();\r
77         break;\r
78     case DLL_THREAD_DETACH:\r
79         glDetachThread();\r
80         break;\r
81     case DLL_PROCESS_DETACH:\r
82         glDetachProcess();\r
83         break;\r
84     default:\r
85         break;\r
86     }\r
87 \r
88     return TRUE;\r
89 }\r
90 #endif\r
91 \r
92 namespace es2\r
93 {\r
94 es2::Context *getContext()\r
95 {\r
96         egl::Context *context = egl::getCurrentContext();\r
97         \r
98         if(context && context->getClientVersion() == 2)\r
99         {\r
100                 return static_cast<es2::Context*>(context);\r
101         }\r
102         \r
103         return 0;\r
104 }\r
105 \r
106 egl::Display *getDisplay()\r
107 {\r
108     return egl::getCurrentDisplay();\r
109 }\r
110 \r
111 Device *getDevice()\r
112 {\r
113     Context *context = getContext();\r
114 \r
115     return context ? context->getDevice() : 0;\r
116 }\r
117 }\r
118 \r
119 namespace egl\r
120 {\r
121 GLint getClientVersion()\r
122 {\r
123         Context *context = egl::getCurrentContext();\r
124 \r
125     return context ? context->getClientVersion() : 0;\r
126 }\r
127 }\r
128 \r
129 // Records an error code\r
130 void error(GLenum errorCode)\r
131 {\r
132     es2::Context *context = es2::getContext();\r
133 \r
134     if(context)\r
135     {\r
136         switch(errorCode)\r
137         {\r
138         case GL_INVALID_ENUM:\r
139             context->recordInvalidEnum();\r
140             TRACE("\t! Error generated: invalid enum\n");\r
141             break;\r
142         case GL_INVALID_VALUE:\r
143             context->recordInvalidValue();\r
144             TRACE("\t! Error generated: invalid value\n");\r
145             break;\r
146         case GL_INVALID_OPERATION:\r
147             context->recordInvalidOperation();\r
148             TRACE("\t! Error generated: invalid operation\n");\r
149             break;\r
150         case GL_OUT_OF_MEMORY:\r
151             context->recordOutOfMemory();\r
152             TRACE("\t! Error generated: out of memory\n");\r
153             break;\r
154         case GL_INVALID_FRAMEBUFFER_OPERATION:\r
155             context->recordInvalidFramebufferOperation();\r
156             TRACE("\t! Error generated: invalid framebuffer operation\n");\r
157             break;\r
158         default: UNREACHABLE();\r
159         }\r
160     }\r
161 }\r
162 \r
163 namespace egl\r
164 {\r
165         egl::Context *(*getCurrentContext)() = 0;\r
166         egl::Display *(*getCurrentDisplay)() = 0;\r
167 }\r
168 \r
169 void *libEGL = 0;   // Handle to the libEGL module\r