00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024 #ifdef WIN32
00025 #include <windows.h>
00026 #endif
00027
00028 #include <iostream>
00029
00030 #include "Arb.hpp"
00031 #include "GlTextures.hpp"
00032 #include "GlBackend.hpp"
00033
00034 #include "PBufferStreams.hpp"
00035
00036 namespace shgl {
00037
00038 struct ArbBackend : public GlBackend {
00039 ArbBackend()
00040 : GlBackend(new ArbCodeStrategy(),
00041 new GlTextures(),
00042 #ifdef __APPLE__
00043
00044 0)
00045 #else
00046 new PBufferStreams())
00047 #endif
00048 {
00049 }
00050
00051 std::string name() const { return "arb"; }
00052 std::string version() const { return "1.0"; }
00053 };
00054
00055 #ifdef WIN32
00056 static ArbBackend* backend = 0;
00057
00058 extern "C"
00059 BOOL APIENTRY DllMain(HANDLE hModule,
00060 DWORD ul_reason_for_call,
00061 LPVOID lpReserved)
00062 {
00063 switch (ul_reason_for_call) {
00064 case DLL_PROCESS_ATTACH:
00065 if (backend) return TRUE;
00066 backend = new ArbBackend();
00067 break;
00068 case DLL_THREAD_ATTACH:
00069 case DLL_THREAD_DETACH:
00070 break;
00071 case DLL_PROCESS_DETACH:
00072 delete backend;
00073 break;
00074 default:
00075 break;
00076 }
00077 return TRUE;
00078 }
00079
00080 #endif // WIN32
00081
00082
00083 }
00084
00085 extern "C" {
00086 using namespace shgl;
00087 #ifdef WIN32
00088 __declspec(dllexport)
00089 #endif
00090 ArbBackend* shBackend_libsharb_instantiate()
00091 {
00092 return new ArbBackend();
00093 }
00094
00095 #ifdef WIN32
00096 __declspec(dllexport)
00097 #endif
00098 int shBackend_libsharb_target_cost(const std::string& target)
00099 {
00100 if ("arb:vertex" == target) return 1;
00101 if ("arb:fragment" == target) return 1;
00102 if ("arb:stream" == target) return 1;
00103
00104 if (("gpu:vertex" == target) || ("gpu:fragment" == target)) return 2;
00105 if (("vertex" == target) || ("fragment" == target)) return 2;
00106 if (("*:vertex" == target) || ("*:fragment" == target)) return 2;
00107
00108 if ("gpu:stream" == target) return 5;
00109 if ("*:stream" == target) return 5;
00110 if ("stream" == target) return 5;
00111
00112 return 0;
00113 }
00114 }