1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2013 TransGaming Inc.
\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
12 // main.cpp: DLL entry point and management of thread-local data.
\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
24 #if !defined(_MSC_VER)
\r
25 #define CONSTRUCTOR __attribute__((constructor))
\r
26 #define DESTRUCTOR __attribute__((destructor))
\r
32 static void glAttachThread()
\r
37 static void glDetachThread()
\r
42 CONSTRUCTOR static void glAttachProcess()
\r
49 DESTRUCTOR static void glDetachProcess()
\r
57 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
\r
61 case DLL_PROCESS_ATTACH:
\r
64 case DLL_THREAD_ATTACH:
\r
67 case DLL_THREAD_DETACH:
\r
70 case DLL_PROCESS_DETACH:
\r
83 es2::Context *getContext()
\r
85 egl::Context *context = libEGL->clientGetCurrentContext();
\r
87 if(context && (context->getClientVersion() == 2 ||
\r
88 context->getClientVersion() == 3))
\r
90 return static_cast<es2::Context*>(context);
\r
96 egl::Display *getDisplay()
\r
98 return libEGL->clientGetCurrentDisplay();
\r
101 Device *getDevice()
\r
103 Context *context = getContext();
\r
105 return context ? context->getDevice() : 0;
\r
108 // Records an error code
\r
109 void error(GLenum errorCode)
\r
111 es2::Context *context = es2::getContext();
\r
117 case GL_INVALID_ENUM:
\r
118 context->recordInvalidEnum();
\r
119 TRACE("\t! Error generated: invalid enum\n");
\r
121 case GL_INVALID_VALUE:
\r
122 context->recordInvalidValue();
\r
123 TRACE("\t! Error generated: invalid value\n");
\r
125 case GL_INVALID_OPERATION:
\r
126 context->recordInvalidOperation();
\r
127 TRACE("\t! Error generated: invalid operation\n");
\r
129 case GL_OUT_OF_MEMORY:
\r
130 context->recordOutOfMemory();
\r
131 TRACE("\t! Error generated: out of memory\n");
\r
133 case GL_INVALID_FRAMEBUFFER_OPERATION:
\r
134 context->recordInvalidFramebufferOperation();
\r
135 TRACE("\t! Error generated: invalid framebuffer operation\n");
\r
137 default: UNREACHABLE();
\r
145 GLint getClientVersion()
\r
147 Context *context = libEGL->clientGetCurrentContext();
\r
149 return context ? context->getClientVersion() : 0;
\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
159 LibGLESv2exports::LibGLESv2exports()
\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
168 extern "C" LibGLESv2exports *libGLESv2exports()
\r
170 static LibGLESv2exports libGLESv2;
\r
175 LibGLES_CM libGLES_CM;