From David Callu, "Here an update of osg::Uniform :

- add non square matrix
- add double
- add all uniform type available in OpenGL 4.2
- backward compatibility for Matrixd to set/get an float uniform matrix
- update of IVE / Wrapper ReadWriter

implementation of AtomicCounterBuffer based on BufferIndexBinding

add example that use AtomicCounterBuffer and show rendering order of fragments,
original idea from geeks3d.com."
This commit is contained in:
Robert Osfield
2012-03-29 09:43:12 +00:00
parent 59d6931b59
commit aab27e106c
16 changed files with 2915 additions and 381 deletions

View File

@@ -1,5 +1,6 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
* Copyright (C) 2010 Tim Moore
* Copyright (C) 2012 David Callu
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -15,6 +16,9 @@
#include <osg/BufferIndexBinding>
#include <osg/State>
#include <string.h> // for memcpy
namespace osg {
BufferIndexBinding::BufferIndexBinding(GLenum target, GLuint index)
@@ -95,4 +99,48 @@ TransformFeedbackBufferBinding::TransformFeedbackBufferBinding(const TransformFe
{
}
AtomicCounterBufferBinding::AtomicCounterBufferBinding(GLuint index)
: BufferIndexBinding(GL_ATOMIC_COUNTER_BUFFER, index)
{
}
AtomicCounterBufferBinding::AtomicCounterBufferBinding(GLuint index, BufferObject* bo, GLintptr offset, GLsizeiptr size)
: BufferIndexBinding(GL_ATOMIC_COUNTER_BUFFER, index, bo, offset, size)
{
}
AtomicCounterBufferBinding::AtomicCounterBufferBinding(const AtomicCounterBufferBinding& rhs, const CopyOp& copyop)
: BufferIndexBinding(rhs, copyop)
{
}
void AtomicCounterBufferBinding::readData(osg::State & state, osg::UIntArray & uintArray) const
{
if (!_bufferObject) return;
GLBufferObject* bo = _bufferObject->getOrCreateGLBufferObject( state.getContextID() );
if (!bo) return;
GLint previousID = 0;
glGetIntegerv(GL_ATOMIC_COUNTER_BUFFER_BINDING, &previousID);
if (static_cast<GLuint>(previousID) != bo->getGLObjectID())
bo->_extensions->glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, bo->getGLObjectID());
GLubyte* src = (GLubyte*)bo->_extensions->glMapBuffer(GL_ATOMIC_COUNTER_BUFFER,
GL_READ_ONLY_ARB);
if(src)
{
size_t size = osg::minimum<int>(_size, uintArray.getTotalDataSize());
memcpy((void*) &(uintArray.front()), src+_offset, size);
bo->_extensions->glUnmapBuffer(GL_ATOMIC_COUNTER_BUFFER);
}
if (static_cast<GLuint>(previousID) != bo->getGLObjectID())
bo->_extensions->glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, static_cast<GLuint>(previousID));
}
} // namespace osg

View File

