mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 10:54:16 +01:00
[dxvk] Remove initial image layout parameter
This is now always going to be UNDEFINED.
This commit is contained in:
parent
dda4ef3be1
commit
4724dfff86
@ -205,9 +205,7 @@ namespace dxvk {
|
||||
EmitCs([
|
||||
cImage = std::move(image)
|
||||
] (DxvkContext* ctx) {
|
||||
ctx->initImage(cImage,
|
||||
cImage->getAvailableSubresources(),
|
||||
VK_IMAGE_LAYOUT_UNDEFINED);
|
||||
ctx->initImage(cImage, cImage->getAvailableSubresources());
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -653,11 +653,8 @@ namespace dxvk {
|
||||
m_parent->GetContext()->InjectCs([
|
||||
cImages = std::move(images)
|
||||
] (DxvkContext* ctx) {
|
||||
for (size_t i = 0; i < cImages.size(); i++) {
|
||||
ctx->initImage(cImages[i],
|
||||
cImages[i]->getAvailableSubresources(),
|
||||
VK_IMAGE_LAYOUT_UNDEFINED);
|
||||
}
|
||||
for (size_t i = 0; i < cImages.size(); i++)
|
||||
ctx->initImage(cImages[i], cImages[i]->getAvailableSubresources());
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,6 @@ namespace dxvk {
|
||||
| VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||
imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
imageInfo.shared = vkImage != VK_NULL_HANDLE;
|
||||
|
||||
// Normalise hSharedhandle to INVALID_HANDLE_VALUE to allow passing in nullptr
|
||||
|
@ -101,9 +101,7 @@ namespace dxvk {
|
||||
EmitCs([
|
||||
cImage = std::move(image)
|
||||
] (DxvkContext* ctx) {
|
||||
ctx->initImage(cImage,
|
||||
cImage->getAvailableSubresources(),
|
||||
VK_IMAGE_LAYOUT_UNDEFINED);
|
||||
ctx->initImage(cImage, cImage->getAvailableSubresources());
|
||||
});
|
||||
|
||||
ThrottleAllocationLocked();
|
||||
|
@ -1120,11 +1120,8 @@ namespace dxvk {
|
||||
m_parent->InjectCs([
|
||||
cImages = std::move(images)
|
||||
] (DxvkContext* ctx) {
|
||||
for (size_t i = 0; i < cImages.size(); i++) {
|
||||
ctx->initImage(cImages[i],
|
||||
cImages[i]->getAvailableSubresources(),
|
||||
VK_IMAGE_LAYOUT_UNDEFINED);
|
||||
}
|
||||
for (size_t i = 0; i < cImages.size(); i++)
|
||||
ctx->initImage(cImages[i], cImages[i]->getAvailableSubresources());
|
||||
});
|
||||
|
||||
return D3D_OK;
|
||||
|
@ -995,97 +995,88 @@ namespace dxvk {
|
||||
|
||||
void DxvkContext::initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const VkImageSubresourceRange& subresources,
|
||||
VkImageLayout initialLayout) {
|
||||
if (initialLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
|
||||
accessImage(DxvkCmdBuffer::InitBuffer,
|
||||
*image, subresources, initialLayout,
|
||||
VK_PIPELINE_STAGE_2_NONE, 0);
|
||||
const VkImageSubresourceRange& subresources) {
|
||||
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
|
||||
m_cmd->track(image, DxvkAccess::None);
|
||||
} else {
|
||||
VkImageLayout clearLayout = image->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
addImageInitTransition(*image, subresources, clearLayout,
|
||||
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
|
||||
flushImageLayoutTransitions(DxvkCmdBuffer::InitBuffer);
|
||||
|
||||
addImageInitTransition(*image, subresources, clearLayout,
|
||||
VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT);
|
||||
flushImageLayoutTransitions(DxvkCmdBuffer::InitBuffer);
|
||||
auto formatInfo = image->formatInfo();
|
||||
|
||||
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)) {
|
||||
for (auto aspects = formatInfo->aspectMask; aspects; ) {
|
||||
auto aspect = vk::getNextAspect(aspects);
|
||||
auto extent = image->mipLevelExtent(subresources.baseMipLevel);
|
||||
auto elementSize = formatInfo->elementSize;
|
||||
if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) {
|
||||
auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)];
|
||||
extent.width /= plane->blockSize.width;
|
||||
extent.height /= plane->blockSize.height;
|
||||
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)) {
|
||||
auto plane = &formatInfo->planes[vk::getPlaneIndex(aspect)];
|
||||
extent.width /= plane->blockSize.width;
|
||||
extent.height /= plane->blockSize.height;
|
||||
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;
|
||||
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;
|
||||
|
||||
auto zeroBuffer = createZeroBuffer(dataSize);
|
||||
auto zeroHandle = zeroBuffer->getSliceHandle();
|
||||
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 = ©Region;
|
||||
|
||||
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)) {
|
||||
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 = ©Region;
|
||||
|
||||
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, ©Info);
|
||||
}
|
||||
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, ©Info);
|
||||
}
|
||||
|
||||
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,
|
||||
image->handle(), clearLayout, &value, 1, &subresources);
|
||||
} else {
|
||||
VkClearColorValue value = { };
|
||||
|
||||
m_cmd->cmdClearColorImage(DxvkCmdBuffer::InitBuffer,
|
||||
image->handle(), clearLayout, &value, 1, &subresources);
|
||||
}
|
||||
m_cmd->track(zeroBuffer, DxvkAccess::Read);
|
||||
}
|
||||
} else {
|
||||
if (subresources.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||
VkClearDepthStencilValue value = { };
|
||||
|
||||
accessImage(DxvkCmdBuffer::InitBuffer,
|
||||
*image, subresources, clearLayout,
|
||||
VK_PIPELINE_STAGE_2_TRANSFER_BIT,
|
||||
VK_ACCESS_2_TRANSFER_WRITE_BIT);
|
||||
m_cmd->cmdClearDepthStencilImage(DxvkCmdBuffer::InitBuffer,
|
||||
image->handle(), clearLayout, &value, 1, &subresources);
|
||||
} else {
|
||||
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)
|
||||
return;
|
||||
|
||||
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED)
|
||||
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED)
|
||||
image.trackInitialization(subresources);
|
||||
|
||||
auto& barrier = m_imageLayoutTransitions.emplace_back();
|
||||
@ -6865,7 +6856,7 @@ namespace dxvk {
|
||||
VkAccessFlags2 dstAccess) {
|
||||
auto& batch = getBarrierBatch(cmdBuffer);
|
||||
|
||||
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED || srcLayout == VK_IMAGE_LAYOUT_PREINITIALIZED)
|
||||
if (srcLayout == VK_IMAGE_LAYOUT_UNDEFINED)
|
||||
image.trackInitialization(subresources);
|
||||
|
||||
VkImageMemoryBarrier2 barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 };
|
||||
|
@ -898,12 +898,10 @@ namespace dxvk {
|
||||
* Only safe to call if the image is not in use by the GPU.
|
||||
* \param [in] image The image to initialize
|
||||
* \param [in] subresources Image subresources
|
||||
* \param [in] initialLayout Initial image layout
|
||||
*/
|
||||
void initImage(
|
||||
const Rc<DxvkImage>& image,
|
||||
const VkImageSubresourceRange& subresources,
|
||||
VkImageLayout initialLayout);
|
||||
const VkImageSubresourceRange& subresources);
|
||||
|
||||
/**
|
||||
* \brief Initializes sparse image
|
||||
|
@ -296,7 +296,7 @@ namespace dxvk {
|
||||
info.tiling = m_info.tiling;
|
||||
info.usage = m_info.usage | usageInfo.usage;
|
||||
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||
info.initialLayout = m_info.initialLayout;
|
||||
info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
|
||||
return info;
|
||||
}
|
||||
|
@ -52,9 +52,6 @@ namespace dxvk {
|
||||
/// Common image layout
|
||||
VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
|
||||
// Initial image layout
|
||||
VkImageLayout initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
|
||||
// Image is used by multiple contexts so it needs
|
||||
// to be in its default layout after each submission
|
||||
VkBool32 shared = VK_FALSE;
|
||||
@ -585,8 +582,8 @@ namespace dxvk {
|
||||
/**
|
||||
* \brief Tracks subresource initialization
|
||||
*
|
||||
* Initialization happens when transitioning the image
|
||||
* away from \c PREINITIALIZED or \c UNDEFINED layouts.
|
||||
* Initialization happens when transitioning
|
||||
* the image away from \c UNDEFINED layouts.
|
||||
* \param [in] subresources Subresource range
|
||||
*/
|
||||
void trackInitialization(
|
||||
|
@ -366,7 +366,6 @@ namespace dxvk {
|
||||
imageInfo.access = VK_ACCESS_2_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT;
|
||||
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||
imageInfo.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
|
||||
m_gammaImage = m_device->createImage(imageInfo,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
|
@ -347,7 +347,6 @@ namespace dxvk::hud {
|
||||
| VK_ACCESS_SHADER_READ_BIT;
|
||||
fontTextureInfo.tiling = VK_IMAGE_TILING_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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user