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

[dxvk] Remove initial image layout parameter

This is now always going to be UNDEFINED.
This commit is contained in:
Philip Rebohle 2024-10-30 23:51:15 +01:00
parent dda4ef3be1
commit 4724dfff86
11 changed files with 74 additions and 101 deletions

View File

@ -205,9 +205,7 @@ namespace dxvk {
EmitCs([ EmitCs([
cImage = std::move(image) cImage = std::move(image)
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
ctx->initImage(cImage, ctx->initImage(cImage, cImage->getAvailableSubresources());
cImage->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED);
}); });
} }

View File

@ -653,11 +653,8 @@ namespace dxvk {
m_parent->GetContext()->InjectCs([ m_parent->GetContext()->InjectCs([
cImages = std::move(images) cImages = std::move(images)
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
for (size_t i = 0; i < cImages.size(); i++) { for (size_t i = 0; i < cImages.size(); i++)
ctx->initImage(cImages[i], ctx->initImage(cImages[i], cImages[i]->getAvailableSubresources());
cImages[i]->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED);
}
}); });
} }

View File

@ -41,7 +41,6 @@ namespace dxvk {
| VK_ACCESS_TRANSFER_WRITE_BIT; | VK_ACCESS_TRANSFER_WRITE_BIT;
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL; imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL;
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
imageInfo.shared = vkImage != VK_NULL_HANDLE; imageInfo.shared = vkImage != VK_NULL_HANDLE;
// Normalise hSharedhandle to INVALID_HANDLE_VALUE to allow passing in nullptr // Normalise hSharedhandle to INVALID_HANDLE_VALUE to allow passing in nullptr

View File

@ -101,9 +101,7 @@ namespace dxvk {
EmitCs([ EmitCs([
cImage = std::move(image) cImage = std::move(image)
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
ctx->initImage(cImage, ctx->initImage(cImage, cImage->getAvailableSubresources());
cImage->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED);
}); });
ThrottleAllocationLocked(); ThrottleAllocationLocked();

View File

@ -1120,11 +1120,8 @@ namespace dxvk {
m_parent->InjectCs([ m_parent->InjectCs([
cImages = std::move(images) cImages = std::move(images)
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
for (size_t i = 0; i < cImages.size(); i++) { for (size_t i = 0; i < cImages.size(); i++)
ctx->initImage(cImages[i], ctx->initImage(cImages[i], cImages[i]->getAvailableSubresources());
cImages[i]->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED);
}
}); });
return D3D_OK; return D3D_OK;

View File

@ -995,97 +995,88 @@ namespace dxvk {
void DxvkContext::initImage( void DxvkContext::initImage(
const Rc<DxvkImage>& image, const Rc<DxvkImage>& image,
const VkImageSubresourceRange& subresources, const VkImageSubresourceRange& subresources) {
VkImageLayout initialLayout) { VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
if (initialLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
accessImage(DxvkCmdBuffer::InitBuffer,
*image, subresources, initialLayout,
VK_PIPELINE_STAGE_2_NONE, 0);
m_cmd->track(image, DxvkAccess::None); addImageInitTransition(*image, subresources, clearLayout,
} else { VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); flushImageLayoutTransitions(DxvkCmdBuffer::InitBuffer);
addImageInitTransition(*image, subresources, clearLayout, auto formatInfo = image->formatInfo();
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
flushImageLayoutTransitions(DxvkCmdBuffer::InitBuffer);
auto formatInfo = image->formatInfo(); if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) {
for (auto aspects = formatInfo->aspectMask; aspects; ) {
auto aspect = vk::getNextAspect(aspects);
auto extent = image->mipLevelExtent(subresources.baseMipLevel);
auto elementSize = formatInfo->elementSize;
if (formatInfo->flags.any(DxvkFormatFlag::BlockCompressed, DxvkFormatFlag::MultiPlane)) { if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) {
for (auto aspects = formatInfo->aspectMask; aspects; ) { auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)];
auto aspect = vk::getNextAspect(aspects); extent.width /= plane->blockSize.width;
auto extent = image->mipLevelExtent(subresources.baseMipLevel); extent.height /= plane->blockSize.height;
auto elementSize = formatInfo->elementSize; elementSize = plane->elementSize;
}
// Allocate enough staging buffer memory to fit one
// single subresource, then dispatch multiple copies
VkExtent3D blockCount = util::computeBlockCount(extent, formatInfo->blockSize);
VkDeviceSize dataSize = util::flattenImageExtent(blockCount) * elementSize;
auto zeroBuffer = createZeroBuffer(dataSize);
auto zeroHandle = zeroBuffer->getSliceHandle();
for (uint32_t level = 0; level < subresources.levelCount; level++) {
VkOffset3D offset = VkOffset3D { 0, 0, 0 };
VkExtent3D extent = image->mipLevelExtent(subresources.baseMipLevel + level);
if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) { if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) {
auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)]; auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)];
extent.width /= plane->blockSize.width; extent.width /= plane->blockSize.width;
extent.height /= plane->blockSize.height; extent.height /= plane->blockSize.height;
elementSize = plane->elementSize;
} }
// Allocate enough staging buffer memory to fit one for (uint32_t layer = 0; layer < subresources.layerCount; layer++) {
// single subresource, then dispatch multiple copies VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
VkExtent3D blockCount = util::computeBlockCount(extent, formatInfo->blockSize); copyRegion.bufferOffset = zeroHandle.offset;
VkDeviceSize dataSize = util::flattenImageExtent(blockCount) * elementSize; copyRegion.imageSubresource = vk::makeSubresourceLayers(
vk::pickSubresource(subresources, level, layer));
copyRegion.imageSubresource.aspectMask = aspect;
copyRegion.imageOffset = offset;
copyRegion.imageExtent = extent;
auto zeroBuffer = createZeroBuffer(dataSize); VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
auto zeroHandle = zeroBuffer->getSliceHandle(); copyInfo.srcBuffer = zeroHandle.handle;
copyInfo.dstImage = image->handle();
copyInfo.dstImageLayout = clearLayout;
copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion;
for (uint32_t level = 0; level < subresources.levelCount; level++) { m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, &copyInfo);
VkOffset3D offset = VkOffset3D { 0, 0, 0 };
VkExtent3D extent = image->mipLevelExtent(subresources.baseMipLevel + level);
if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) {
auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)];
extent.width /= plane->blockSize.width;
extent.height /= plane->blockSize.height;
}
for (uint32_t layer = 0; layer < subresources.layerCount; layer++) {
VkBufferImageCopy2 copyRegion = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
copyRegion.bufferOffset = zeroHandle.offset;
copyRegion.imageSubresource = vk::makeSubresourceLayers(
vk::pickSubresource(subresources, level, layer));
copyRegion.imageSubresource.aspectMask = aspect;
copyRegion.imageOffset = offset;
copyRegion.imageExtent = extent;
VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
copyInfo.srcBuffer = zeroHandle.handle;
copyInfo.dstImage = image->handle();
copyInfo.dstImageLayout = clearLayout;
copyInfo.regionCount = 1;
copyInfo.pRegions = &copyRegion;
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, &copyInfo);
}
} }
m_cmd->track(zeroBuffer, DxvkAccess::Read);
} }
} else {
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
VkClearDepthStencilValue value = { };
m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer, m_cmd->track(zeroBuffer, DxvkAccess::Read);
image->handle(), clearLayout, &value, 1, &subresources);
} else {
VkClearColorValue value = { };
m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer,
image->handle(), clearLayout, &value, 1, &subresources);
}
} }
} else {
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
VkClearDepthStencilValue value = { };
accessImage(DxvkCmdBuffer::InitBuffer, m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer,
*image, subresources, clearLayout, image->handle(), clearLayout, &value, 1, &subresources);
VK_PIPELINE_STAGE_2_TRANSFER_BIT, } else {
VK_ACCESS_2_TRANSFER_WRITE_BIT); VkClearColorValue value = { };
m_cmd->track(image, DxvkAccess::Write); m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer,
image->handle(), clearLayout, &value, 1, &subresources);
}
} }
accessImage(DxvkCmdBuffer::InitBuffer,
*image, subresources, clearLayout,
VK_PIPELINE_STAGE_2_TRANSFER_BIT,
VK_ACCESS_2_TRANSFER_WRITE_BIT);
m_cmd->track(image, DxvkAccess::Write);
} }
@ -6761,7 +6752,7 @@ namespace dxvk {
if (srcLayout == dstLayout && srcStages == dstStages) if (srcLayout == dstLayout && srcStages == dstStages)
return; return;
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED)
image.trackInitialization(subresources); image.trackInitialization(subresources);
auto& barrier = m_imageLayoutTransitions.emplace_back(); auto& barrier = m_imageLayoutTransitions.emplace_back();
@ -6865,7 +6856,7 @@ namespace dxvk {
VkAccessFlags2 dstAccess) { VkAccessFlags2 dstAccess) {
auto& batch = getBarrierBatch(cmdBuffer); auto& batch = getBarrierBatch(cmdBuffer);
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED)
image.trackInitialization(subresources); image.trackInitialization(subresources);
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 }; VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };

