gl::Error Buffer11::NativeStorage::resize(size_t size, bool preserveData) { ID3D11Device *device = mRenderer->getDevice(); ID3D11DeviceContext *context = mRenderer->getDeviceContext(); D3D11_BUFFER_DESC bufferDesc; fillBufferDesc(&bufferDesc, mRenderer, mUsage, size); ID3D11Buffer *newBuffer; HRESULT result = device->CreateBuffer(&bufferDesc, NULL, &newBuffer); if (FAILED(result)) { return gl::Error(GL_OUT_OF_MEMORY, "Failed to create internal buffer, result: 0x%X.", result); } if (mNativeStorage && preserveData) { // We don't call resize if the buffer is big enough already. ASSERT(mBufferSize <= size); D3D11_BOX srcBox; srcBox.left = 0; srcBox.right = mBufferSize; srcBox.top = 0; srcBox.bottom = 1; srcBox.front = 0; srcBox.back = 1; context->CopySubresourceRegion(newBuffer, 0, 0, 0, 0, mNativeStorage, 0, &srcBox); } // No longer need the old buffer SafeRelease(mNativeStorage); mNativeStorage = newBuffer; mBufferSize = bufferDesc.ByteWidth; return gl::Error(GL_NO_ERROR); }
bool BufferStorage11::NativeBuffer11::resize(size_t size, bool preserveData) { ID3D11Device *device = mRenderer->getDevice(); ID3D11DeviceContext *context = mRenderer->getDeviceContext(); D3D11_BUFFER_DESC bufferDesc; fillBufferDesc(&bufferDesc, mRenderer, mUsage, size); ID3D11Buffer *newBuffer; HRESULT result = device->CreateBuffer(&bufferDesc, NULL, &newBuffer); if (FAILED(result)) { return gl::error(GL_OUT_OF_MEMORY, false); } if (mNativeBuffer && preserveData) { D3D11_BOX srcBox; srcBox.left = 0; srcBox.right = size; srcBox.top = 0; srcBox.bottom = 1; srcBox.front = 0; srcBox.back = 1; context->CopySubresourceRegion(newBuffer, 0, 0, 0, 0, mNativeBuffer, 0, &srcBox); } // No longer need the old buffer SafeRelease(mNativeBuffer); mNativeBuffer = newBuffer; mBufferSize = bufferDesc.ByteWidth; return true; }