diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index e78c125c..3f5a5fb6 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -427,7 +427,9 @@ namespace dxvk { return S_FALSE; try { - *ppUAView = ref(new D3D11UnorderedAccessView(this, pResource, &desc)); + auto uav = new D3D11UnorderedAccessView(this, pResource, &desc); + m_initializer->InitUavCounter(uav); + *ppUAView = ref(uav); return S_OK; } catch (const DxvkError& e) { Logger::err(e.message()); diff --git a/src/d3d11/d3d11_initializer.cpp b/src/d3d11/d3d11_initializer.cpp index 0aa298db..916165c9 100644 --- a/src/d3d11/d3d11_initializer.cpp +++ b/src/d3d11/d3d11_initializer.cpp @@ -47,6 +47,24 @@ namespace dxvk { } + void D3D11Initializer::InitUavCounter( + D3D11UnorderedAccessView* pUav) { + auto counterBuffer = pUav->GetCounterSlice(); + + if (!counterBuffer.defined()) + return; + + std::lock_guard lock(m_mutex); + + const uint32_t zero = 0; + m_context->updateBuffer( + counterBuffer.buffer(), + 0, sizeof(zero), &zero); + + FlushImplicit(); + } + + void D3D11Initializer::InitDeviceLocalBuffer( D3D11Buffer* pBuffer, const D3D11_SUBRESOURCE_DATA* pInitialData) { diff --git a/src/d3d11/d3d11_initializer.h b/src/d3d11/d3d11_initializer.h index 96a094d6..de6e6099 100644 --- a/src/d3d11/d3d11_initializer.h +++ b/src/d3d11/d3d11_initializer.h @@ -34,6 +34,9 @@ namespace dxvk { void InitTexture( D3D11CommonTexture* pTexture, const D3D11_SUBRESOURCE_DATA* pInitialData); + + void InitUavCounter( + D3D11UnorderedAccessView* pUav); private: