Changeset 9447

Show
Ignore:
Timestamp:
01/06/09 15:55:49 (6 years ago)
Author:
robert
Message:

Added support for primitive instancing

Location:
OpenSceneGraph/trunk
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osg/PrimitiveSet

    r8467 r9447  
    176176        }; 
    177177 
    178         PrimitiveSet(Type primType=PrimitiveType,GLenum mode=0): 
     178        PrimitiveSet(Type primType=PrimitiveType,GLenum mode=0, int numInstances=0): 
    179179            _primitiveType(primType), 
     180            _numInstances(numInstances), 
    180181            _mode(mode), 
    181182            _modifiedCount(0), 
     
    185186            Object(prim,copyop), 
    186187            _primitiveType(prim._primitiveType), 
     188            _numInstances(prim._numInstances), 
    187189            _mode(prim._mode), 
    188190            _modifiedCount(0), 
     
    201203        virtual const DrawElements* getDrawElements() const { return 0; } 
    202204             
     205        void setNumInstances(int n) { _numInstances = n; } 
     206        int getNumInstances() const { return _numInstances; } 
     207 
    203208        void setMode(GLenum mode) { _mode = mode; } 
    204209        GLenum getMode() const { return _mode; } 
     
    239244 
    240245        Type            _primitiveType; 
     246        int             _numInstances; 
    241247        GLenum          _mode; 
    242248        unsigned int    _modifiedCount; 
     
    276282            _count(0) {} 
    277283     
    278         DrawArrays(GLenum mode, GLint first, GLsizei count): 
    279             PrimitiveSet(DrawArraysPrimitiveType,mode), 
     284        DrawArrays(GLenum mode, GLint first, GLsizei count, int numInstances=0): 
     285            PrimitiveSet(DrawArraysPrimitiveType, mode, numInstances), 
    280286            _first(first), 
    281287            _count(count) {} 
     
    386392    public: 
    387393         
    388         DrawElements(Type primType=PrimitiveType, GLenum mode=0): 
    389             PrimitiveSet(primType,mode), 
     394        DrawElements(Type primType=PrimitiveType, GLenum mode=0, int numInstances=0): 
     395            PrimitiveSet(primType,mode, numInstances), 
    390396            _eboOffset(0) {} 
    391397     
     
    473479            vector_type(array) {} 
    474480 
    475         DrawElementsUByte(GLenum mode, unsigned int no, const GLubyte* ptr) :  
    476             DrawElements(DrawElementsUBytePrimitiveType,mode), 
     481        DrawElementsUByte(GLenum mode, unsigned int no, const GLubyte* ptr, int numInstances=0) :  
     482            DrawElements(DrawElementsUBytePrimitiveType,mode,numInstances), 
    477483            vector_type(ptr,ptr+no) {} 
    478484 
     
    543549            vector_type(array) {} 
    544550 
    545         DrawElementsUShort(GLenum mode, unsigned int no, const GLushort* ptr) :  
    546             DrawElements(DrawElementsUShortPrimitiveType,mode), 
     551        DrawElementsUShort(GLenum mode, unsigned int no, const GLushort* ptr, int numInstances=0) :  
     552            DrawElements(DrawElementsUShortPrimitiveType,mode,numInstances), 
    547553            vector_type(ptr,ptr+no) {} 
    548554 
     
    617623            vector_type(array) {} 
    618624 
    619         DrawElementsUInt(GLenum mode, unsigned int no, const GLuint* ptr) :  
    620             DrawElements(DrawElementsUIntPrimitiveType,mode), 
     625        DrawElementsUInt(GLenum mode, unsigned int no, const GLuint* ptr, int numInstances=0) :  
     626            DrawElements(DrawElementsUIntPrimitiveType,mode,numInstances), 
    621627            vector_type(ptr,ptr+no) {} 
    622628 
  • OpenSceneGraph/trunk/include/osg/State

    r7648 r9447  
    460460            _currentPBO = 0; 
    461461        } 
     462         
     463         
     464        inline void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount) 
     465        { 
     466            if (primcount>=1 && _glDrawArraysInstanced!=0) _glDrawArraysInstanced(mode, first, count, primcount); 
     467            else glDrawArrays(mode, first, count); 
     468        } 
     469     
     470        inline void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount ) 
     471        { 
     472            if (primcount>=1 && _glDrawElementsInstanced!=0) _glDrawElementsInstanced(mode, count, type, indices, primcount); 
     473            else glDrawElements(mode, count, type, indices); 
     474        } 
     475 
    462476 
    463477        /** Wrapper around glInterleavedArrays(..). 
     
    12941308        typedef void (APIENTRY * DisableVertexAttribProc) (unsigned int); 
    12951309        typedef void (APIENTRY * BindBufferProc) (GLenum target, GLuint buffer); 
    1296  
     1310         
     1311        typedef void (APIENTRY * DrawArraysInstancedProc)( GLenum mode, GLint first, GLsizei count, GLsizei primcount ); 
     1312        typedef void (APIENTRY * DrawElementsInstancedProc)( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount ); 
    12971313 
    12981314        bool                        _extensionProcsInitialized; 
     
    13071323        DisableVertexAttribProc     _glDisableVertexAttribArray; 
    13081324        BindBufferProc              _glBindBuffer; 
    1309  
     1325        DrawArraysInstancedProc     _glDrawArraysInstanced; 
     1326        DrawElementsInstancedProc   _glDrawElementsInstanced; 
    13101327 
    13111328        unsigned int                                            _dynamicObjectCount; 
  • OpenSceneGraph/trunk/src/osg/PrimitiveSet.cpp

    r6582 r9447  
    3636} 
    3737 
    38 void DrawArrays::draw(State&, bool) const  
    39 { 
    40     glDrawArrays(_mode,_first,_count); 
     38void DrawArrays::draw(State& state, bool) const  
     39{ 
     40    if (_numInstances>=1) state.glDrawArraysInstanced(_mode,_first,_count, _numInstances); 
     41    else glDrawArrays(_mode,_first,_count); 
    4142} 
    4243 
     
    130131        if (ebo) 
    131132        { 
    132             glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, getElementBufferObjectOffset()); 
     133            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, getElementBufferObjectOffset(), _numInstances); 
     134            else glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, getElementBufferObjectOffset()); 
    133135        } 
    134136        else 
    135137        { 
    136             glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, &front()); 
     138            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     139            else glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, &front()); 
    137140        } 
    138141    } 
    139142    else  
    140143    { 
    141         glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, &front()); 
     144        if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     145        else glDrawElements(_mode, size(), GL_UNSIGNED_BYTE, &front()); 
    142146    } 
    143147} 
     
    177181        if (ebo) 
    178182        { 
    179             glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, getElementBufferObjectOffset()); 
     183            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, getElementBufferObjectOffset(), _numInstances); 
     184            else glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, getElementBufferObjectOffset()); 
    180185        } 
    181186        else 
    182187        { 
    183             glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, &front()); 
     188            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     189            else glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, &front()); 
    184190        } 
    185191    } 
    186192    else  
    187193    { 
    188         glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, &front()); 
     194        if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     195        else glDrawElements(_mode, size(), GL_UNSIGNED_SHORT, &front()); 
    189196    } 
    190197} 
     
    224231        if (ebo) 
    225232        { 
    226             glDrawElements(_mode, size(), GL_UNSIGNED_INT, getElementBufferObjectOffset()); 
     233            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, getElementBufferObjectOffset(), _numInstances); 
     234            else glDrawElements(_mode, size(), GL_UNSIGNED_INT, getElementBufferObjectOffset()); 
    227235        } 
    228236        else 
    229237        { 
    230             glDrawElements(_mode, size(), GL_UNSIGNED_INT, &front()); 
     238            if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     239            else glDrawElements(_mode, size(), GL_UNSIGNED_INT, &front()); 
    231240        } 
    232241    } 
    233242    else  
    234243    { 
    235         glDrawElements(_mode, size(), GL_UNSIGNED_INT, &front()); 
     244        if (_numInstances>=1) state.glDrawElementsInstanced(_mode, size(), GL_UNSIGNED_BYTE, &front(), _numInstances); 
     245        else glDrawElements(_mode, size(), GL_UNSIGNED_INT, &front()); 
    236246    } 
    237247} 
  • OpenSceneGraph/trunk/src/osg/State.cpp

    r9380 r9447  
    8080    _glEnableVertexAttribArray = 0; 
    8181    _glDisableVertexAttribArray = 0; 
     82    _glDrawArraysInstanced = 0; 
     83    _glDrawElementsInstanced = 0; 
    8284 
    8385    _dynamicObjectCount  = 0; 
     
    755757    setGLExtensionFuncPtr(_glBindBuffer, "glBindBuffer","glBindBufferARB"); 
    756758 
     759    setGLExtensionFuncPtr(_glDrawArraysInstanced, "glDrawArraysInstanced","glDrawArraysInstancedEXT"); 
     760    setGLExtensionFuncPtr(_glDrawElementsInstanced, "glDrawElementsInstanced","glDrawElementsInstancedEXT"); 
     761 
    757762    if ( osg::getGLVersionNumber() >= 2.0 || osg::isGLExtensionSupported(_contextID,"GL_ARB_vertex_shader") ) 
    758763    { 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/IveVersion.h

    r9411 r9447  
    4747#define VERSION_0036 36 
    4848#define VERSION_0037 37 
     49#define VERSION_0038 38 
    4950 
    50 #define VERSION VERSION_0037 
     51#define VERSION VERSION_0038 
    5152 
    5253/* The BYTE_SEX tag is used to check the endian 
  • OpenSceneGraph/trunk/src/osgPlugins/ive/PrimitiveSet.cpp

    r4801 r9447  
    3131 
    3232 
     33    if ( out->getVersion() >= VERSION_0038 ) 
     34    { 
     35        out->writeInt(getNumInstances()); 
     36    } 
     37  
    3338    // Write PrimitiveSet's properties. 
    3439    out->writeInt(getMode()); 
     
    5055 
    5156 
     57        if ( in->getVersion() >= VERSION_0038 ) 
     58        { 
     59            setNumInstances(in->readInt()); 
     60        } 
     61 
    5262        // Read in primitiveset properties. 
    5363        setMode(in->readInt()); 
  • OpenSceneGraph/trunk/src/osgPlugins/osg/Geometry.cpp

    r9343 r9447  
    10041004{ 
    10051005    bool iteratorAdvanced = false; 
    1006     if (fr.matchSequence("DrawArrays %w %i %i")) 
     1006    bool firstMatched = false; 
     1007    if ((firstMatched = fr.matchSequence("DrawArrays %w %i %i %i")) ||  
     1008         fr.matchSequence("DrawArrays %w %i %i") ) 
    10071009    { 
    10081010         
     
    10161018        fr[3].getInt(count); 
    10171019 
    1018         geom.addPrimitiveSet(new DrawArrays(mode,first,count)); 
    1019  
    1020         fr += 4; 
    1021          
    1022         iteratorAdvanced = true; 
    1023          
    1024     } 
    1025     else if (fr.matchSequence("DrawArrayLengths %w %i %i {")) 
     1020        int numInstances = 0; 
     1021        if (firstMatched) 
     1022        { 
     1023            fr[4].getInt(numInstances); 
     1024            fr += 5; 
     1025        } 
     1026        else 
     1027        { 
     1028            fr += 4; 
     1029        } 
     1030 
     1031        geom.addPrimitiveSet(new DrawArrays(mode, first, count, numInstances)); 
     1032 
     1033         
     1034        iteratorAdvanced = true; 
     1035         
     1036    } 
     1037    else if ((firstMatched = fr.matchSequence("DrawArrayLengths %w %i %i %i {")) ||  
     1038         fr.matchSequence("DrawArrayLengths %w %i %i {") ) 
    10261039    { 
    10271040        int entry = fr[1].getNoNestedBrackets(); 
     
    10361049        fr[3].getInt(capacity); 
    10371050         
    1038         fr += 5; 
    1039          
     1051        int numInstances = 0; 
     1052        if (firstMatched) 
     1053        { 
     1054            fr[4].getInt(numInstances); 
     1055            fr += 6; 
     1056        } 
     1057        else 
     1058        { 
     1059            fr += 5; 
     1060        } 
     1061 
    10401062        DrawArrayLengths* prim = new DrawArrayLengths; 
    10411063        prim->setMode(mode); 
     1064        prim->setNumInstances(numInstances); 
    10421065        prim->setFirst(first); 
    10431066        prim->reserve(capacity); 
     
    10581081        iteratorAdvanced = true; 
    10591082    } 
    1060     else if (fr.matchSequence("DrawElementsUByte %w %i {")) 
     1083    else if ((firstMatched = fr.matchSequence("DrawElementsUByte %w %i %i {")) ||  
     1084         fr.matchSequence("DrawElementsUByte %w %i {")) 
    10611085    { 
    10621086        int entry = fr[1].getNoNestedBrackets(); 
     
    10681092        fr[2].getInt(capacity); 
    10691093         
    1070         fr += 4; 
    1071          
     1094        int numInstances = 0; 
     1095        if (firstMatched) 
     1096        { 
     1097            fr[3].getInt(numInstances); 
     1098            fr += 5; 
     1099        } 
     1100        else 
     1101        { 
     1102            fr += 4; 
     1103        } 
     1104 
    10721105        DrawElementsUByte* prim = new DrawElementsUByte; 
    10731106        prim->setMode(mode); 
     1107        prim->setNumInstances(numInstances); 
    10741108        prim->reserve(capacity); 
    10751109 
     
    10891123        iteratorAdvanced = true; 
    10901124    } 
    1091     else if (fr.matchSequence("DrawElementsUShort %w %i {")) 
     1125    else if ((firstMatched = fr.matchSequence("DrawElementsUShort %w %i %i {")) ||  
     1126         fr.matchSequence("DrawElementsUShort %w %i {")) 
    10921127    { 
    10931128        int entry = fr[1].getNoNestedBrackets(); 
     
    10991134        fr[2].getInt(capacity); 
    11001135         
    1101         fr += 4; 
     1136        int numInstances = 0; 
     1137        if (firstMatched) 
     1138        { 
     1139            fr[3].getInt(numInstances); 
     1140            fr += 5; 
     1141        } 
     1142        else 
     1143        { 
     1144            fr += 4; 
     1145        } 
    11021146         
    11031147        DrawElementsUShort* prim = new DrawElementsUShort; 
    11041148        prim->setMode(mode); 
     1149        prim->setNumInstances(numInstances); 
    11051150        prim->reserve(capacity); 
    11061151 
     
    11201165        iteratorAdvanced = true; 
    11211166    } 
    1122     else if (fr.matchSequence("DrawElementsUInt %w %i {")) 
     1167    else if ((firstMatched = fr.matchSequence("DrawElementsUInt %w %i %i {")) ||  
     1168              fr.matchSequence("DrawElementsUInt %w %i {")) 
    11231169    { 
    11241170        int entry = fr[1].getNoNestedBrackets(); 
     
    11301176        fr[2].getInt(capacity); 
    11311177         
    1132         fr += 4; 
     1178        int numInstances = 0; 
     1179        if (firstMatched) 
     1180        { 
     1181            fr[3].getInt(numInstances); 
     1182            fr += 5; 
     1183        } 
     1184        else 
     1185        { 
     1186            fr += 4; 
     1187        } 
    11331188         
    11341189        DrawElementsUInt* prim = new DrawElementsUInt; 
    11351190        prim->setMode(mode); 
     1191        prim->setNumInstances(numInstances); 
    11361192        prim->reserve(capacity); 
    11371193 
     
    11631219            { 
    11641220                const DrawArrays& cprim = static_cast<const DrawArrays&>(prim); 
    1165                 fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.getFirst()<<" "<<cprim.getCount()<<std::endl; 
     1221                fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.getFirst()<<" "<<cprim.getCount(); 
     1222                if (prim.getNumInstances()>0) fw<<" "<<prim.getNumInstances(); 
     1223                fw<<std::endl; 
    11661224                return true; 
    11671225            } 
     
    11701228            { 
    11711229                const DrawArrayLengths& cprim = static_cast<const DrawArrayLengths&>(prim); 
    1172                 fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.getFirst()<<" "<<cprim.size()<<std::endl; 
     1230                fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.getFirst()<<" "<<cprim.size(); 
     1231                if (prim.getNumInstances()>0) fw<<" "<<prim.getNumInstances(); 
     1232                fw<<std::endl; 
    11731233                writeArray(fw,cprim.begin(),cprim.end()); 
    11741234                return true; 
     
    11781238            { 
    11791239                const DrawElementsUByte& cprim = static_cast<const DrawElementsUByte&>(prim); 
    1180                 fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size()<<std::endl; 
     1240                fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size(); 
     1241                if (prim.getNumInstances()>0) fw<<" "<<prim.getNumInstances(); 
     1242                fw<<std::endl; 
    11811243                writeArrayAsInts(fw,cprim.begin(),cprim.end()); 
    11821244                return true; 
     
    11861248            { 
    11871249                const DrawElementsUShort& cprim = static_cast<const DrawElementsUShort&>(prim); 
    1188                 fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size()<<std::endl; 
     1250                fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size(); 
     1251                if (prim.getNumInstances()>0) fw<<" "<<prim.getNumInstances(); 
     1252                fw<<std::endl; 
    11891253                writeArray(fw,cprim.begin(),cprim.end()); 
    11901254                return true; 
     
    11941258            { 
    11951259                const DrawElementsUInt& cprim = static_cast<const DrawElementsUInt&>(prim); 
    1196                 fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size()<<std::endl; 
     1260                fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.size(); 
     1261                if (prim.getNumInstances()>0) fw<<" "<<prim.getNumInstances(); 
     1262                fw<<std::endl; 
    11971263                writeArray(fw,cprim.begin(),cprim.end()); 
    11981264                return true;