OSDN Git Service

d77b784ebcf5402547b3ba26d6749a7f933bf54f
[android-x86/external-swiftshader.git] / src / OpenGL / libGLESv2 / 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 "libGLESv2.hpp"\r
17 #include "Framebuffer.h"\r
18 #include "libEGL/main.h"\r
19 #include "libEGL/Surface.h"\r
20 #include "Common/Thread.hpp"\r
21 #include "Common/SharedLibrary.hpp"\r
22 #include "common/debug.h"\r
23 \r
24 #if !defined(_MSC_VER)\r
25 #define CONSTRUCTOR __attribute__((constructor))\r
26 #define DESTRUCTOR __attribute__((destructor))\r
27 #else\r
28 #define CONSTRUCTOR\r
29 #define DESTRUCTOR\r
30 #endif\r
31 \r
32 static void glAttachThread()\r
33 {\r
34     TRACE("()");\r
35 }\r
36 \r
37 static void glDetachThread()\r
38 {\r
39     TRACE("()");\r
40 }\r
41 \r
42 CONSTRUCTOR static void glAttachProcess()\r
43 {\r
44     TRACE("()");\r
45 \r
46     glAttachThread();\r
47 }\r
48 \r
49 DESTRUCTOR static void glDetachProcess()\r
50 {\r
51     TRACE("()");\r
52 \r
53         glDetachThread();\r
54 }\r
55 \r
56 #if defined(_WIN32)\r
57 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)\r
58 {\r
59     switch(reason)\r
60     {\r
61     case DLL_PROCESS_ATTACH:\r
62         glAttachProcess();\r
63         break;\r
64     case DLL_THREAD_ATTACH:\r
65         glAttachThread();\r
66         break;\r
67     case DLL_THREAD_DETACH:\r
68         glDetachThread();\r
69         break;\r
70     case DLL_PROCESS_DETACH:\r
71         glDetachProcess();\r
72         break;\r
73     default:\r
74         break;\r
75     }\r
76 \r
77     return TRUE;\r
78 }\r
79 #endif\r
80 \r
81 namespace es2\r
82 {\r
83 es2::Context *getContext()\r
84 {\r
85         egl::Context *context = libEGL->clientGetCurrentContext();\r
86 \r
87         if(context && (context->getClientVersion() == 2 ||\r
88                        context->getClientVersion() == 3))\r
89         {\r
90                 return static_cast<es2::Context*>(context);\r
91         }\r
92 \r
93         return 0;\r
94 }\r
95 \r
96 egl::Display *getDisplay()\r
97 {\r
98     return libEGL->clientGetCurrentDisplay();\r
99 }\r
100 \r
101 Device *getDevice()\r
102 {\r
103     Context *context = getContext();\r
104 \r
105     return context ? context->getDevice() : 0;\r
106 }\r
107 \r
108 // Records an error code\r
109 void error(GLenum errorCode)\r
110 {\r
111     es2::Context *context = es2::getContext();\r
112 \r
113     if(context)\r
114     {\r
115         switch(errorCode)\r
116         {\r
117         case GL_INVALID_ENUM:\r
118             context->recordInvalidEnum();\r
119             TRACE("\t! Error generated: invalid enum\n");\r
120             break;\r
121         case GL_INVALID_VALUE:\r
122             context->recordInvalidValue();\r
123             TRACE("\t! Error generated: invalid value\n");\r
124             break;\r
125         case GL_INVALID_OPERATION:\r
126             context->recordInvalidOperation();\r
127             TRACE("\t! Error generated: invalid operation\n");\r
128             break;\r
129         case GL_OUT_OF_MEMORY:\r
130             context->recordOutOfMemory();\r
131             TRACE("\t! Error generated: out of memory\n");\r
132             break;\r
133         case GL_INVALID_FRAMEBUFFER_OPERATION:\r
134             context->recordInvalidFramebufferOperation();\r
135             TRACE("\t! Error generated: invalid framebuffer operation\n");\r
136             break;\r
137         default: UNREACHABLE();\r
138         }\r
139     }\r
140 }\r
141 }\r
142 \r
143 namespace egl\r
144 {\r
145 GLint getClientVersion()\r
146 {\r
147         Context *context = libEGL->clientGetCurrentContext();\r
148 \r
149     return context ? context->getClientVersion() : 0;\r
150 }\r
151 }\r
152 \r
153 egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *shareContext, int clientVersion);\r
154 extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);\r
155 egl::Image *createBackBuffer(int width, int height, const egl::Config *config);\r
156 egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);\r
157 sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);\r
158 \r
159 LibGLESv2exports::LibGLESv2exports()\r
160 {\r
161         this->es2CreateContext = ::es2CreateContext;\r
162         this->es2GetProcAddress = ::es2GetProcAddress;\r
163         this->createBackBuffer = ::createBackBuffer;\r
164         this->createDepthStencil = ::createDepthStencil;\r
165         this->createFrameBuffer = ::createFrameBuffer;\r
166 }\r
167 \r
168 extern "C" LibGLESv2exports *libGLESv2exports()\r
169 {\r
170         static LibGLESv2exports libGLESv2;\r
171         return &libGLESv2;\r
172 }\r
173 \r
174 LibEGL libEGL;\r
175 LibGLES_CM libGLES_CM;