- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 538
- Реакции
- 14
Здарова, кодеры. Столкнулся с классической проблемой при доработке вьюпорта в DX11 хуке. Суть в том, что при попытке смены разрешения или перехода в фулскрин, ResizeBuffers выплевывает ошибку о ненулевом референс-каунте.
Direct3D жалуется, что какие-то объекты не были освобождены перед ресайзом, из-за чего SwapChain просто отказывается обновляться. Обычно это происходит, когда RenderTargetView или сам бэк-буфер все еще висят в памяти.
Сам код хука:
Что было проверено:
Но беда в том, что оно всё равно не работает как надо в рантайме. Есть подозрение, что ImGui или какой-то внутренний стейт девайса держит ссылки на текстуры. Те, кто плотно сидит на DX11 — подскажите, может стоит еще вручную дергать ClearState или чекать другие хуки?
Думаю, стоит подрубить DirectX Debug Layer, чтобы точно увидеть, какой именно объект «застрял» в пайплайне.
Direct3D жалуется, что какие-то объекты не были освобождены перед ресайзом, из-за чего SwapChain просто отказывается обновляться. Обычно это происходит, когда RenderTargetView или сам бэк-буфер все еще висят в памяти.
Сам код хука:
Код:
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;
}
Что было проверено:
- RTV вроде как релизнуто и занулено перед вызовом оригинала.
- Бэк-буфер после создания RTV тоже освобождается.
- В контексте (PContext) таргеты сбрасываются.
Но беда в том, что оно всё равно не работает как надо в рантайме. Есть подозрение, что ImGui или какой-то внутренний стейт девайса держит ссылки на текстуры. Те, кто плотно сидит на DX11 — подскажите, может стоит еще вручную дергать ClearState или чекать другие хуки?
Думаю, стоит подрубить DirectX Debug Layer, чтобы точно увидеть, какой именно объект «застрял» в пайплайне.