@@ -1,4 +1,5 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
* Copyright (C) 2012 David Callu
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -1668,6 +1669,11 @@ void PixelDataBufferObject::resizeGLObjectBuffers(unsigned int maxSize)
_mode.resize(maxSize);
}
//////////////////////////////////////////////////////////////////////////////////
//
// UniformBufferObject
//
UniformBufferObject::UniformBufferObject()
{
setTarget(GL_UNIFORM_BUFFER);
@@ -1682,3 +1688,24 @@ UniformBufferObject::UniformBufferObject(const UniformBufferObject& ubo, const C
UniformBufferObject::~UniformBufferObject()
{
}
//////////////////////////////////////////////////////////////////////////////////
//
// AtomicCounterBufferObject
//
AtomicCounterBufferObject::AtomicCounterBufferObject()
{
setTarget(GL_ATOMIC_COUNTER_BUFFER);
setUsage(GL_DYNAMIC_DRAW);
}
AtomicCounterBufferObject::AtomicCounterBufferObject(const AtomicCounterBufferObject& ubo, const CopyOp& copyop)
: BufferObject(ubo, copyop)
{
}
AtomicCounterBufferObject::~AtomicCounterBufferObject()
{
}

View File

@@ -2,6 +2,7 @@
* Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
* Copyright (C) 2004-2005 Nathan Cournia
* Copyright (C) 2008 Zebra Imaging
* Copyright (C) 2012 David Callu
*
* This application is open source and may be redistributed and/or modified
* freely and without restriction, both in commercial and non commercial
@@ -46,9 +47,12 @@ GL2Extensions::GL2Extensions(const GL2Extensions& rhs) : osg::Referenced()
_isFragmentShaderSupported = rhs._isFragmentShaderSupported;
_isLanguage100Supported = rhs._isLanguage100Supported;
_isGeometryShader4Supported = rhs._isGeometryShader4Supported;
_areTessellationShadersSupported = rhs._areTessellationShadersSupported;
_isGpuShader4Supported = rhs._isGpuShader4Supported;
_isUniformBufferObjectSupported = rhs._isUniformBufferObjectSupported;
_isGetProgramBinarySupported = rhs._isGetProgramBinarySupported;
_isGpuShaderFp64Supported = rhs._isGpuShaderFp64Supported;
_isShaderAtomicCountersSupported = rhs._isShaderAtomicCountersSupported;
_glBlendEquationSeparate = rhs._glBlendEquationSeparate;
_glDrawBuffers = rhs._glDrawBuffers;
@@ -189,7 +193,27 @@ GL2Extensions::GL2Extensions(const GL2Extensions& rhs) : osg::Referenced()
_glGetProgramBinary = rhs._glGetProgramBinary;
_glProgramBinary = rhs._glProgramBinary;
_areTessellationShadersSupported = rhs._areTessellationShadersSupported;
// ARB_gpu_shader_fp64
_glUniform1d = rhs._glUniform1d;
_glUniform2d = rhs._glUniform2d;
_glUniform3d = rhs._glUniform3d;
_glUniform4d = rhs._glUniform4d;
_glUniform1dv = rhs._glUniform1dv;
_glUniform2dv = rhs._glUniform2dv;
_glUniform3dv = rhs._glUniform3dv;
_glUniform4dv = rhs._glUniform4dv;
_glUniformMatrix2dv = rhs._glUniformMatrix2dv;
_glUniformMatrix3dv = rhs._glUniformMatrix3dv;
_glUniformMatrix4dv = rhs._glUniformMatrix4dv;
_glUniformMatrix2x3dv = rhs._glUniformMatrix2x3dv;
_glUniformMatrix3x2dv = rhs._glUniformMatrix3x2dv;
_glUniformMatrix2x4dv = rhs._glUniformMatrix2x4dv;
_glUniformMatrix4x2dv = rhs._glUniformMatrix4x2dv;
_glUniformMatrix3x4dv = rhs._glUniformMatrix3x4dv;
_glUniformMatrix4x3dv = rhs._glUniformMatrix4x3dv;
// ARB_shader_atomic_counters
_glGetActiveAtomicCounterBufferiv = rhs._glGetActiveAtomicCounterBufferiv;
}
@@ -204,7 +228,12 @@ void GL2Extensions::lowestCommonDenominator(const GL2Extensions& rhs)
if (!rhs._isFragmentShaderSupported) _isFragmentShaderSupported = false;
if (!rhs._isLanguage100Supported) _isLanguage100Supported = false;
if (!rhs._isGeometryShader4Supported) _isGeometryShader4Supported = false;
if (!rhs._areTessellationShadersSupported) _areTessellationShadersSupported = false;
if (!rhs._isGpuShader4Supported) _isGpuShader4Supported = false;
if (!rhs._isUniformBufferObjectSupported) _isUniformBufferObjectSupported = false;
if (!rhs._isGetProgramBinarySupported) _isGetProgramBinarySupported = false;
if (!rhs._isGpuShaderFp64Supported) _isGpuShaderFp64Supported = false;
if (!rhs._isShaderAtomicCountersSupported) _isShaderAtomicCountersSupported = false;
if (!rhs._glBlendEquationSeparate) _glBlendEquationSeparate = 0;
if (!rhs._glDrawBuffers) _glDrawBuffers = 0;
@@ -348,6 +377,28 @@ void GL2Extensions::lowestCommonDenominator(const GL2Extensions& rhs)
// ARB_get_program_binary
if (!rhs._glGetProgramBinary) _glGetProgramBinary = 0;
if (!rhs._glProgramBinary) _glProgramBinary = 0;
// ARB_gpu_shader_fp64
if(!rhs._glUniform1d) _glUniform1d = 0;
if(!rhs._glUniform2d) _glUniform2d = 0;
if(!rhs._glUniform3d) _glUniform3d = 0;
if(!rhs._glUniform4d) _glUniform4d = 0;
if(!rhs._glUniform1dv) _glUniform1dv = 0;
if(!rhs._glUniform2dv) _glUniform2dv = 0;
if(!rhs._glUniform3dv) _glUniform3dv = 0;
if(!rhs._glUniform4dv) _glUniform4dv = 0;
if(!rhs._glUniformMatrix2dv) _glUniformMatrix2dv = 0;
if(!rhs._glUniformMatrix3dv) _glUniformMatrix3dv = 0;
if(!rhs._glUniformMatrix4dv) _glUniformMatrix4dv = 0;
if(!rhs._glUniformMatrix2x3dv) _glUniformMatrix2x3dv = 0;
if(!rhs._glUniformMatrix3x2dv) _glUniformMatrix3x2dv = 0;
if(!rhs._glUniformMatrix2x4dv) _glUniformMatrix2x4dv = 0;
if(!rhs._glUniformMatrix4x2dv) _glUniformMatrix4x2dv = 0;
if(!rhs._glUniformMatrix3x4dv) _glUniformMatrix3x4dv = 0;
if(!rhs._glUniformMatrix4x3dv) _glUniformMatrix4x3dv = 0;
// ARB_shader_atomic_counters
if(!rhs._glGetActiveAtomicCounterBufferiv) _glGetActiveAtomicCounterBufferiv = 0;
}
@@ -370,6 +421,8 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID)
_isGpuShader4Supported = false;
_isUniformBufferObjectSupported = false;
_isGetProgramBinarySupported = false;
_isGpuShaderFp64Supported = false;
_isShaderAtomicCountersSupported = false;
_glBlendEquationSeparate= 0;
_glDrawBuffers= 0;
@@ -510,10 +563,32 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID)
_glGetActiveUniformBlockName= 0;
_glUniformBlockBinding= 0;
//ARB_get_program_binary
// ARB_get_program_binary
_glGetProgramBinary= 0;
_glProgramBinary= 0;
// ARB_gpu_shader_fp64
_glUniform1d= 0;
_glUniform2d= 0;
_glUniform3d= 0;
_glUniform4d= 0;
_glUniform1dv= 0;
_glUniform2dv= 0;
_glUniform3dv= 0;
_glUniform4dv= 0;
_glUniformMatrix2dv= 0;
_glUniformMatrix3dv= 0;
_glUniformMatrix4dv= 0;
_glUniformMatrix2x3dv= 0;
_glUniformMatrix3x2dv= 0;
_glUniformMatrix2x4dv= 0;
_glUniformMatrix4x2dv= 0;
_glUniformMatrix3x4dv= 0;
_glUniformMatrix4x3dv= 0;
// ARB_shader_atomic_counters
_glGetActiveAtomicCounterBufferiv= 0;
return;
}
@@ -531,6 +606,8 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID)
_areTessellationShadersSupported = osg::isGLExtensionSupported(contextID, "GL_ARB_tessellation_shader");
_isUniformBufferObjectSupported = osg::isGLExtensionSupported(contextID,"GL_ARB_uniform_buffer_object");
_isGetProgramBinarySupported = osg::isGLExtensionSupported(contextID,"GL_ARB_get_program_binary");
_isGpuShaderFp64Supported = osg::isGLExtensionSupported(contextID,"GL_ARB_gpu_shader_fp64");
_isShaderAtomicCountersSupported = osg::isGLExtensionSupported(contextID,"GL_ARB_shader_atomic_counters");
if( isGlslSupported() )
{
@@ -691,9 +768,32 @@ void GL2Extensions::setupGL2Extensions(unsigned int contextID)
setGLExtensionFuncPtr(_glGetActiveUniformBlockiv, "glGetActiveUniformBlockiv");
setGLExtensionFuncPtr(_glGetActiveUniformBlockName, "glGetActiveUniformBlockName");
setGLExtensionFuncPtr(_glUniformBlockBinding, "glUniformBlockBinding");
//ARB_get_program_binary
// ARB_get_program_binary
setGLExtensionFuncPtr(_glGetProgramBinary, "glGetProgramBinary");
setGLExtensionFuncPtr(_glProgramBinary, "glProgramBinary");
// ARB_gpu_shader_fp64
setGLExtensionFuncPtr(_glUniform1d, "glUniform1d" );
setGLExtensionFuncPtr(_glUniform2d, "glUniform2d" );
setGLExtensionFuncPtr(_glUniform3d, "glUniform3d" );
setGLExtensionFuncPtr(_glUniform4d, "glUniform4d" );
setGLExtensionFuncPtr(_glUniform1dv, "glUniform1dv" );
setGLExtensionFuncPtr(_glUniform2dv, "glUniform2dv" );
setGLExtensionFuncPtr(_glUniform3dv, "glUniform3dv" );
setGLExtensionFuncPtr(_glUniform4dv, "glUniform4dv" );
setGLExtensionFuncPtr(_glUniformMatrix2dv, "glUniformMatrix2dv" );
setGLExtensionFuncPtr(_glUniformMatrix3dv, "glUniformMatrix3dv" );
setGLExtensionFuncPtr(_glUniformMatrix4dv, "glUniformMatrix4dv" );
setGLExtensionFuncPtr(_glUniformMatrix2x3dv, "glUniformMatrix2x3dv" );
setGLExtensionFuncPtr(_glUniformMatrix3x2dv, "glUniformMatrix3x2dv" );
setGLExtensionFuncPtr(_glUniformMatrix2x4dv, "glUniformMatrix2x4dv" );
setGLExtensionFuncPtr(_glUniformMatrix4x2dv, "glUniformMatrix4x2dv" );
setGLExtensionFuncPtr(_glUniformMatrix3x4dv, "glUniformMatrix3x4dv" );
setGLExtensionFuncPtr(_glUniformMatrix4x3dv, "glUniformMatrix4x3dv" );
// ARB_shader_atomic_counters
setGLExtensionFuncPtr(_glGetActiveAtomicCounterBufferiv, "glGetActiveAtomicCounterBufferiv" );
}
@@ -2492,6 +2592,240 @@ void GL2Extensions::glProgramBinary(GLuint program,
}
}
void GL2Extensions::glUniform1d(GLint location, GLdouble v0) const
{
if (_glUniform1d)
{
_glUniform1d(location, v0);
}
else
{
NotSupported( "glUniform1d" );
}
}
void GL2Extensions::glUniform2d(GLint location, GLdouble v0, GLdouble v1) const
{
if (_glUniform2d)
{
_glUniform2d(location, v0, v1);
}
else
{
NotSupported( "glUniform2d" );
}
}
void GL2Extensions::glUniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2) const
{
if (_glUniform3d)
{
_glUniform3d(location, v0, v1, v2);
}
else
{
NotSupported( "glUniform3d" );
}
}
void GL2Extensions::glUniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) const
{
if (_glUniform4d)
{
_glUniform4d(location, v0, v1, v2, v3);
}
else
{
NotSupported( "glUniform4d" );
}
}
void GL2Extensions::glUniform1dv(GLint location, GLsizei count, const GLdouble *value) const
{
if (_glUniform1dv)
{
_glUniform1dv(location, count, value);
}
else
{
NotSupported( "glUniform1dv" );
}
}
void GL2Extensions::glUniform2dv(GLint location, GLsizei count, const GLdouble *value) const
{
if (_glUniform2dv)
{
_glUniform2dv(location, count, value);
}
else
{
NotSupported( "glUniform2dv" );
}
}
void GL2Extensions::glUniform3dv(GLint location, GLsizei count, const GLdouble *value) const
{
if (_glUniform3dv)
{
_glUniform3dv(location, count, value);
}
else
{
NotSupported( "glUniform3dv" );
}
}
void GL2Extensions::glUniform4dv(GLint location, GLsizei count, const GLdouble *value) const
{
if (_glUniform4dv)
{
_glUniform4dv(location, count, value);
}
else
{
NotSupported( "glUniform4dv" );
}
}
void GL2Extensions::glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) const
{
if (_glUniformMatrix2dv)
{
_glUniformMatrix2dv(location, count, transpose, value);
}
else
{
NotSupported( "glUniformMatrix2dv" );
}
}
void GL2Extensions::glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) const
{
if (_glUniformMatrix3dv)
{
_glUniformMatrix3dv(location, count, transpose, value);
}
else
{
NotSupported( "glUniformMatrix3dv" );
}
}
void GL2Extensions::glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) const
{
if (_glUniformMatrix4dv)
{
_glUniformMatrix4dv(location, count, transpose, value);
}
else
{
NotSupported( "glUniformMatrix4dv" );
}
}
void GL2Extensions::glUniformMatrix2x3dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix2x3dv)
{
_glUniformMatrix2x3dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix2x3dv" );
}
}
void GL2Extensions::glUniformMatrix3x2dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix3x2dv)
{
_glUniformMatrix3x2dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix3x2dv" );
}
}
void GL2Extensions::glUniformMatrix2x4dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix2x4dv)
{
_glUniformMatrix2x4dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix2x4dv" );
}
}
void GL2Extensions::glUniformMatrix4x2dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix4x2dv)
{
_glUniformMatrix4x2dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix4x2dv" );
}
}
void GL2Extensions::glUniformMatrix3x4dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix3x4dv)
{
_glUniformMatrix3x4dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix3x4dv" );
}
}
void GL2Extensions::glUniformMatrix4x3dv( GLint location, GLsizei count, GLboolean transpose, const GLdouble* value ) const
{
if (_glUniformMatrix4x3dv)
{
_glUniformMatrix4x3dv( location, count, transpose, value );
}
else
{
NotSupported( "glUniformMatrix4x3dv" );
}
}
void GL2Extensions::glGetActiveAtomicCounterBufferiv( GLuint program, GLuint bufferIndex, GLenum pname, GLint* params ) const
{
if (_glGetActiveAtomicCounterBufferiv)
{
_glGetActiveAtomicCounterBufferiv( program, bufferIndex, pname, params );
}
else
{
NotSupported( "glGetActiveAtomicCounterBufferiv" );
}
}
///////////////////////////////////////////////////////////////////////////
// C++-friendly convenience methods

