1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-13 19:29:14 +01:00

[dxvk] Introduce initSparseImage

This commit is contained in:
Philip Rebohle 2022-08-25 21:15:14 +02:00
parent fc0d952edb
commit 43b19f773c
2 changed files with 65 additions and 1 deletions

View File

@ -1523,6 +1523,60 @@ namespace dxvk {
}
void DxvkContext::initSparseImage(
const Rc<DxvkImage>& image) {
auto vk = m_device->vkd();
// Query sparse memory requirements
uint32_t reqCount = 0;
vk->vkGetImageSparseMemoryRequirements(vk->device(), image->handle(), &reqCount, nullptr);
std::vector<VkSparseImageMemoryRequirements> req(reqCount);
vk->vkGetImageSparseMemoryRequirements(vk->device(), image->handle(), &reqCount, req.data());
// Bind metadata aspects. Since the image was just created,
// we do not need to interrupt our command list for that.
VkDeviceMemory imageMemory = image->memory().memory();
VkDeviceSize imageOffset = image->memory().offset();
for (const auto& r : req) {
if (!(r.formatProperties.aspectMask & VK_IMAGE_ASPECT_METADATA_BIT))
continue;
uint32_t layerCount = (r.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT)
? 1u : image->info().numLayers;
for (uint32_t i = 0; i < layerCount; i++) {
DxvkSparseImageOpaqueBindKey key;
key.image = image->handle();
key.offset = r.imageMipTailOffset + i * r.imageMipTailStride;
key.size = r.imageMipTailSize;
key.flags = VK_SPARSE_MEMORY_BIND_METADATA_BIT;
DxvkSparsePageHandle page;
page.memory = imageMemory;
page.offset = imageOffset;
page.length = r.imageMipTailSize;
m_cmd->bindImageOpaqueMemory(key, page);
imageOffset += r.imageMipTailSize;
}
}
// Perform initial layout transition
m_initBarriers.accessImage(image,
image->getAvailableSubresources(),
VK_IMAGE_LAYOUT_UNDEFINED,
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0,
image->info().layout,
image->info().stages,
image->info().access);
m_cmd->trackResource<DxvkAccess::Write>(image);
}
void DxvkContext::emitGraphicsBarrier(
VkPipelineStageFlags srcStages,
VkAccessFlags srcAccess,

View File

@ -905,7 +905,17 @@ namespace dxvk {
const Rc<DxvkImage>& image,
const VkImageSubresourceRange& subresources,
VkImageLayout initialLayout);
/**
* \brief Initializes sparse image
*
* Binds any metadata aspects that the image might
* have, and performs the initial layout transition.
* \param [in] image Image to initialize
*/
void initSparseImage(
const Rc<DxvkImage>& image);
/**
* \brief Invalidates a buffer's contents
*