[d3d9] Only unbind in EndScene if the game cleared the binding

This commit is contained in:
Robin Kertels 2024-03-06 22:17:02 +01:00
parent 85215b10d6
commit 72c86b8229
1 changed files with 13 additions and 6 deletions

View File

@ -1616,15 +1616,22 @@ namespace dxvk {
m_flags.clr(D3D9DeviceFlag::InScene);
// D3D9 resets the internally bound vertex buffers and index buffer in EndScene.
// D3D9 resets the internally bound vertex buffers and index buffer in EndScene if they were unbound in the meantime.
// 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);
if (m_state.indices == nullptr) {
EmitCs([](DxvkContext* ctx) {
ctx->bindIndexBuffer(DxvkBufferSlice(), VK_INDEX_TYPE_UINT32);
});
}
for (uint32_t i = 0; i < DxvkLimits::MaxNumVertexBindings; i++) {
if (m_state.vertexBuffers[i].vertexBuffer == nullptr) {
EmitCs([cIndex = i](DxvkContext* ctx) {
ctx->bindVertexBuffer(cIndex, DxvkBufferSlice(), 0);
});
}
});
}
return D3D_OK;
}