00001
00002 #ifndef _TP_SHADER_PROGRAM_H
00003 #define _TP_SHADER_PROGRAM_H
00004
00005 #include <string>
00006 #include <vector>
00007
00008 #include "GLResource.h"
00009 #include "GLManager.h"
00010 #include "GL/GLPlatform.h"
00011 #include "GL/GLShaderObject.h"
00012 #include "GL/GLShaderObjectIO.h"
00013 #include "GL/TPProgramName.h"
00014
00015
00016 namespace gk {
00017
00018
00019 class GLShaderProgram : public GLResource
00020 {
00021 struct parameter
00022 {
00023 std::string name;
00024 int location;
00025 int index;
00026 bool is_integer;
00027
00028 parameter( )
00029 :
00030 name(),
00031 location(-1),
00032 index(-1),
00033 is_integer(false)
00034 {}
00035
00036 parameter( const char *_name, const int _location, const int _index, const bool _is_integer= false )
00037 :
00038 name(_name),
00039 location(_location),
00040 index(_index),
00041 is_integer(_is_integer)
00042 {}
00043
00044 ~parameter( ) {}
00045 };
00046
00047
00048 GLShaderProgram( const GLShaderProgram& );
00049 GLShaderProgram& operator=( const GLShaderProgram& );
00050
00051 protected:
00052 std::vector<GLShaderObject *> m_shaders;
00053 std::vector<parameter> m_feedbacks;
00054 std::vector<parameter> m_attributes;
00055 std::vector<parameter> m_samplers;
00056
00057 GLuint m_name;
00058 int m_attribute_count;
00059 int m_uniform_count;
00060 int m_sampler_count;
00061 int m_feedback_count;
00062
00063 bool m_is_linked;
00064 bool m_is_validated;
00065
00066 int make( );
00067
00068 public:
00069 static bool is_sampler( const GLenum type );
00070 static bool is_integer( const GLenum type );
00071
00072
00073 GLShaderProgram( )
00074 :
00075 m_shaders(),
00076 m_feedbacks(),
00077 m_name(0),
00078 m_is_linked(false),
00079 m_is_validated(false)
00080 {
00081 m_name= glCreateProgram();
00082 }
00083
00084
00085 virtual ~GLShaderProgram( ) {}
00086
00087
00088 int attachShader( GLShaderObject *shader );
00089
00090
00091
00092 int link( );
00093
00094 int validate( );
00095
00096
00097 int createGLResource( );
00098
00099
00100 int releaseGLResource( );
00101
00102
00103 GLint name( ) const
00104 {
00105 return m_name;
00106 }
00107
00108
00109 int uniformCount( ) const
00110 {
00111 return m_uniform_count;
00112 }
00113
00114
00115 ProgramUniform uniform( const char *name ) const;
00116
00117
00118 int samplerCount( ) const
00119 {
00120 return m_sampler_count;
00121 }
00122
00123
00124 ProgramSampler sampler( const char *name ) const;
00125
00126
00127 int attributeCount( ) const
00128 {
00129 return m_attribute_count;
00130 }
00131
00132
00133 ProgramAttribute attribute( const char *name ) const;
00134
00135
00136 int drawbufferCount( ) const
00137 {
00138
00139 return -1;
00140 }
00141
00142
00143 ProgramDrawbuffer drawbuffer( const char *name ) const ;
00144
00145
00146 int feedbackCount( ) const
00147 {
00148 return m_feedback_count;
00149 }
00150
00151
00152 ProgramFeedback feedback( const char *name ) const;
00153 };
00154
00155
00156
00157
00158 class GL2ShaderProgram : public GLShaderProgram
00159 {
00160 public:
00161 GL2ShaderProgram( )
00162 :
00163 GLShaderProgram()
00164 {}
00165
00166 GL2ShaderProgram(
00167 const TextFile *vertex,
00168 const TextFile *fragment )
00169 :
00170 GLShaderProgram()
00171 {
00172 GLVertexShader *vertex_shader= GLManager<GLVertexShader>::manager().insert(
00173 new GLVertexShader(vertex) );
00174 GLFragmentShader *fragment_shader= GLManager<GLFragmentShader>::manager().insert(
00175 new GLFragmentShader(fragment) );
00176
00177 attachShader(vertex_shader);
00178 attachShader(fragment_shader);
00179 }
00180
00181 GL2ShaderProgram(
00182 const std::string& vertex_filename,
00183 const std::string& fragment_filename )
00184 :
00185 GLShaderProgram()
00186 {
00187 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00188 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00189 }
00190
00191 ~GL2ShaderProgram( ) {}
00192 };
00193
00194
00195 #if defined GK_OPENGL3 || defined GK_OPENGL4
00196
00197
00198
00199
00200
00201
00202 class GL3ShaderProgram : public GLShaderProgram
00203 {
00204 public:
00205 GL3ShaderProgram( )
00206 :
00207 GLShaderProgram()
00208 {}
00209
00210 GL3ShaderProgram(
00211 const TextFile *vertex,
00212 const TextFile *geometry,
00213 const TextFile *fragment )
00214 :
00215 GLShaderProgram()
00216 {
00217 GLVertexShader *vertex_shader= GLManager<GLVertexShader>::manager().insert(
00218 new GLVertexShader(vertex) );
00219 GLGeometryShader *geometry_shader= GLManager<GLGeometryShader>::manager().insert(
00220 new GLGeometryShader(geometry) );
00221 GLFragmentShader *fragment_shader= GLManager<GLFragmentShader>::manager().insert(
00222 new GLFragmentShader(fragment) );
00223
00224 attachShader(vertex_shader);
00225 attachShader(geometry_shader);
00226 attachShader(fragment_shader);
00227 }
00228
00229 GL3ShaderProgram(
00230 const std::string& vertex_filename,
00231 const std::string& geometry_filename,
00232 const std::string& fragment_filename )
00233 :
00234 GLShaderProgram()
00235 {
00236 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00237 attachShader( GLGeometryShaderIO::read(geometry_filename, "geometry") );
00238 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00239 }
00240
00241 ~GL3ShaderProgram( ) {}
00242 };
00243 #endif
00244
00245 #ifdef GK_OPENGL4
00246
00247
00248
00249
00250
00251
00252
00253
00254 class GL4ShaderProgram : public GLShaderProgram
00255 {
00256 public:
00257 GL4ShaderProgram( )
00258 :
00259 GLShaderProgram()
00260 {}
00261
00262 GL4ShaderProgram(
00263 const TextFile *vertex,
00264 const TextFile *control,
00265 const TextFile *evaluation,
00266 const TextFile *geometry,
00267 const TextFile *fragment )
00268 :
00269 GLShaderProgram()
00270 {
00271 GLVertexShader *vertex_shader= GLManager<GLVertexShader>::manager().insert(
00272 new GLVertexShader(vertex) );
00273 GLControlShader *control_shader= GLManager<GLControlShader >::manager().insert(
00274 new GLControlShader (control) );
00275 GLEvaluationShader *evaluation_shader= GLManager<GLEvaluationShader>::manager().insert(
00276 new GLEvaluationShader(evaluation) );
00277 GLGeometryShader *geometry_shader= GLManager<GLGeometryShader>::manager().insert(
00278 new GLGeometryShader(geometry) );
00279 GLFragmentShader *fragment_shader= GLManager<GLFragmentShader>::manager().insert(
00280 new GLFragmentShader(fragment) );
00281
00282 attachShader(vertex_shader);
00283 attachShader(control_shader);
00284 attachShader(evaluation_shader);
00285 attachShader(geometry_shader);
00286 attachShader(fragment_shader);
00287 }
00288
00289 GL4ShaderProgram(
00290 const std::string& vertex_filename,
00291 const std::string& control_filename,
00292 const std::string& evaluation_filename,
00293 const std::string& geometry_filename,
00294 const std::string& fragment_filename )
00295 :
00296 GLShaderProgram()
00297 {
00298 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00299 attachShader( GLControlShaderIO::read(control_filename, "control") );
00300 attachShader( GLEvaluationShaderIO::read(evaluation_filename, "evaluation") );
00301 attachShader( GLGeometryShaderIO::read(geometry_filename, "geometry") );
00302 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00303 }
00304
00305 ~GL4ShaderProgram( ) {}
00306 };
00307 #endif
00308
00309
00310 class ProgramState
00311 {
00312 const GLShaderProgram *m_program;
00313
00314 public:
00315 ProgramState( )
00316 :
00317 m_program(NULL)
00318 {}
00319
00320 ~ProgramState( ) {}
00321
00322 ProgramState& operator= ( const ProgramState& b )
00323 {
00324 m_program= b.m_program;
00325 return *this;
00326 }
00327
00328 ProgramState& setShaderProgram( const GLShaderProgram *program );
00329
00330 ProgramState& reset( );
00331
00332 const GLShaderProgram *getShaderProgram( )
00333 {
00334 return m_program;
00335 }
00336
00337 const GLShaderProgram *getShaderProgram( ) const
00338 {
00339 return m_program;
00340 }
00341 };
00342
00343 extern ProgramState ShaderProgram;
00344 extern ProgramState ActiveShaderProgram;
00345
00346 ProgramState& setShaderProgram( GLShaderProgram *program );
00347 ProgramState& resetShaderProgram( );
00348
00349 }
00350
00351 #endif