diff --git a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx index e39e246841..f14cf1788d 100644 --- a/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx +++ b/panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx @@ -496,6 +496,7 @@ prepare_vertex_buffer(GeomVertexArrayData *data) { } #endif + dvbc->update_data_size_bytes(num_bytes); return dvbc; } else { dxgsg9_cat.error() @@ -533,14 +534,42 @@ apply_vertex_buffer(VertexBufferContext *vbc, return false; } - PStatTimer timer(_load_vertex_buffer_pcollector, reader->get_current_thread()); - #if 0 if (dvbc->changed_size(reader)) { - // We have to destroy the old vertex buffer and create a new one. - dvbc->create_vbuffer(*_screen, reader); + // Destroy and recreate the buffer. + if (dvbc->_vbuffer != nullptr) { + dvbc->_vbuffer->Release(); + dvbc->_vbuffer = nullptr; + } + + DWORD usage; + D3DPOOL pool; + if (_screen->_managed_vertex_buffers) { + pool = D3DPOOL_MANAGED; + usage = D3DUSAGE_WRITEONLY; + } else { + pool = D3DPOOL_DEFAULT; + usage = D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC; + } + + PStatTimer timer(_create_vertex_buffer_pcollector, Thread::get_current_thread()); + + HRESULT hr; + int attempts = 0; + do { + hr = _screen->_d3d_device->CreateVertexBuffer(num_bytes, usage, dvbc->_fvf, pool, &dvbc->_vbuffer, nullptr); + attempts++; + } while (check_dx_allocation(hr, num_bytes, attempts)); + + if (FAILED(hr)) { + dvbc->_vbuffer = nullptr; + dxgsg9_cat.error() + << "CreateVertexBuffer failed" << D3DERRORSTRING(hr); + return false; + } } - #endif + + PStatTimer timer(_load_vertex_buffer_pcollector, reader->get_current_thread()); HRESULT hr; BYTE *local_pointer;