View File

@ -898,12 +898,10 @@ namespace dxvk {
* Only safe to call if the image is not in use by the GPU. * Only safe to call if the image is not in use by the GPU.
* \param [in] image The image to initialize * \param [in] image The image to initialize
* \param [in] subresources Image subresources * \param [in] subresources Image subresources
* \param [in] initialLayout Initial image layout
*/ */
void initImage( void initImage(
const Rc<DxvkImage>& image, const Rc<DxvkImage>& image,
const VkImageSubresourceRange& subresources, const VkImageSubresourceRange& subresources);
VkImageLayout initialLayout);
/** /**
* \brief Initializes sparse image * \brief Initializes sparse image

View File

@ -296,7 +296,7 @@ namespace dxvk {
info.tiling = m_info.tiling; info.tiling = m_info.tiling;
info.usage = m_info.usage | usageInfo.usage; info.usage = m_info.usage | usageInfo.usage;
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
info.initialLayout = m_info.initialLayout; info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
return info; return info;
} }

View File

@ -52,9 +52,6 @@ namespace dxvk {
/// Common image layout /// Common image layout
VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;
// Initial image layout
VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
// Image is used by multiple contexts so it needs // Image is used by multiple contexts so it needs
// to be in its default layout after each submission // to be in its default layout after each submission
VkBool32 shared = VK_FALSE; VkBool32 shared = VK_FALSE;
@ -585,8 +582,8 @@ namespace dxvk {
/** /**
* \brief Tracks subresource initialization * \brief Tracks subresource initialization
* *
* Initialization happens when transitioning the image * Initialization happens when transitioning
* away from \c PREINITIALIZED or \c UNDEFINED layouts. * the image away from \c UNDEFINED layouts.
* \param [in] subresources Subresource range * \param [in] subresources Subresource range
*/ */
void trackInitialization( void trackInitialization(

View File

@ -366,7 +366,6 @@ namespace dxvk {
imageInfo.access = VK_ACCESS_2_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT; imageInfo.access = VK_ACCESS_2_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT;
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
imageInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; imageInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
m_gammaImage = m_device->createImage(imageInfo, m_gammaImage = m_device->createImage(imageInfo,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);

View File

@ -347,7 +347,6 @@ namespace dxvk::hud {
| VK_ACCESS_SHADER_READ_BIT; | VK_ACCESS_SHADER_READ_BIT;
fontTextureInfo.tiling = VK_IMAGE_TILING_OPTIMAL; fontTextureInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
fontTextureInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; fontTextureInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
fontTextureInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
m_fontTexture = m_device->createImage(fontTextureInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); m_fontTexture = m_device->createImage(fontTextureInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);