View File

@@ -3,6 +3,7 @@
* Copyright (C) 2004-2005 Nathan Cournia
* Copyright (C) 2008 Zebra Imaging
* Copyright (C) 2010 VIRES Simulationstechnologie GmbH
* Copyright (C) 2012 David Callu
*
* This application is open source and may be redistributed and/or modified
* freely and without restriction, both in commercial and non commercial
@@ -104,7 +105,8 @@ Program::ProgramBinary::ProgramBinary() : _format(0)
{
}
Program::ProgramBinary::ProgramBinary(const ProgramBinary& rhs, const osg::CopyOp&) :
Program::ProgramBinary::ProgramBinary(const ProgramBinary& rhs, const osg::CopyOp& copyop) :
osg::Object(rhs, copyop),
_data(rhs._data), _format(rhs._format)
{
}
@@ -353,7 +355,7 @@ void Program::setParameter( GLenum pname, GLint value )
}
}
void Program::setParameterfv( GLenum pname, const GLfloat* value )
void Program::setParameterfv( GLenum pname, const GLfloat* /*value*/ )
{
switch( pname )
{
@@ -714,11 +716,12 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
{
OSG_WARN << "uniform block " << blockName << " has no binding.\n";
}
}
}
typedef std::map<GLuint, std::string> AtomicCounterMap;
AtomicCounterMap atomicCounterMap;
// build _uniformInfoMap
GLint numUniforms = 0;
GLsizei maxLen = 0;
@@ -744,6 +747,11 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
name[pos] = 0;
}
if (type == GL_UNSIGNED_INT_ATOMIC_COUNTER)
{
atomicCounterMap[i] = name;
}
GLint loc = _extensions->glGetUniformLocation( _glProgramHandle, name );
if( loc != -1 )
@@ -760,6 +768,83 @@ void Program::PerContextProgram::linkProgram(osg::State& state)
delete [] name;
}
// print atomic counter
if (_extensions->isShaderAtomicCounterSupported())
{
std::vector<GLint> bufferIndex( atomicCounterMap.size(), 0 );
std::vector<GLuint> uniformIndex;
for (AtomicCounterMap::iterator it = atomicCounterMap.begin(), end = atomicCounterMap.end();
it != end; ++it)
{
uniformIndex.push_back(it->first);
}
_extensions->glGetActiveUniformsiv( _glProgramHandle, uniformIndex.size(),
&(uniformIndex[0]), GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX,
&(bufferIndex[0]) );
for (unsigned int j = 0; j < uniformIndex.size(); ++j)
{
OSG_INFO << "\tUniform atomic counter \""<<atomicCounterMap[ uniformIndex[j] ] <<"\""
<<" buffer bind= " << bufferIndex[j] << ".\n";
}
std::map<int, std::vector<int> > bufferIndexToUniformIndices;
for (unsigned int i=0; i<bufferIndex.size(); ++i)
{
bufferIndexToUniformIndices[ bufferIndex[i] ].push_back( uniformIndex[i] );
}
GLuint activeAtomicCounterBuffers = 0;
_extensions->glGetProgramiv(_glProgramHandle, GL_ACTIVE_ATOMIC_COUNTER_BUFFERS,
reinterpret_cast<GLint*>(&activeAtomicCounterBuffers));
if (activeAtomicCounterBuffers > 0)
{
for (GLuint i = 0; i < activeAtomicCounterBuffers; ++i)
{
GLint bindID = 0;
_extensions->glGetActiveAtomicCounterBufferiv(_glProgramHandle, i,
GL_ATOMIC_COUNTER_BUFFER_BINDING,
&bindID);
GLsizei num = 0;
_extensions->glGetActiveAtomicCounterBufferiv(_glProgramHandle, i,
GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS,
&num);
GLsizei minSize = 0;
_extensions->glGetActiveAtomicCounterBufferiv(_glProgramHandle, i,
GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE,
&minSize);
OSG_INFO << "\tUniform atomic counter buffer bind \"" << bindID << "\""
<< " num active atomic counter= "<< num
<< " min size= " << minSize << "\n";
if (num)
{
std::vector<GLint> indices(num);
_extensions->glGetActiveAtomicCounterBufferiv(_glProgramHandle, i,
GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES,
&(indices[0]));
OSG_INFO << "\t\tindices used= ";
for (GLint j = 0; j < num; ++j)
{
OSG_INFO << indices[j];
if (j < (num-1))
{
OSG_INFO << ", ";
}
else
{
OSG_INFO << ".\n";
}
}
}
}
}
}
// build _attribInfoMap
GLint numAttrib = 0;
_extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttrib );

