OSDN Git Service

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