00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027 #ifdef WIN32
00028 #include <windows.h>
00029 #endif
00030
00031 #include <iostream>
00032
00033 #include "Arb.hpp"
00034 #include "GlTextures.hpp"
00035 #include "GlBackend.hpp"
00036
00037 #ifdef WIN32
00038 #include "WGLPBufferStreams.hpp"
00039 #else
00040 #include "GLXPBufferStreams.hpp"
00041 #endif
00042
00043 namespace shgl {
00044
00045 struct ArbBackend : public GlBackend {
00046 ArbBackend()
00047 : GlBackend(new ArbCodeStrategy(),
00048 new GlTextures(),
00049 #ifdef WIN32
00050 new WGLPBufferStreams())
00051 #else
00052 new GLXPBufferStreams())
00053 #endif
00054 {
00055 }
00056
00057 std::string name() const { return "arb"; }
00058 };
00059
00060 #ifdef WIN32
00061 static ArbBackend* backend = 0;
00062
00063 extern "C"
00064 BOOL APIENTRY DllMain(HANDLE hModule,
00065 DWORD ul_reason_for_call,
00066 LPVOID lpReserved)
00067 {
00068 std::cerr << "Arb Backend DllMain called!" << std::endl;
00069 std::cerr << "Have backend: " << backend << std::endl;
00070 std::cerr << "lpReserved = " << lpReserved << std::endl;
00071 std::cerr << "hModule = " << hModule << std::endl;
00072 switch (ul_reason_for_call) {
00073 case DLL_PROCESS_ATTACH:
00074 std::cerr << "Process attach!" << std::endl;
00075 if (backend) return TRUE;
00076 backend = new ArbBackend();
00077 break;
00078 case DLL_THREAD_ATTACH:
00079 case DLL_THREAD_DETACH:
00080 std::cerr << "Thread!" << std::endl;
00081 break;
00082 case DLL_PROCESS_DETACH:
00083 std::cerr << "Process detach!" << std::endl;
00084 delete backend;
00085 std::cerr << "Deleted backend!" << std::endl;
00086 break;
00087 default:
00088 std::cerr << "Some Other Thing!" << std::endl;
00089 }
00090 return TRUE;
00091 }
00092
00093 #else
00094 static ArbBackend* backend = new ArbBackend();
00095 #endif
00096 }