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:
parent
ff9d6e3226
commit
b04721f9a2
@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user