OSDN Git Service

Predefine (E)GL export macros.
[android-x86/external-swiftshader.git] / src / OpenGL / libGLES_CM / 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 "libGLES_CM.hpp"\r
17 #include "Framebuffer.h"\r
18 #include "libEGL/Surface.h"\r
19 #include "Common/Thread.hpp"\r
20 #include "Common/SharedLibrary.hpp"\r
21 #include "common/debug.h"\r
22 \r
23 #include <GLES/glext.h>\r
24 \r
25 #if !defined(_MSC_VER)\r
26 #define CONSTRUCTOR __attribute__((constructor))\r
27 #define DESTRUCTOR __attribute__((destructor))\r
28 #else\r
29 #define CONSTRUCTOR\r
30 #define DESTRUCTOR\r
31 #endif\r
32 \r
33 static void glAttachThread()\r
34 {\r
35     TRACE("()");\r
36 }\r
37 \r
38 static void glDetachThread()\r
39 {\r
40     TRACE("()");\r
41 }\r
42 \r
43 CONSTRUCTOR static void glAttachProcess()\r
44 {\r
45     TRACE("()");\r
46 \r
47     glAttachThread();\r
48 }\r
49 \r
50 DESTRUCTOR static void glDetachProcess()\r
51 {\r
52     TRACE("()");\r
53 \r
54         glDetachThread();\r
55 }\r
56 \r
57 #if defined(_WIN32)\r
58 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)\r
59 {\r
60     switch(reason)\r
61     {\r
62     case DLL_PROCESS_ATTACH:\r
63         glAttachProcess();\r
64         break;\r
65     case DLL_THREAD_ATTACH:\r
66         glAttachThread();\r
67         break;\r
68     case DLL_THREAD_DETACH:\r
69         glDetachThread();\r
70         break;\r
71     case DLL_PROCESS_DETACH:\r
72         glDetachProcess();\r
73         break;\r
74     default:\r
75         break;\r
76     }\r
77 \r
78     return TRUE;\r
79 }\r
80 #endif\r
81 \r
82 namespace es1\r
83 {\r
84 es1::Context *getContext()\r
85 {\r
86         egl::Context *context = libEGL->clientGetCurrentContext();\r
87 \r
88         if(context && context->getClientVersion() == 1)\r
89         {\r
90                 return static_cast<es1::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     es1::Context *context = es1::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_OES:\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 egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *shareContext);\r
144 extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);\r
145 egl::Image *createBackBuffer(int width, int height, const egl::Config *config);\r
146 egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);\r
147 sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);\r
148 \r
149 LibGLES_CMexports::LibGLES_CMexports()\r
150 {\r
151         this->es1CreateContext = ::es1CreateContext;\r
152         this->es1GetProcAddress = ::es1GetProcAddress;\r
153         this->createBackBuffer = ::createBackBuffer;\r
154         this->createDepthStencil = ::createDepthStencil;\r
155         this->createFrameBuffer = ::createFrameBuffer;\r
156         this->glEGLImageTargetTexture2DOES = ::glEGLImageTargetTexture2DOES;\r
157 }\r
158 \r
159 extern "C" LibGLES_CMexports *libGLES_CM_swiftshader()\r
160 {\r
161         static LibGLES_CMexports libGLES_CM;\r
162         return &libGLES_CM;\r
163 }\r
164 \r
165 LibEGL libEGL;