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:
parent
dda4ef3be1
commit
4724dfff86
@ -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);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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 = ©Region;
|
||||||
|
|
||||||
for (uint32_t level = 0; level < subresources.levelCount; level++) {
|
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::InitBuffer, ©Info);
|
||||||
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->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 };
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user