void PixelBufferObject::compileBuffer(State& state) const { unsigned int contextID = state.getContextID(); _compiledList[contextID] = 1; osg::Image* image = _bufferEntryImagePair.second; _bufferEntryImagePair.first.modifiedCount[contextID] = image->getModifiedCount(); if (!image->valid()) return; Extensions* extensions = getExtensions(contextID,true); GLuint& pbo = buffer(contextID); if (pbo==0) { // building for the first time. _totalSize = image->getTotalSizeInBytes(); // don't generate buffer if size is zero. if (_totalSize==0) return; extensions->glGenBuffers(1, &pbo); extensions->glBindBuffer(_target, pbo); extensions->glBufferData(_target, _totalSize, NULL, _usage); } else { extensions->glBindBuffer(_target, pbo); if (_totalSize != image->getTotalSizeInBytes()) { // resize PBO. _totalSize = image->getTotalSizeInBytes(); extensions->glBufferData(_target, _totalSize, NULL, _usage); } } // osg::Timer_t start_tick = osg::Timer::instance()->tick(); void* pboMemory = extensions->glMapBuffer(_target, GL_WRITE_ONLY_ARB); // copy data across memcpy(pboMemory, image->data(), _totalSize); // Unmap the texture image buffer extensions->glUnmapBuffer(_target); _bufferEntryImagePair.first.modifiedCount[contextID] = image->getModifiedCount(); // osg::notify(osg::NOTICE)<<"pbo _totalSize="<<_totalSize<<std::endl; // osg::notify(osg::NOTICE)<<"pbo "<<osg::Timer::instance()->delta_m(start_tick,osg::Timer::instance()->tick())<<"ms"<<std::endl; }
void ElementBufferObject::compileBuffer(State& state) const { unsigned int contextID = state.getContextID(); _compiledList[contextID] = 1; // osg::notify(osg::NOTICE)<<"ElementBufferObject::compile"<<std::endl; Extensions* extensions = getExtensions(contextID,true); unsigned int totalSizeRequired = 0; // unsigned int numModified = 0; // unsigned int numNotModified = 0; for(BufferEntryDrawElementsPairs::const_iterator itr = _bufferEntryDrawElementsPairs.begin(); itr != _bufferEntryDrawElementsPairs.end(); ++itr) { const BufferEntryDrawElementsPair& bep = *itr; if (bep.second) { totalSizeRequired += bep.second->getTotalDataSize(); } } bool copyAll = false; GLuint& ebo = buffer(contextID); if (ebo==0) { // building for the first time. _totalSize = totalSizeRequired; // don't generate buffer if size is zero. if (_totalSize==0) return; extensions->glGenBuffers(1, &ebo); extensions->glBindBuffer(_target, ebo); extensions->glBufferData(_target, _totalSize, NULL, _usage); copyAll = true; } else { extensions->glBindBuffer(_target, ebo); if (_totalSize != totalSizeRequired) { // resize EBO. _totalSize = totalSizeRequired; extensions->glBufferData(_target, _totalSize, NULL, _usage); copyAll = true; } } // osg::Timer_t start_tick = osg::Timer::instance()->tick(); void* eboMemory = 0; #if 0 eboMemory = extensions->glMapBuffer(_target, GL_WRITE_ONLY_ARB); #endif size_t offset = 0; for(BufferEntryDrawElementsPairs::const_iterator itr = _bufferEntryDrawElementsPairs.begin(); itr != _bufferEntryDrawElementsPairs.end(); ++itr) { const BufferEntryDrawElementsPair& bep = *itr; const DrawElements* de = bep.second; if (de) { if (copyAll || bep.first.modifiedCount[contextID] != bep.second->getModifiedCount() || bep.first.dataSize != bep.second->getTotalDataSize()) { // copy data across bep.first.dataSize = bep.second->getTotalDataSize(); bep.first.modifiedCount[contextID] = de->getModifiedCount(); if (copyAll) { bep.first.offset = offset; de->setElementBufferObjectOffset((GLvoid*)offset); offset += bep.first.dataSize; } if (eboMemory) memcpy((char*)eboMemory + bep.first.offset, de->getDataPointer(), bep.first.dataSize); else extensions->glBufferSubData(_target, bep.first.offset, bep.first.dataSize, de->getDataPointer()); } } } // Unmap the texture image buffer if (eboMemory) extensions->glUnmapBuffer(_target); // osg::notify(osg::NOTICE)<<"pbo _totalSize="<<_totalSize<<std::endl; // osg::notify(osg::NOTICE)<<"pbo "<<osg::Timer::instance()->delta_m(start_tick,osg::Timer::instance()->tick())<<"ms"<<std::endl; }