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 "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
23 #define GL_GLEXT_PROTOTYPES
\r
24 #include <GLES/glext.h>
\r
26 #if !defined(_MSC_VER)
\r
27 #define CONSTRUCTOR __attribute__((constructor))
\r
28 #define DESTRUCTOR __attribute__((destructor))
\r
34 static void glAttachThread()
\r
39 static void glDetachThread()
\r
44 CONSTRUCTOR static void glAttachProcess()
\r
51 DESTRUCTOR static void glDetachProcess()
\r
59 extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
\r
63 case DLL_PROCESS_ATTACH:
\r
66 case DLL_THREAD_ATTACH:
\r
69 case DLL_THREAD_DETACH:
\r
72 case DLL_PROCESS_DETACH:
\r
85 es1::Context *getContext()
\r
87 egl::Context *context = libEGL->clientGetCurrentContext();
\r
89 if(context && context->getClientVersion() == 1)
\r
91 return static_cast<es1::Context*>(context);
\r
97 egl::Display *getDisplay()
\r
99 return libEGL->clientGetCurrentDisplay();
\r
102 Device *getDevice()
\r
104 Context *context = getContext();
\r
106 return context ? context->getDevice() : 0;
\r
109 // Records an error code
\r
110 void error(GLenum errorCode)
\r
112 es1::Context *context = es1::getContext();
\r
118 case GL_INVALID_ENUM:
\r
119 context->recordInvalidEnum();
\r
120 TRACE("\t! Error generated: invalid enum\n");
\r
122 case GL_INVALID_VALUE:
\r
123 context->recordInvalidValue();
\r
124 TRACE("\t! Error generated: invalid value\n");
\r
126 case GL_INVALID_OPERATION:
\r
127 context->recordInvalidOperation();
\r
128 TRACE("\t! Error generated: invalid operation\n");
\r
130 case GL_OUT_OF_MEMORY:
\r
131 context->recordOutOfMemory();
\r
132 TRACE("\t! Error generated: out of memory\n");
\r
134 case GL_INVALID_FRAMEBUFFER_OPERATION_OES:
\r
135 context->recordInvalidFramebufferOperation();
\r
136 TRACE("\t! Error generated: invalid framebuffer operation\n");
\r
138 default: UNREACHABLE();
\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
150 LibGLES_CMexports::LibGLES_CMexports()
\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
160 extern "C" LibGLES_CMexports *libGLES_CMexports()
\r
162 static LibGLES_CMexports libGLES_CM;
\r
163 return &libGLES_CM;
\r