MCPcopy Create free account
hub / github.com/OGRECave/ogre-next / clone

Method clone

OgreMain/src/Vao/OgreVertexArrayObject.cpp:199–307  ·  view source on GitHub ↗

-----------------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

197 }
198 //-----------------------------------------------------------------------------------
199 VertexArrayObject *VertexArrayObject::clone( VaoManager *vaoManager,
200 SharedVertexBufferMap *sharedBuffers,
201 int vertexBufferType, int indexBufferType ) const
202 {
203 assert( vertexBufferType < 0 || ( vertexBufferType >= BT_IMMUTABLE &&
204 vertexBufferType <= BT_DYNAMIC_PERSISTENT_COHERENT ) );
205 assert( indexBufferType < 0 || ( indexBufferType >= BT_IMMUTABLE &&
206 indexBufferType <= BT_DYNAMIC_PERSISTENT_COHERENT ) );
207
208 VertexBufferPackedVec newVertexBuffers;
209 newVertexBuffers.reserve( mVertexBuffers.size() );
210
211 VertexBufferPackedVec::const_iterator itBuffers = mVertexBuffers.begin();
212 VertexBufferPackedVec::const_iterator enBuffers = mVertexBuffers.end();
213
214 while( itBuffers != enBuffers )
215 {
216 if( sharedBuffers )
217 {
218 SharedVertexBufferMap::const_iterator itShared = sharedBuffers->find( *itBuffers );
219 if( itShared != sharedBuffers->end() )
220 {
221 // This buffer is shared. Reuse the one we created in a previous call.
222 newVertexBuffers.push_back( itShared->second );
223 ++itBuffers;
224 continue;
225 }
226 }
227
228 void *dstData =
229 OGRE_MALLOC_SIMD( ( *itBuffers )->getTotalSizeBytes(), MEMCATEGORY_GEOMETRY );
230 FreeOnDestructor dataPtrContainer( dstData );
231
232 // only map if there is no shadow buffer
233 if( ( *itBuffers )->getShadowCopy() )
234 {
235 const void *shadowBuff = ( *itBuffers )->getShadowCopy();
236 memcpy( dstData, shadowBuff, ( *itBuffers )->getTotalSizeBytes() );
237 }
238 else
239 {
240 AsyncTicketPtr asyncTicket =
241 ( *itBuffers )->readRequest( 0, ( *itBuffers )->getNumElements() );
242 const void *srcData = asyncTicket->map();
243 memcpy( dstData, srcData, ( *itBuffers )->getTotalSizeBytes() );
244 asyncTicket->unmap();
245 }
246
247 const BufferType bufferType = vertexBufferType < 0
248 ? ( *itBuffers )->getBufferType()
249 : static_cast<BufferType>( vertexBufferType );
250
251 const bool keepAsShadow = ( *itBuffers )->getShadowCopy() != 0;
252 VertexBufferPacked *newVertexBuffer = vaoManager->createVertexBuffer(
253 ( *itBuffers )->getVertexElements(), ( *itBuffers )->getNumElements(), bufferType,
254 dstData, keepAsShadow );
255
256 if( keepAsShadow ) // Don't free the pointer ourselves

Callers 2

setupComputeShadersMethod · 0.45
setupComputeShadersMethod · 0.45

Calls 13

readRequestMethod · 0.80
getBufferTypeMethod · 0.80
reserveMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
findMethod · 0.45
push_backMethod · 0.45
mapMethod · 0.45
unmapMethod · 0.45
createVertexBufferMethod · 0.45

Tested by 1

setupComputeShadersMethod · 0.36