1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[d3d11] Use staging buffer for MapImage on deferred contexts

This commit is contained in:
Philip Rebohle 2021-05-27 20:24:36 +02:00
parent ff9d6e3226
commit b04721f9a2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -333,58 +333,44 @@ namespace dxvk {
formatInfo->aspectMask, Subresource); formatInfo->aspectMask, Subresource);
VkExtent3D levelExtent = image->mipLevelExtent(subresource.mipLevel); VkExtent3D levelExtent = image->mipLevelExtent(subresource.mipLevel);
VkExtent3D blockCount = util::computeBlockCount(
levelExtent, formatInfo->blockSize);
VkDeviceSize eSize = formatInfo->elementSize; auto layout = pTexture->GetSubresourceLayout(formatInfo->aspectMask, Subresource);
VkDeviceSize xSize = blockCount.width * eSize; auto dataSlice = AllocStagingBuffer(util::computeImageDataSize(packedFormat, levelExtent));
VkDeviceSize ySize = blockCount.height * xSize;
VkDeviceSize zSize = blockCount.depth * ySize;
auto dataSlice = AllocUpdateBufferSlice(zSize);
pMapEntry->pResource = pResource; pMapEntry->pResource = pResource;
pMapEntry->Subresource = Subresource; pMapEntry->Subresource = Subresource;
pMapEntry->MapType = D3D11_MAP_WRITE_DISCARD; pMapEntry->MapType = D3D11_MAP_WRITE_DISCARD;
pMapEntry->RowPitch = xSize; pMapEntry->RowPitch = layout.RowPitch;
pMapEntry->DepthPitch = ySize; pMapEntry->DepthPitch = layout.DepthPitch;
pMapEntry->MapPointer = dataSlice.ptr(); pMapEntry->MapPointer = dataSlice.mapPtr(0);
EmitCs([ EmitCs([
cImage = pTexture->GetImage(), cDstImage = pTexture->GetImage(),
cSubresource = pTexture->GetSubresourceFromIndex( cSubresource = pTexture->GetSubresourceFromIndex(formatInfo->aspectMask, Subresource),
VK_IMAGE_ASPECT_COLOR_BIT, Subresource), cStagingSlice = std::move(dataSlice),
cDataSlice = dataSlice,
cDataPitchPerRow = pMapEntry->RowPitch,
cDataPitchPerLayer = pMapEntry->DepthPitch,
cPackedFormat = GetPackedDepthStencilFormat(pTexture->Desc()->Format) cPackedFormat = GetPackedDepthStencilFormat(pTexture->Desc()->Format)
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
VkImageSubresourceLayers srLayers; VkImageSubresourceLayers dstLayers;
srLayers.aspectMask = cSubresource.aspectMask; dstLayers.aspectMask = cSubresource.aspectMask;
srLayers.mipLevel = cSubresource.mipLevel; dstLayers.mipLevel = cSubresource.mipLevel;
srLayers.baseArrayLayer = cSubresource.arrayLayer; dstLayers.baseArrayLayer = cSubresource.arrayLayer;
srLayers.layerCount = 1; dstLayers.layerCount = 1;
VkOffset3D mipLevelOffset = { 0, 0, 0 }; VkOffset3D dstOffset = { 0, 0, 0 };
VkExtent3D mipLevelExtent = cImage->mipLevelExtent(srLayers.mipLevel); VkExtent3D dstExtent = cDstImage->mipLevelExtent(dstLayers.mipLevel);
if (cPackedFormat == VK_FORMAT_UNDEFINED) { if (cPackedFormat == VK_FORMAT_UNDEFINED) {
ctx->updateImage( ctx->copyBufferToImage(cDstImage,
cImage, srLayers, dstLayers, dstOffset, dstExtent,
mipLevelOffset, cStagingSlice.buffer(),
mipLevelExtent, cStagingSlice.offset(), 0);
cDataSlice.ptr(),
cDataPitchPerRow,
cDataPitchPerLayer);
} else { } else {
ctx->updateDepthStencilImage( ctx->copyPackedBufferToDepthStencilImage(
cImage, srLayers, cDstImage, dstLayers,
VkOffset2D { mipLevelOffset.x, mipLevelOffset.y }, VkOffset2D { dstOffset.x, dstOffset.y },
VkExtent2D { mipLevelExtent.width, mipLevelExtent.height }, VkExtent2D { dstExtent.width, dstExtent.height },
cDataSlice.ptr(), cStagingSlice.buffer(),
cDataPitchPerRow, cStagingSlice.offset(), cPackedFormat);
cDataPitchPerLayer,
cPackedFormat);
} }
}); });