File diff suppressed because it is too large Load Diff

View File

@@ -43,7 +43,9 @@ void Uniform::write(DataOutputStream* out){
out->writeUInt(getNumElements());
if( getFloatArray() ) out->writeArray( getFloatArray() );
if( getDoubleArray() ) out->writeArray( getDoubleArray() );
if( getIntArray() ) out->writeArray( getIntArray() );
if( getUIntArray() ) out->writeArray( getUIntArray() );
}
else
{
@@ -177,7 +179,9 @@ void Uniform::read(DataInputStream* in)
osg::Array* data = in->readArray();
setArray( dynamic_cast<osg::FloatArray*>(data) );
setArray( dynamic_cast<osg::DoubleArray*>(data) );
setArray( dynamic_cast<osg::IntArray*>(data) );
setArray( dynamic_cast<osg::UIntArray*>(data) );
}
else
{

View File

@@ -65,6 +65,7 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
Array* data = Array_readLocalData(fr);
uniform.setArray( dynamic_cast<FloatArray*>(data) );
uniform.setArray( dynamic_cast<DoubleArray*>(data) );
uniform.setArray( dynamic_cast<IntArray*>(data) );
uniform.setArray( dynamic_cast<UIntArray*>(data) );
}

View File

@@ -18,6 +18,8 @@ static bool readElements( osgDB::InputStream& is, osg::Uniform& uniform )
{
case osg::Array::FloatArrayType:
uniform.setArray( static_cast<osg::FloatArray*>(array) ); break;
case osg::Array::DoubleArrayType:
uniform.setArray( static_cast<osg::DoubleArray*>(array) ); break;
case osg::Array::IntArrayType:
uniform.setArray( static_cast<osg::IntArray*>(array) ); break;
case osg::Array::UIntArrayType:
@@ -35,6 +37,11 @@ static bool writeElements( osgDB::OutputStream& os, const osg::Uniform& uniform
os << (uniform.getFloatArray()!=NULL);
os.writeArray( uniform.getFloatArray() );
}
if ( uniform.getDoubleArray()!=NULL )
{
os << (uniform.getDoubleArray()!=NULL);
os.writeArray( uniform.getDoubleArray() );
}
else if ( uniform.getIntArray()!=NULL )
{
os << (uniform.getIntArray()!=NULL);
@@ -58,17 +65,47 @@ REGISTER_OBJECT_WRAPPER( Uniform,
ADD_ENUM_VALUE( FLOAT_VEC2 );
ADD_ENUM_VALUE( FLOAT_VEC3 );
ADD_ENUM_VALUE( FLOAT_VEC4 );
ADD_ENUM_VALUE( DOUBLE );
ADD_ENUM_VALUE( DOUBLE_VEC2 );
ADD_ENUM_VALUE( DOUBLE_VEC3 );
ADD_ENUM_VALUE( DOUBLE_VEC4 );
ADD_ENUM_VALUE( INT );
ADD_ENUM_VALUE( INT_VEC2 );
ADD_ENUM_VALUE( INT_VEC3 );
ADD_ENUM_VALUE( INT_VEC4 );
ADD_ENUM_VALUE( UNSIGNED_INT );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC2 );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC3 );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC4 );
ADD_ENUM_VALUE( BOOL );
ADD_ENUM_VALUE( BOOL_VEC2 );
ADD_ENUM_VALUE( BOOL_VEC3 );
ADD_ENUM_VALUE( BOOL_VEC4 );
ADD_ENUM_VALUE( FLOAT_MAT2 );
ADD_ENUM_VALUE( FLOAT_MAT3 );
ADD_ENUM_VALUE( FLOAT_MAT4 );
ADD_ENUM_VALUE( FLOAT_MAT2x3 );
ADD_ENUM_VALUE( FLOAT_MAT2x4 );
ADD_ENUM_VALUE( FLOAT_MAT3x2 );
ADD_ENUM_VALUE( FLOAT_MAT3x4 );
ADD_ENUM_VALUE( FLOAT_MAT4x2 );
ADD_ENUM_VALUE( FLOAT_MAT4x3 );
ADD_ENUM_VALUE( DOUBLE_MAT2 );
ADD_ENUM_VALUE( DOUBLE_MAT3 );
ADD_ENUM_VALUE( DOUBLE_MAT4 );
ADD_ENUM_VALUE( DOUBLE_MAT2x3 );
ADD_ENUM_VALUE( DOUBLE_MAT2x4 );
ADD_ENUM_VALUE( DOUBLE_MAT3x2 );
ADD_ENUM_VALUE( DOUBLE_MAT3x4 );
ADD_ENUM_VALUE( DOUBLE_MAT4x2 );
ADD_ENUM_VALUE( DOUBLE_MAT4x3 );
ADD_ENUM_VALUE( SAMPLER_1D );
ADD_ENUM_VALUE( SAMPLER_2D );
ADD_ENUM_VALUE( SAMPLER_3D );
@@ -77,41 +114,82 @@ REGISTER_OBJECT_WRAPPER( Uniform,
ADD_ENUM_VALUE( SAMPLER_2D_SHADOW );
ADD_ENUM_VALUE( SAMPLER_1D_ARRAY );
ADD_ENUM_VALUE( SAMPLER_2D_ARRAY );
ADD_ENUM_VALUE( SAMPLER_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( SAMPLER_1D_ARRAY_SHADOW );
ADD_ENUM_VALUE( SAMPLER_2D_ARRAY_SHADOW );
ADD_ENUM_VALUE( FLOAT_MAT2x3 );
ADD_ENUM_VALUE( FLOAT_MAT2x4 );
ADD_ENUM_VALUE( FLOAT_MAT3x2 );
ADD_ENUM_VALUE( FLOAT_MAT3x4 );
ADD_ENUM_VALUE( FLOAT_MAT4x2 );
ADD_ENUM_VALUE( FLOAT_MAT4x3 );
ADD_ENUM_VALUE( SAMPLER_BUFFER );
ADD_ENUM_VALUE( SAMPLER_2D_MULTISAMPLE );
ADD_ENUM_VALUE( SAMPLER_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( SAMPLER_CUBE_SHADOW );
ADD_ENUM_VALUE( UNSIGNED_INT );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC2 );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC3 );
ADD_ENUM_VALUE( UNSIGNED_INT_VEC4 );
ADD_ENUM_VALUE( SAMPLER_CUBE_MAP_ARRAY_SHADOW );
ADD_ENUM_VALUE( SAMPLER_BUFFER );
ADD_ENUM_VALUE( SAMPLER_2D_RECT );
ADD_ENUM_VALUE( SAMPLER_2D_RECT_SHADOW );
ADD_ENUM_VALUE( INT_SAMPLER_1D );
ADD_ENUM_VALUE( INT_SAMPLER_2D );
ADD_ENUM_VALUE( INT_SAMPLER_3D );
ADD_ENUM_VALUE( INT_SAMPLER_CUBE );
ADD_ENUM_VALUE( INT_SAMPLER_2D_RECT );
ADD_ENUM_VALUE( INT_SAMPLER_1D_ARRAY );
ADD_ENUM_VALUE( INT_SAMPLER_2D_ARRAY );
ADD_ENUM_VALUE( INT_SAMPLER_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( INT_SAMPLER_2D_MULTISAMPLE );
ADD_ENUM_VALUE( INT_SAMPLER_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( INT_SAMPLER_BUFFER );
ADD_ENUM_VALUE( INT_SAMPLER_2D_RECT );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_1D );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_3D );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_CUBE );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D_RECT );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_1D_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_BUFFER );
ADD_ENUM_VALUE( UNSIGNED_INT_SAMPLER_2D_RECT );
ADD_ENUM_VALUE( IMAGE_1D );
ADD_ENUM_VALUE( IMAGE_2D );
ADD_ENUM_VALUE( IMAGE_3D );
ADD_ENUM_VALUE( IMAGE_2D_RECT );
ADD_ENUM_VALUE( IMAGE_CUBE );
ADD_ENUM_VALUE( IMAGE_BUFFER );
ADD_ENUM_VALUE( IMAGE_1D_ARRAY );
ADD_ENUM_VALUE( IMAGE_2D_ARRAY );
ADD_ENUM_VALUE( IMAGE_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( IMAGE_2D_MULTISAMPLE );
ADD_ENUM_VALUE( IMAGE_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( INT_IMAGE_1D );
ADD_ENUM_VALUE( INT_IMAGE_2D );
ADD_ENUM_VALUE( INT_IMAGE_3D );
ADD_ENUM_VALUE( INT_IMAGE_2D_RECT );
ADD_ENUM_VALUE( INT_IMAGE_CUBE );
ADD_ENUM_VALUE( INT_IMAGE_BUFFER );
ADD_ENUM_VALUE( INT_IMAGE_1D_ARRAY );
ADD_ENUM_VALUE( INT_IMAGE_2D_ARRAY );
ADD_ENUM_VALUE( INT_IMAGE_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( INT_IMAGE_2D_MULTISAMPLE );
ADD_ENUM_VALUE( INT_IMAGE_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_1D );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_2D );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_3D );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_2D_RECT );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_CUBE );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_BUFFER );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_1D_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_2D_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_2D_MULTISAMPLE );
ADD_ENUM_VALUE( UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY );
ADD_ENUM_VALUE( UNDEFINED );
END_ENUM_SERIALIZER(); // _type
ADD_UINT_SERIALIZER( NumElements, 0 ); // _numElements
ADD_USER_SERIALIZER( Elements ); // _floatArray, _intArray, _uintArray
ADD_USER_SERIALIZER( Elements ); // _floatArray, _doubleArray, _intArray, _uintArray
ADD_OBJECT_SERIALIZER( UpdateCallback, osg::Uniform::Callback, NULL ); // _updateCallback
ADD_OBJECT_SERIALIZER( EventCallback, osg::Uniform::Callback, NULL ); // _eventCallback
}