Add static bool fragmentShaderSupported() and vertexShaderSupported() methods to GLShader.

Make sure shaders are supported before trying to load them.

svn path=/branches/work/kwin_composite/; revision=645060
This commit is contained in:
Rivo Laks 2007-03-21 16:17:19 +00:00
parent da02ba11ca
commit d72a9239b4
2 changed files with 29 additions and 0 deletions

View file

@ -61,6 +61,8 @@ void initGL()
// handle OpenGL extensions functions // handle OpenGL extensions functions
glResolveFunctions(); glResolveFunctions();
GLShader::initStatic();
#else #else
glVersion = MAKE_GL_VERSION( 0, 0, 0 ); glVersion = MAKE_GL_VERSION( 0, 0, 0 );
#endif #endif
@ -84,6 +86,18 @@ bool hasGLExtension(const QString& extension)
#ifdef HAVE_OPENGL #ifdef HAVE_OPENGL
bool GLShader::mFragmentShaderSupported = false;
bool GLShader::mVertexShaderSupported = false;
void GLShader::initStatic()
{
mFragmentShaderSupported = mVertexShaderSupported =
hasGLExtension("GL_ARB_shader_objects") && hasGLExtension("GL_ARB_shading_language_100");
mVertexShaderSupported &= hasGLExtension("GL_ARB_vertex_shader");
mFragmentShaderSupported &= hasGLExtension("GL_ARB_fragment_shader");
}
GLShader::GLShader(const QString& vertexfile, const QString& fragmentfile) GLShader::GLShader(const QString& vertexfile, const QString& fragmentfile)
{ {
mValid = false; mValid = false;
@ -115,6 +129,14 @@ bool GLShader::loadFromFiles(const QString& vertexfile, const QString& fragmentf
bool GLShader::load(const QString& vertexsource, const QString& fragmentsource) bool GLShader::load(const QString& vertexsource, const QString& fragmentsource)
{ {
// Make sure shaders are actually supported
if(( !vertexsource.isEmpty() && !vertexShaderSupported() ) ||
( !fragmentsource.isEmpty() && !fragmentShaderSupported() ))
{
kDebug(1212) << k_funcinfo << "Shaders not supported" << endl;
return false;
}
GLuint vertexshader; GLuint vertexshader;
GLuint fragmentshader; GLuint fragmentshader;

View file

@ -68,6 +68,11 @@ class GLShader
bool setAttribute(const QString& name, float value); bool setAttribute(const QString& name, float value);
static void initStatic();
static bool fragmentShaderSupported() { return mFragmentShaderSupported; }
static bool vertexShaderSupported() { return mVertexShaderSupported; }
protected: protected:
bool loadFromFiles(const QString& vertexfile, const QString& fragmentfile); bool loadFromFiles(const QString& vertexfile, const QString& fragmentfile);
bool load(const QString& vertexsource, const QString& fragmentsource); bool load(const QString& vertexsource, const QString& fragmentsource);
@ -77,6 +82,8 @@ class GLShader
unsigned int mProgram; unsigned int mProgram;
bool mValid; bool mValid;
QHash< QString, int >* mVariableLocations; QHash< QString, int >* mVariableLocations;
static bool mFragmentShaderSupported;
static bool mVertexShaderSupported;
}; };
#endif #endif