void StreamingIndexBuffer::reserveSpace(UINT requiredSpace, GLenum type) { if (requiredSpace > mBufferSize) { if (mIndexBuffer) { mIndexBuffer->Release(); mIndexBuffer = NULL; } mBufferSize = std::max(requiredSpace, 2 * mBufferSize); D3DPOOL pool = getDisplay()->getBufferPool(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY); HRESULT result = mDevice->CreateIndexBuffer(mBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, type == GL_UNSIGNED_INT ? D3DFMT_INDEX32 : D3DFMT_INDEX16, pool, &mIndexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating a vertex buffer of size %lu.", mBufferSize); } mWritePosition = 0; } else if (mWritePosition + requiredSpace > mBufferSize) // Recycle { void *dummy; mIndexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); mIndexBuffer->Unlock(); mWritePosition = 0; } }
RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial()) { mWidth = 0; mHeight = 0; mInternalFormat = GL_RGBA4; mD3DFormat = D3DFMT_A8R8G8B8; mSamples = 0; }
IndexBuffer::IndexBuffer(IDirect3DDevice9 *device, UINT size, D3DFORMAT format) : mDevice(device), mBufferSize(size), mIndexBuffer(NULL) { if (size > 0) { D3DPOOL pool = getDisplay()->getBufferPool(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY); HRESULT result = device->CreateIndexBuffer(size, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, format, pool, &mIndexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating an index buffer of size %lu.", size); } } }
VertexBuffer::VertexBuffer(IDirect3DDevice9 *device, std::size_t size, DWORD usageFlags) : mDevice(device), mVertexBuffer(NULL) { if (size > 0) { D3DPOOL pool = getDisplay()->getBufferPool(usageFlags); HRESULT result = device->CreateVertexBuffer(size, usageFlags, 0, pool, &mVertexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating a vertex buffer of size %lu.", size); } } }
void StaticIndexBuffer::reserveSpace(UINT requiredSpace, GLenum type) { if (!mIndexBuffer && mBufferSize == 0) { D3DPOOL pool = getDisplay()->getBufferPool(D3DUSAGE_WRITEONLY); HRESULT result = mDevice->CreateIndexBuffer(requiredSpace, D3DUSAGE_WRITEONLY, type == GL_UNSIGNED_INT ? D3DFMT_INDEX32 : D3DFMT_INDEX16, pool, &mIndexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating a vertex buffer of size %lu.", mBufferSize); } mBufferSize = requiredSpace; mCacheType = type; } else if (mIndexBuffer && mBufferSize >= requiredSpace && mCacheType == type) { // Already allocated } else UNREACHABLE(); // Static index buffers can't be resized }
void StaticVertexBuffer::reserveRequiredSpace() { if (!mVertexBuffer && mBufferSize == 0) { D3DPOOL pool = getDisplay()->getBufferPool(D3DUSAGE_WRITEONLY); HRESULT result = mDevice->CreateVertexBuffer(mRequiredSpace, D3DUSAGE_WRITEONLY, 0, pool, &mVertexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating a vertex buffer of size %lu.", mRequiredSpace); } mBufferSize = mRequiredSpace; } else if (mVertexBuffer && mBufferSize >= mRequiredSpace) { // Already allocated } else UNREACHABLE(); // Static vertex buffers can't be resized mRequiredSpace = 0; }
void StreamingVertexBuffer::reserveRequiredSpace() { if (mRequiredSpace > mBufferSize) { if (mVertexBuffer) { mVertexBuffer->Release(); mVertexBuffer = NULL; } mBufferSize = std::max(mRequiredSpace, 3 * mBufferSize / 2); // 1.5 x mBufferSize is arbitrary and should be checked to see we don't have too many reallocations. D3DPOOL pool = getDisplay()->getBufferPool(D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY); HRESULT result = mDevice->CreateVertexBuffer(mBufferSize, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, 0, pool, &mVertexBuffer, NULL); mSerial = issueSerial(); if (FAILED(result)) { ERR("Out of memory allocating a vertex buffer of size %lu.", mBufferSize); } mWritePosition = 0; } else if (mWritePosition + mRequiredSpace > mBufferSize) // Recycle { if (mVertexBuffer) { void *dummy; mVertexBuffer->Lock(0, 1, &dummy, D3DLOCK_DISCARD); mVertexBuffer->Unlock(); } mWritePosition = 0; } mRequiredSpace = 0; }
RenderbufferStorage::RenderbufferStorage() { mSerial = issueSerial(); }