//----------------------------------------------------------------------------- // allocVertexBuffer //----------------------------------------------------------------------------- GFXVertexBuffer * GFXD3D9Device::allocVertexBuffer( U32 numVerts, const GFXVertexFormat *vertexFormat, U32 vertSize, GFXBufferType bufferType ) { GFXD3D9VertexBuffer *res = new GFXD3D9VertexBuffer( this, numVerts, vertexFormat, vertSize, bufferType ); // Determine usage flags U32 usage = 0; D3DPOOL pool = D3DPOOL_DEFAULT; res->mNumVerts = 0; // Assumptions: // - static buffers are write once, use many // - dynamic buffers are write many, use many // - volatile buffers are write once, use once // You may never read from a buffer. switch(bufferType) { case GFXBufferTypeStatic: pool = D3DPOOL_MANAGED; res->registerResourceWithDevice(this); break; case GFXBufferTypeDynamic: case GFXBufferTypeVolatile: pool = D3DPOOL_DEFAULT; res->registerResourceWithDevice(this); usage |= D3DUSAGE_WRITEONLY; #ifndef TORQUE_OS_XENON usage |= D3DUSAGE_DYNAMIC; #endif break; } // Create vertex buffer if(bufferType == GFXBufferTypeVolatile) { // Get volatile stuff from a pool... AssertFatal( numVerts <= MAX_DYNAMIC_VERTS, "Cannot allocate that many verts in a volatile vertex buffer, increase MAX_DYNAMIC_VERTS! -- BJG" ); // This is all we need here, everything else lives in the lock method on the // buffer... -- BJG } else { allocVertexDecl( res ); // Get a new buffer... D3D9Assert( mD3DDevice->CreateVertexBuffer( vertSize * numVerts, usage, 0, pool, &res->vb, NULL ), "Failed to allocate VB" ); } res->mNumVerts = numVerts; return res; }
//----------------------------------------------------------------------------- // allocVertexBuffer //----------------------------------------------------------------------------- GFXVertexBuffer * GFXD3D9Device::allocVertexBuffer( U32 numVerts, const GFXVertexFormat *vertexFormat, U32 vertSize, GFXBufferType bufferType ) { PROFILE_SCOPE( GFXD3D9Device_allocVertexBuffer ); GFXD3D9VertexBuffer *res = new GFXD3D9VertexBuffer( this, numVerts, vertexFormat, vertSize, bufferType ); // Determine usage flags U32 usage = 0; D3DPOOL pool = D3DPOOL_DEFAULT; res->mNumVerts = 0; // Assumptions: // - static buffers are write once, use many // - dynamic buffers are write many, use many // - volatile buffers are write once, use once // You may never read from a buffer. switch(bufferType) { case GFXBufferTypeStatic: pool = isD3D9Ex() ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED; break; case GFXBufferTypeDynamic: case GFXBufferTypeVolatile: pool = D3DPOOL_DEFAULT; usage |= D3DUSAGE_WRITEONLY; #ifndef TORQUE_OS_XENON usage |= D3DUSAGE_DYNAMIC; #endif break; } res->registerResourceWithDevice(this); // Create vertex buffer if( bufferType == GFXBufferTypeVolatile ) { // NOTE: Volatile VBs are pooled and will be allocated at lock time. AssertFatal( numVerts <= MAX_DYNAMIC_VERTS, "GFXD3D9Device::allocVertexBuffer - Volatile vertex buffer is too big... see MAX_DYNAMIC_VERTS!" ); } else { // Requesting it will allocate it. vertexFormat->getDecl(); // Get a new buffer... D3D9Assert( mD3DDevice->CreateVertexBuffer( vertSize * numVerts, usage, 0, pool, &res->vb, NULL ), "Failed to allocate VB" ); } res->mNumVerts = numVerts; return res; }