1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-18 02:52:10 +01:00

[d3d11] Use UpdateImage in D3D11DeferredContext::MapImage

This commit is contained in:
Philip Rebohle 2021-06-24 03:27:42 +02:00
parent fd66f44561
commit 450c42444f
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -314,8 +314,7 @@ namespace dxvk {
D3D11_MAP MapType,
UINT MapFlags,
D3D11DeferredContextMapEntry* pMapEntry) {
const D3D11CommonTexture* pTexture = GetCommonTexture(pResource);
const Rc<DxvkImage> image = pTexture->GetImage();
D3D11CommonTexture* pTexture = GetCommonTexture(pResource);
if (unlikely(pTexture->GetMapMode() == D3D11_COMMON_TEXTURE_MAP_MODE_NONE)) {
Logger::err("D3D11: Cannot map a device-local image");
@ -325,14 +324,13 @@ namespace dxvk {
if (unlikely(Subresource >= pTexture->CountSubresources()))
return E_INVALIDARG;
VkFormat packedFormat = m_parent->LookupPackedFormat(
pTexture->Desc()->Format, pTexture->GetFormatMode()).Format;
VkFormat packedFormat = pTexture->GetPackedFormat();
auto formatInfo = imageFormatInfo(packedFormat);
auto subresource = pTexture->GetSubresourceFromIndex(
formatInfo->aspectMask, Subresource);
VkExtent3D levelExtent = image->mipLevelExtent(subresource.mipLevel);
VkExtent3D levelExtent = pTexture->MipLevelExtent(subresource.mipLevel);
auto layout = pTexture->GetSubresourceLayout(formatInfo->aspectMask, Subresource);
auto dataSlice = AllocStagingBuffer(util::computeImageDataSize(packedFormat, levelExtent));
@ -344,39 +342,9 @@ namespace dxvk {
pMapEntry->DepthPitch = layout.DepthPitch;
pMapEntry->MapPointer = dataSlice.mapPtr(0);
EmitCs([
cDstImage = pTexture->GetImage(),
cSubresource = pTexture->GetSubresourceFromIndex(formatInfo->aspectMask, Subresource),
cStagingSlice = std::move(dataSlice),
cPackedFormat = GetPackedDepthStencilFormat(pTexture->Desc()->Format)
] (DxvkContext* ctx) {
VkImageSubresourceLayers dstLayers;
dstLayers.aspectMask = cSubresource.aspectMask;
dstLayers.mipLevel = cSubresource.mipLevel;
dstLayers.baseArrayLayer = cSubresource.arrayLayer;
dstLayers.layerCount = 1;
VkOffset3D dstOffset = { 0, 0, 0 };
VkExtent3D dstExtent = cDstImage->mipLevelExtent(dstLayers.mipLevel);
if (cPackedFormat == VK_FORMAT_UNDEFINED) {
ctx->copyBufferToImage(cDstImage,
dstLayers, dstOffset, dstExtent,
cStagingSlice.buffer(),
cStagingSlice.offset(), 0, 0);
} else {
ctx->copyPackedBufferToDepthStencilImage(
cDstImage, dstLayers,
VkOffset2D { dstOffset.x, dstOffset.y },
VkExtent2D { dstExtent.width, dstExtent.height },
cStagingSlice.buffer(),
cStagingSlice.offset(),
VkOffset2D { dstOffset.x, dstOffset.y },
VkExtent2D { dstExtent.width, dstExtent.height },
cPackedFormat);
}
});
UpdateImage(pTexture, &subresource,
VkOffset3D { 0, 0, 0 }, levelExtent,
std::move(dataSlice));
return S_OK;
}