From ae67c026aa7ea65e75e18be7398cecc3276ba85c Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 31 Oct 2024 21:17:42 +0100 Subject: [PATCH] [d3d11] Implement image MAP_WRITE_DISCARD on immediate context --- src/d3d11/d3d11_context_imm.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/d3d11/d3d11_context_imm.cpp b/src/d3d11/d3d11_context_imm.cpp index 0231c4a02..1993a8fd2 100644 --- a/src/d3d11/d3d11_context_imm.cpp +++ b/src/d3d11/d3d11_context_imm.cpp @@ -446,16 +446,22 @@ namespace dxvk { uint64_t sequenceNumber = pResource->GetSequenceNumber(Subresource); auto formatInfo = lookupFormatInfo(packedFormat); + auto layout = pResource->GetSubresourceLayout(formatInfo->aspectMask, Subresource); if (mapMode == D3D11_COMMON_TEXTURE_MAP_MODE_DIRECT) { Rc mappedImage = pResource->GetImage(); - // Wait for the resource to become available. We do not - // support image renaming, so stall on DISCARD instead. - if (MapType == D3D11_MAP_WRITE_DISCARD) - MapFlags &= ~D3D11_MAP_FLAG_DO_NOT_WAIT; + if (MapType == D3D11_MAP_WRITE_DISCARD) { + EmitCs([ + cImage = std::move(mappedImage), + cStorage = pResource->DiscardStorage() + ] (DxvkContext* ctx) { + ctx->invalidateImage(cImage, Rc(cStorage)); + ctx->initImage(cImage, cImage->getAvailableSubresources(), VK_IMAGE_LAYOUT_PREINITIALIZED); + }); - if (MapType != D3D11_MAP_WRITE_NO_OVERWRITE) { + ThrottleDiscard(layout.Size); + } else if (MapType != D3D11_MAP_WRITE_NO_OVERWRITE) { if (!WaitForResource(*mappedImage, sequenceNumber, MapType, MapFlags)) return DXGI_ERROR_WAS_STILL_DRAWING; } @@ -563,7 +569,6 @@ namespace dxvk { pResource->SetMapType(Subresource, MapType); if (pMappedResource) { - auto layout = pResource->GetSubresourceLayout(formatInfo->aspectMask, Subresource); pMappedResource->pData = pResource->GetMapPtr(Subresource, layout.Offset); pMappedResource->RowPitch = layout.RowPitch; pMappedResource->DepthPitch = layout.DepthPitch;