GlBackend.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright 2003-2006 Serious Hack Inc.
00004 // 
00005 // This library is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU Lesser General Public
00007 // License as published by the Free Software Foundation; either
00008 // version 2.1 of the License, or (at your option) any later version.
00009 //
00010 // This library is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013 // Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public
00016 // License along with this library; if not, write to the Free Software
00017 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
00018 // MA  02110-1301, USA
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 // WGL_ARB_pixel_format
00048 extern PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB;
00049 extern PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB;
00050 extern PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB;
00051 
00052 // WGL_ARB_pbuffer
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 extern PFNGLGETHANDLEARBPROC glGetHandleARB;
00091 
00092 // extern PFN ARBPROC ARB;
00093 
00094 #else
00095 
00096 #define GL_GLEXT_VERBOSE 1
00097 #define GL_GLEXT_PROTOTYPES 1
00098 
00099 #ifdef __APPLE__
00100 #include <OpenGL/OpenGL.h>
00101 #include <OpenGL/gl.h>
00102 #include <OpenGL/glext.h>
00103 #else
00104 #include <GL/gl.h>
00105 #include <GL/glext.h>
00106 #include <GL/glx.h>
00107 #endif /* __APPLE */
00108 
00109 #endif /* _WIN32 */
00110 
00111 namespace shgl {
00112 
00113 struct TextureStrategy {
00114   virtual ~TextureStrategy() {}
00115   virtual TextureStrategy* create() = 0;
00116   virtual void bindTexture(const SH::ShTextureNodePtr& texture,
00117                            GLenum target) = 0;
00118 };
00119 
00120 struct StreamStrategy {
00121   virtual ~StreamStrategy() {}
00122   virtual StreamStrategy* create() = 0;
00123   virtual void execute(const SH::ShProgramNodeCPtr& program, SH::ShStream& dest) = 0;
00124 };
00125 
00126 struct CodeStrategy {
00127   virtual ~CodeStrategy() {}
00128   virtual CodeStrategy* create() = 0;
00129   virtual SH::ShBackendCodePtr generate(const std::string& target,
00130                                         const SH::ShProgramNodeCPtr& shader,
00131                                         TextureStrategy* texture) = 0;
00132 
00133   // If you want to use a special set generation function, override
00134   // generate_set, and override use_default_set() to return false.
00135   virtual SH::ShBackendSetPtr generate_set(const SH::ShProgramSet& s);
00136   virtual bool use_default_set() const;
00137 
00138   virtual void unbind_all_programs();
00139   virtual bool use_default_unbind_all() const;
00140 };
00141 
00142 class GlBackend : public SH::ShBackend {
00143 public:
00144   virtual SH::ShBackendCodePtr generate_code(const std::string& target,
00145                                              const SH::ShProgramNodeCPtr& shader);
00146   virtual SH::ShBackendSetPtr generate_set(const SH::ShProgramSet& s);
00147   virtual void unbind_all_programs();
00148 
00149   // execute a stream program, if supported
00150   virtual void execute(const SH::ShProgramNodeCPtr& program, SH::ShStream& dest);
00151 
00152 protected:
00153   GlBackend(CodeStrategy* code, TextureStrategy* texture, StreamStrategy* stream,
00154             const std::string& name, const std::string& version);
00155   
00156 private:
00157   CodeStrategy* m_code;
00158   TextureStrategy* m_texture;
00159   StreamStrategy* m_stream;
00160 
00161   // NOT IMPLEMENTED
00162   GlBackend(const GlBackend& other);
00163   GlBackend& operator=(const GlBackend& other);
00164 };
00165 
00166 void shGlCheckError(const char* desc, const char* file, int line);
00167 
00168 /* Returns glReadPixels/glTexImage type for a given value type 
00169  * and returns a value type for the temporary buffer
00170  * (or SH_VALUETYPE_END if we can use the original buffer directly) 
00171  */
00172 GLenum shGlType(SH::ShValueType valueType, SH::ShValueType &convertedType); 
00173 
00174 }
00175 
00176 #define SH_GL_CHECK_ERROR(op) \
00177   op;shGlCheckError( # op, (char*) __FILE__, (int) __LINE__);
00178 
00179 
00180 
00181 #endif

Generated on Thu Feb 16 14:51:28 2006 for Sh by  doxygen 1.4.6