diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index f11ae4004..2b340c74c 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -481,6 +481,14 @@ namespace dxvk { return hr; } + // Unbind all buffers that were still bound to the backend to avoid leaks. + EmitCs([](DxvkContext* ctx) { + ctx->bindIndexBuffer(DxvkBufferSlice(), VK_INDEX_TYPE_UINT32); + for (uint32_t i = 0; i < DxvkLimits::MaxNumVertexBindings; i++) { + ctx->bindVertexBuffer(i, DxvkBufferSlice(), 0); + } + }); + Flush(); SynchronizeCsThread(DxvkCsThread::SynchronizeAll); @@ -1603,6 +1611,16 @@ namespace dxvk { m_flags.clr(D3D9DeviceFlag::InScene); + // D3D9 resets the internally bound vertex buffers and index buffer in EndScene. + // We have to ignore unbinding those buffers because of Operation Flashpoint Red River, + // so we should also clear the bindings here, to avoid leaks. + EmitCs([](DxvkContext* ctx) { + ctx->bindIndexBuffer(DxvkBufferSlice(), VK_INDEX_TYPE_UINT32); + for (uint32_t i = 0; i < DxvkLimits::MaxNumVertexBindings; i++) { + ctx->bindVertexBuffer(i, DxvkBufferSlice(), 0); + } + }); + return D3D_OK; }