1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 19:54:19 +01:00

[d3d9] Align pitch to 4

This commit is contained in:
Robin Kertels 2021-04-08 19:49:33 +02:00 committed by Joshie
parent 2ba433bbd8
commit 0bc8b0b33a
2 changed files with 29 additions and 11 deletions

View File

@ -201,8 +201,7 @@ namespace dxvk {
const uint32_t planeCount = m_mapping.ConversionFormatInfo.PlaneCount;
return std::min(planeCount, 2u)
* formatInfo.elementSize
* blockCount.width
* align(formatInfo.elementSize * blockCount.width, 4)
* blockCount.height
* blockCount.depth;
}

View File

@ -689,10 +689,12 @@ namespace dxvk {
+ srcBlockOffset.y * texLevelBlockCount.width
+ srcBlockOffset.x)
* formatInfo->elementSize;
VkDeviceSize pitch = align(texLevelBlockCount.width * formatInfo->elementSize, 4);
void* srcData = reinterpret_cast<uint8_t*>(srcSlice.mapPtr) + copySrcOffset;
util::packImageData(
slice.mapPtr, srcData, copyBlockCount, formatInfo->elementSize,
texLevelBlockCount.width * formatInfo->elementSize, texLevelBlockCount.width * texLevelBlockCount.height * formatInfo->elementSize);
pitch, pitch * texLevelBlockCount.height);
Rc<DxvkImage> dstImage = dstTextureInfo->GetImage();
VkDeviceSize srcByteOffset = srcBlockOffset.y * formatInfo->elementSize * texLevelBlockCount.width
@ -781,10 +783,12 @@ namespace dxvk {
+ boxOffsetBlockCount.y * texLevelExtentBlockCount.width
+ boxOffsetBlockCount.x)
* formatInfo->elementSize;
VkDeviceSize pitch = align(texLevelExtentBlockCount.width * formatInfo->elementSize, 4);
void* srcData = reinterpret_cast<uint8_t*>(srcTexInfo->GetMappedSlice(srcTexInfo->CalcSubresource(a, m)).mapPtr) + copySrcOffset;
util::packImageData(
slice.mapPtr, srcData, scaledBoxExtentBlockCount, formatInfo->elementSize,
texLevelExtentBlockCount.width * formatInfo->elementSize, texLevelExtentBlockCount.width * texLevelExtentBlockCount.height * formatInfo->elementSize);
pitch, pitch * texLevelExtentBlockCount.height);
scaledAlignedBoxExtent.width = std::min<uint32_t>(texLevelExtent.width, scaledAlignedBoxExtent.width);
scaledAlignedBoxExtent.height = std::min<uint32_t>(texLevelExtent.height, scaledAlignedBoxExtent.height);
@ -854,14 +858,21 @@ namespace dxvk {
VkExtent3D srcExtent = srcTexInfo->GetExtentMip(src->GetMipLevel());
VkExtent3D texLevelExtentBlockCount = util::computeBlockCount(srcExtent, srcFormatInfo->blockSize);
VkDeviceSize pitch = align(texLevelExtentBlockCount.width * uint32_t(srcFormatInfo->elementSize), 4);
uint32_t pitchBlocks = uint32_t(pitch / srcFormatInfo->elementSize);
VkExtent2D dstExtent = VkExtent2D{ pitchBlocks,
texLevelExtentBlockCount.height * pitchBlocks };
EmitCs([
cBuffer = dstBuffer,
cImage = srcImage,
cSubresources = srcSubresourceLayers,
cLevelExtent = srcExtent
cLevelExtent = srcExtent,
cDstExtent = dstExtent
] (DxvkContext* ctx) {
ctx->copyImageToBuffer(
cBuffer, 0, VkExtent2D { 0u, 0u },
cBuffer, 0, cDstExtent,
cImage, cSubresources, VkOffset3D { 0, 0, 0 },
cLevelExtent);
});
@ -4172,13 +4183,13 @@ namespace dxvk {
if (atiHack) {
// We need to lie here. The game is expected to use this info and do a workaround.
// It's stupid. I know.
pLockedBox->RowPitch = std::max(desc.Width >> MipLevel, 1u);
pLockedBox->RowPitch = align(std::max(desc.Width >> MipLevel, 1u), 4);
pLockedBox->SlicePitch = pLockedBox->RowPitch * std::max(desc.Height >> MipLevel, 1u);
}
else {
// Data is tightly packed within the mapped buffer.
pLockedBox->RowPitch = formatInfo->elementSize * blockCount.width;
pLockedBox->SlicePitch = formatInfo->elementSize * blockCount.width * blockCount.height;
pLockedBox->RowPitch = align(formatInfo->elementSize * blockCount.width, 4);
pLockedBox->SlicePitch = pLockedBox->RowPitch * blockCount.height;
}
pResource->SetLocked(Subresource, true);
@ -4321,10 +4332,12 @@ namespace dxvk {
+ boxOffsetBlockCount.y * texLevelExtentBlockCount.width
+ boxOffsetBlockCount.x)
* formatInfo->elementSize;
VkDeviceSize pitch = align(texLevelExtentBlockCount.width * formatInfo->elementSize, 4);
void* srcData = reinterpret_cast<uint8_t*>(srcSlice.mapPtr) + copySrcOffset;
util::packImageData(
slice.mapPtr, srcData, scaledBoxExtentBlockCount, formatInfo->elementSize,
texLevelExtentBlockCount.width * formatInfo->elementSize, texLevelExtentBlockCount.width * texLevelExtentBlockCount.height * formatInfo->elementSize);
pitch, pitch * texLevelExtentBlockCount.height);
EmitCs([
cSrcSlice = slice.slice,
@ -4341,8 +4354,14 @@ namespace dxvk {
});
}
else {
VkExtent3D texLevelExtent = image->mipLevelExtent(Subresource);
VkExtent3D texLevelExtentBlockCount = util::computeBlockCount(texLevelExtent, formatInfo->blockSize);
D3D9BufferSlice slice = AllocTempBuffer<false>(srcSlice.length);
memcpy(slice.mapPtr, srcSlice.mapPtr, srcSlice.length);
VkDeviceSize pitch = align(texLevelExtentBlockCount.width * formatInfo->elementSize, 4);
util::packImageData(
slice.mapPtr, srcSlice.mapPtr, texLevelExtent, formatInfo->elementSize,
pitch, pitch * texLevelExtentBlockCount.height);
Flush();
SynchronizeCsThread();