From a45c4c8f3986f0c7a2b0680f89d5f84bc548894b Mon Sep 17 00:00:00 2001 From: mp3butcher Date: Thu, 27 Jul 2017 12:27:55 +0200 Subject: [PATCH] set DIBO of the drawcommandarray directly in their interface constructor it makes osggpu use case lighter + drawcommandarray can't exist without a BO --- examples/osggpucull/osggpucull.cpp | 6 ++---- include/osg/PrimitiveSetIndirect | 14 ++++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/osggpucull/osggpucull.cpp b/examples/osggpucull/osggpucull.cpp index 0c00bbef3..de21f0280 100644 --- a/examples/osggpucull/osggpucull.cpp +++ b/examples/osggpucull/osggpucull.cpp @@ -181,18 +181,16 @@ struct IndirectTarget : maxTargetQuantity(0) { indirectCommands = new osg::DefaultIndirectCommandDrawArrays; + indirectCommands->getBufferObject()->setUsage(GL_DYNAMIC_DRAW); } IndirectTarget( AggregateGeometryVisitor* agv, osg::Program* program ) : geometryAggregator(agv), drawProgram(program), maxTargetQuantity(0) { indirectCommands = new osg::DefaultIndirectCommandDrawArrays; + indirectCommands->getBufferObject()->setUsage(GL_DYNAMIC_DRAW); } void endRegister(unsigned int index, unsigned int rowsPerInstance, GLenum pixelFormat, GLenum type, GLint internalFormat, bool useMultiDrawArraysIndirect ) { - osg::DrawIndirectBufferObject * indirectCommandbuffer = new osg::DrawIndirectBufferObject(); - indirectCommandbuffer->setUsage(GL_DYNAMIC_DRAW); - indirectCommands->setBufferObject(indirectCommandbuffer); - indirectCommandTextureBuffer = new osg::TextureBuffer(indirectCommands); indirectCommandTextureBuffer->setInternalFormat( GL_R32I ); indirectCommandTextureBuffer->bindToImageUnit(index, osg::Texture::READ_WRITE); diff --git a/include/osg/PrimitiveSetIndirect b/include/osg/PrimitiveSetIndirect index 6c8567c83..eae239076 100644 --- a/include/osg/PrimitiveSetIndirect +++ b/include/osg/PrimitiveSetIndirect @@ -25,7 +25,7 @@ namespace osg { class OSG_EXPORT IndirectCommandDrawArrays: public BufferData { public: - IndirectCommandDrawArrays():BufferData(){} + IndirectCommandDrawArrays():BufferData(){setBufferObject(new DrawIndirectBufferObject());} IndirectCommandDrawArrays(const IndirectCommandDrawArrays& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/) :BufferData(copy, copyop){ } @@ -40,7 +40,7 @@ public: class OSG_EXPORT IndirectCommandDrawElements: public BufferData { public: - IndirectCommandDrawElements():BufferData(){} + IndirectCommandDrawElements():BufferData(){setBufferObject(new DrawIndirectBufferObject());} IndirectCommandDrawElements(const IndirectCommandDrawElements& copy,const CopyOp& copyop/*=CopyOp::SHALLOW_COPY*/) :BufferData(copy, copyop){} @@ -147,8 +147,9 @@ public: /// set command array of this indirect primitive set inline void setIndirectCommandArray(IndirectCommandDrawElements*idc) { _indirectCommandArray = idc; - if(!_indirectCommandArray->getBufferObject()) - _indirectCommandArray->setBufferObject(new osg::DrawIndirectBufferObject()); + //ensure bo of idc is of the correct type + if(!dynamic_cast(_indirectCommandArray->getBufferObject())) + _indirectCommandArray->setBufferObject(new DrawIndirectBufferObject()); } /// get command array of this indirect primitive set inline IndirectCommandDrawElements* getIndirectCommandArray() { return _indirectCommandArray; } @@ -655,8 +656,9 @@ public: inline void setIndirectCommandArray(IndirectCommandDrawArrays*idc) { _indirectCommandArray = idc; - if(!_indirectCommandArray->getBufferObject()) - _indirectCommandArray->setBufferObject(new osg::DrawIndirectBufferObject()); + //ensure bo of idc is of the correct type + if(!dynamic_cast(_indirectCommandArray->getBufferObject())) + _indirectCommandArray->setBufferObject(new DrawIndirectBufferObject()); } inline const IndirectCommandDrawArrays* getIndirectCommandArray() const { return _indirectCommandArray;