00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020 #ifndef GLBACKEND_HPP
00021 #define GLBACKEND_HPP
00022
00023 #include "ShVariableType.hpp"
00024 #include "ShProgram.hpp"
00025 #include "ShStream.hpp"
00026 #include "ShTextureNode.hpp"
00027
00028 #ifdef WIN32
00029
00030 #include <windows.h>
00031
00032 #include <GL/gl.h>
00033 #include <GL/glext.h>
00034 #include <GL/wglext.h>
00035
00036 extern PFNGLPROGRAMSTRINGARBPROC glProgramStringARB;
00037 extern PFNGLBINDPROGRAMARBPROC glBindProgramARB;
00038 extern PFNGLGENPROGRAMSARBPROC glGenProgramsARB;
00039 extern PFNGLPROGRAMENVPARAMETER4FVARBPROC glProgramEnvParameter4fvARB;
00040 extern PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB;
00041 extern PFNGLGETPROGRAMIVARBPROC glGetProgramivARB;
00042 extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
00043
00044 extern PFNGLTEXIMAGE3DPROC glTexImage3D;
00045 extern PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D;
00046
00047
00048 extern PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB;
00049 extern PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB;
00050 extern PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB;
00051
00052
00053 extern PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB;
00054 extern PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB;
00055 extern PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB;
00056 extern PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB;
00057 extern PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB;
00058
00059 extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
00060 extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
00061 extern PFNGLGETSHADERSOURCEARBPROC glGetShaderSourceARB;
00062 extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
00063 extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
00064 extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
00065 extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
00066 extern PFNGLUNIFORM2FARBPROC glUniform2fARB;
00067 extern PFNGLUNIFORM3FARBPROC glUniform3fARB;
00068 extern PFNGLUNIFORM4FARBPROC glUniform4fARB;
00069 extern PFNGLUNIFORM1FVARBPROC glUniform1fvARB;
00070 extern PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
00071 extern PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
00072 extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
00073 extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
00074 extern PFNGLUNIFORM2IARBPROC glUniform2iARB;
00075 extern PFNGLUNIFORM3IARBPROC glUniform3iARB;
00076 extern PFNGLUNIFORM4IARBPROC glUniform4iARB;
00077 extern PFNGLUNIFORM1IVARBPROC glUniform1ivARB;
00078 extern PFNGLUNIFORM2IVARBPROC glUniform2ivARB;
00079 extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB;
00080 extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB;
00081 extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
00082 extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
00083 extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
00084 extern PFNGLDETACHOBJECTARBPROC glDetachObjectARB;
00085 extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
00086 extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
00087 extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
00088 extern PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
00089 extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
00090
00091
00092
00093 #else
00094
00095 #define GL_GLEXT_VERBOSE 1
00096 #define GL_GLEXT_PROTOTYPES 1
00097
00098 #ifdef __APPLE__
00099 #include <OpenGL/OpenGL.h>
00100 #include <OpenGL/gl.h>
00101 #include <OpenGL/glext.h>
00102 #else
00103 #include <GL/gl.h>
00104 #include <GL/glext.h>
00105 #include <GL/glx.h>
00106 #endif
00107
00108 #endif
00109
00110 namespace shgl {
00111
00112 struct TextureStrategy {
00113 virtual ~TextureStrategy() {}
00114 virtual TextureStrategy* create() = 0;
00115 virtual void bindTexture(const SH::ShTextureNodePtr& texture,
00116 GLenum target) = 0;
00117 };
00118
00119 struct StreamStrategy {
00120 virtual ~StreamStrategy() {}
00121 virtual StreamStrategy* create() = 0;
00122 virtual void execute(const SH::ShProgramNodeCPtr& program, SH::ShStream& dest) = 0;
00123 };
00124
00125 struct CodeStrategy {
00126 virtual ~CodeStrategy() {}
00127 virtual CodeStrategy* create() = 0;
00128 virtual SH::ShBackendCodePtr generate(const std::string& target,
00129 const SH::ShProgramNodeCPtr& shader,
00130 TextureStrategy* texture) = 0;
00131
00132
00133
00134 virtual SH::ShBackendSetPtr generate_set(const SH::ShProgramSet& s);
00135 virtual bool use_default_set() const;
00136
00137 virtual void unbind_all_programs();
00138 virtual bool use_default_unbind_all() const;
00139 };
00140
00141 class GlBackend : public SH::ShBackend {
00142 public:
00143 virtual SH::ShBackendCodePtr generate_code(const std::string& target,
00144 const SH::ShProgramNodeCPtr& shader);
00145 virtual SH::ShBackendSetPtr generate_set(const SH::ShProgramSet& s);
00146 virtual void unbind_all_programs();
00147
00148
00149 virtual void execute(const SH::ShProgramNodeCPtr& program, SH::ShStream& dest);
00150
00151 protected:
00152 GlBackend(CodeStrategy* code, TextureStrategy* texture, StreamStrategy* stream);
00153
00154 private:
00155 CodeStrategy* m_code;
00156 TextureStrategy* m_texture;
00157 StreamStrategy* m_stream;
00158
00159
00160 GlBackend(const GlBackend& other);
00161 GlBackend& operator=(const GlBackend& other);
00162 };
00163
00164 void shGlCheckError(const char* desc, const char* file, int line);
00165
00166
00167
00168
00169
00170 GLenum shGlType(SH::ShValueType valueType, SH::ShValueType &convertedType);
00171
00172 }
00173
00174 #define SH_GL_CHECK_ERROR(op) \
00175 op;shGlCheckError( # op, (char*) __FILE__, (int) __LINE__);
00176
00177
00178
00179 #endif