Show
Ignore:
Timestamp:
11/16/09 13:32:41 (4 years ago)
Author:
robert
Message:

Added new osg::ShaderBinary? class, and support for it in osg::Shader.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osg/Shader.cpp

    r10642 r10754  
    3737using namespace osg; 
    3838 
    39 /////////////////////////////////////////////////////////////////////////// 
     39ShaderBinary::ShaderBinary() 
     40{ 
     41} 
     42 
     43ShaderBinary::ShaderBinary(const ShaderBinary& rhs, const osg::CopyOp&): 
     44    _data(rhs._data) 
     45{ 
     46} 
     47 
     48void ShaderBinary::allocate(unsigned int size) 
     49{ 
     50    _data.clear(); 
     51    _data.resize(size); 
     52} 
     53 
     54void ShaderBinary::assign(unsigned int size, const unsigned char* data) 
     55{ 
     56    allocate(size); 
     57    if (data) 
     58    { 
     59        for(unsigned int i=0; i<size; ++i) 
     60        { 
     61            _data[i] = data[i]; 
     62        } 
     63    } 
     64} 
     65 
     66        /////////////////////////////////////////////////////////////////////////// 
    4067// static cache of glShaders flagged for deletion, which will actually 
    4168// be deleted in the correct GL context. 
     
    110137} 
    111138 
     139Shader::Shader(Type type, ShaderBinary* shaderBinary) : 
     140    _type(type) 
     141{ 
     142} 
     143 
     144 
    112145Shader::Shader(const Shader& rhs, const osg::CopyOp& copyop): 
    113146    osg::Object( rhs, copyop ), 
    114147    _type(rhs._type), 
     148    _shaderFileName(rhs._shaderFileName), 
    115149    _shaderSource(rhs._shaderSource), 
    116     _shaderFileName(rhs._shaderFileName) 
     150    _shaderBinary(rhs._shaderBinary) 
    117151{ 
    118152} 
     
    122156} 
    123157 
    124 bool Shader::setType( Type t ) 
     158bool Shader::setType(Type t) 
    125159{ 
    126160    if (_type==t) return true; 
     
    380414    _needsCompile = false; 
    381415 
     416#if defined(OSG_GLES2_AVAILABLE) 
     417    if (_shader->getShaderBinary()) 
     418    { 
     419        GLint numFormats; 
     420        glGetIntegerv(GL_NUM_SHADER_BINARY_FORMATS, &numFormats); 
     421 
     422        if (numFormats>0) 
     423        { 
     424            GLint* formats = new GLint[numFormats]; 
     425            glGetIntegerv(GL_SHADER_BINARY_FORMATS, formats); 
     426 
     427            for(GLint i=0; i<numFormats; ++i) 
     428            { 
     429                osg::notify(osg::NOTICE)<<"  format="<<formats[i]<<std::endl; 
     430                GLenum shaderBinaryFormat = formats[i]; 
     431                glShaderBinary(1, &_glShaderHandle, shaderBinaryFormat, _shader->getShaderBinary()->getData(), _shader->getShaderBinary()->getSize()); 
     432                if (glGetError() == GL_NO_ERROR) 
     433                { 
     434                    _isCompiled = true; 
     435                    return; 
     436                } 
     437            } 
     438            delete [] formats; 
     439             
     440            if (_shader->getShaderSource().empty()) 
     441            { 
     442                osg::notify(osg::WARN)<<"Warning: No suitable shader of supported format by GLES driver found in shader binary, unable to compile shader."<<std::endl; 
     443                _isCompiled = false; 
     444                return; 
     445            } 
     446            else 
     447            { 
     448                osg::notify(osg::NOTICE)<<"osg::Shader::compileShader(): No suitable shader of supported format by GLES driver found in shader binary, falling back to shader source."<<std::endl; 
     449            } 
     450        } 
     451        else 
     452        { 
     453            if (_shader->getShaderSource().empty()) 
     454            { 
     455                osg::notify(osg::WARN)<<"Warning: No shader binary formats supported by GLES driver, unable to compile shader."<<std::endl; 
     456                _isCompiled = false; 
     457                return; 
     458            } 
     459            else 
     460            { 
     461                osg::notify(osg::NOTICE)<<"osg::Shader::compileShader(): No shader binary formats supported by GLES driver, falling back to shader source."<<std::endl; 
     462            } 
     463        } 
     464    } 
     465#endif 
     466 
    382467    std::string source = _shader->getShaderSource(); 
    383468    if (_shader->getType()==osg::Shader::VERTEX && (state.getUseVertexAttributeAliasing() || state.getUseModelViewAndProjectionUniforms()))