Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос DX11 ImGui Hook — Ошибка ResizeBuffers (Non-zero reference count)

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
538
Реакции
14
Здарова, кодеры. Столкнулся с классической проблемой при доработке вьюпорта в DX11 хуке. Суть в том, что при попытке смены разрешения или перехода в фулскрин, ResizeBuffers выплевывает ошибку о ненулевом референс-каунте.

Direct3D жалуется, что какие-то объекты не были освобождены перед ресайзом, из-за чего SwapChain просто отказывается обновляться. Обычно это происходит, когда RenderTargetView или сам бэк-буфер все еще висят в памяти.

Сам код хука:
Код:
Expand Collapse Copy
HRESULT WINAPI hkResize(IDXGISwapChain* This, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags)
 {
    if (mainRenderTargetView) {
        mainRenderTargetView->Release();
        mainRenderTargetView = nullptr;
    }

    HRESULT hr = oResize(This, BufferCount, Width, Height, NewFormat, SwapChainFlags);
    ID3D11Texture2D* pBackBuffer = nullptr;

    hr = This->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
    hr = pDevice->CreateRenderTargetView(pBackBuffer, nullptr, &mainRenderTargetView);
    pBackBuffer->Release();

    PContext->OMSetRenderTargets(1, &mainRenderTargetView, NULL);

    D3D11_VIEWPORT viewport = {};
    viewport.Width = static_cast<FLOAT>(Width);
    viewport.Height = static_cast<FLOAT>(Height);
    viewport.MinDepth = 0.0f;
    viewport.MaxDepth = 1.0f;
    viewport.TopLeftX = 0.0f;
    viewport.TopLeftY = 0.0f;
    PContext->RSSetViewports(1, &viewport);
    return hr;
}

Что было проверено:
  1. RTV вроде как релизнуто и занулено перед вызовом оригинала.
  2. Бэк-буфер после создания RTV тоже освобождается.
  3. В контексте (PContext) таргеты сбрасываются.

Но беда в том, что оно всё равно не работает как надо в рантайме. Есть подозрение, что ImGui или какой-то внутренний стейт девайса держит ссылки на текстуры. Те, кто плотно сидит на DX11 — подскажите, может стоит еще вручную дергать ClearState или чекать другие хуки?

Думаю, стоит подрубить DirectX Debug Layer, чтобы точно увидеть, какой именно объект «застрял» в пайплайне.
 
Назад
Сверху Снизу