| 39 | | /////////////////////////////////////////////////////////////////////////// |
| | 39 | ShaderBinary::ShaderBinary() |
| | 40 | { |
| | 41 | } |
| | 42 | |
| | 43 | ShaderBinary::ShaderBinary(const ShaderBinary& rhs, const osg::CopyOp&): |
| | 44 | _data(rhs._data) |
| | 45 | { |
| | 46 | } |
| | 47 | |
| | 48 | void ShaderBinary::allocate(unsigned int size) |
| | 49 | { |
| | 50 | _data.clear(); |
| | 51 | _data.resize(size); |
| | 52 | } |
| | 53 | |
| | 54 | void 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 | /////////////////////////////////////////////////////////////////////////// |
| | 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 | |