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 "Glsl.hpp"
00031 #include "GlTextures.hpp"
00032 #include "GlBackend.hpp"
00033 #include "PBufferStreams.hpp"
00034
00035 namespace shgl {
00036
00037 struct GlslBackend : public GlBackend {
00038 GlslBackend()
00039 : GlBackend(new GlslCodeStrategy(),
00040 new GlTextures(),
00041 new PBufferStreams())
00042 {
00043 }
00044
00045 std::string name() const { return "glsl"; }
00046 std::string version() const { return "1.0"; }
00047 };
00048
00049 #ifdef WIN32
00050 static GlslBackend* backend = 0;
00051
00052 extern "C"
00053 BOOL APIENTRY DllMain(HANDLE hModule,
00054 DWORD ul_reason_for_call,
00055 LPVOID lpReserved)
00056 {
00057 switch (ul_reason_for_call) {
00058 case DLL_PROCESS_ATTACH:
00059 if (backend) return TRUE;
00060 backend = new GlslBackend();
00061 break;
00062 case DLL_THREAD_ATTACH:
00063 case DLL_THREAD_DETACH:
00064 break;
00065 case DLL_PROCESS_DETACH:
00066 delete backend;
00067 break;
00068 default:
00069 break;
00070 }
00071 return TRUE;
00072 }
00073 #endif // WIN32
00074
00075 }
00076
00077 extern "C" {
00078 using namespace shgl;
00079
00080 #ifdef WIN32
00081 __declspec(dllexport)
00082 #endif
00083 GlslBackend* shBackend_libshglsl_instantiate()
00084 {
00085 return new GlslBackend();
00086 }
00087
00088 #ifdef WIN32
00089 __declspec(dllexport)
00090 #endif
00091 int shBackend_libshglsl_target_cost(const std::string& target)
00092 {
00093 if ("glsl:vertex" == target) return 1;
00094 if ("glsl:fragment" == target) return 1;
00095 if ("glsl:stream" == target) return 1;
00096
00097 if (("gpu:vertex" == target) || ("gpu:fragment" == target)) return 5;
00098 if (("vertex" == target) || ("fragment" == target)) return 5;
00099 if (("*:vertex" == target) || ("*:fragment" == target)) return 5;
00100
00101 if ("gpu:stream" == target) return 10;
00102 if ("*:stream" == target) return 10;
00103 if ("stream" == target) return 10;
00104
00105 return 0;
00106 }
00107 }
00108