mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-31 14:52:11 +01:00
[dxvk] Add method to allocate backing storage with constraints
This commit is contained in:
parent
a3c8c88222
commit
bfcfcab60f
@ -77,5 +77,27 @@ namespace dxvk {
|
|||||||
DxvkSparsePageTable* DxvkBuffer::getSparsePageTable() {
|
DxvkSparsePageTable* DxvkBuffer::getSparsePageTable() {
|
||||||
return m_storage->getSparsePageTable();
|
return m_storage->getSparsePageTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Rc<DxvkResourceAllocation> DxvkBuffer::relocateStorage(
|
||||||
|
DxvkAllocationModes mode) {
|
||||||
|
// The resource may become non-relocatable even after we allocate new
|
||||||
|
// backing storage, but if it already is then don't waste memory.
|
||||||
|
if (!canRelocate())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
DxvkAllocationInfo allocationInfo = { };
|
||||||
|
allocationInfo.resourceCookie = cookie();
|
||||||
|
allocationInfo.properties = m_properties;
|
||||||
|
allocationInfo.mode = mode;
|
||||||
|
|
||||||
|
VkBufferCreateInfo info = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
|
||||||
|
info.flags = m_info.flags;
|
||||||
|
info.usage = m_info.usage;
|
||||||
|
info.size = m_info.size;
|
||||||
|
m_sharingMode.fill(info);
|
||||||
|
|
||||||
|
return m_allocator->createBufferResource(info, allocationInfo, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -397,6 +397,15 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
DxvkSparsePageTable* getSparsePageTable();
|
DxvkSparsePageTable* getSparsePageTable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Allocates new backing storage with constraints
|
||||||
|
*
|
||||||
|
* \param [in] mode Allocation mode flags
|
||||||
|
* \returns Operation status and allocation
|
||||||
|
*/
|
||||||
|
Rc<DxvkResourceAllocation> relocateStorage(
|
||||||
|
DxvkAllocationModes mode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Rc<vk::DeviceFn> m_vkd;
|
Rc<vk::DeviceFn> m_vkd;
|
||||||
|
@ -1586,7 +1586,7 @@ namespace dxvk {
|
|||||||
DxvkImageUsageInfo usage = usageInfo;
|
DxvkImageUsageInfo usage = usageInfo;
|
||||||
usage.flags |= createFlags;
|
usage.flags |= createFlags;
|
||||||
|
|
||||||
auto storage = image->allocateStorageWithUsage(usage);
|
auto storage = image->allocateStorageWithUsage(usage, 0u);
|
||||||
|
|
||||||
DxvkRelocateImageInfo relocateInfo;
|
DxvkRelocateImageInfo relocateInfo;
|
||||||
relocateInfo.image = image;
|
relocateInfo.image = image;
|
||||||
|
@ -108,6 +108,15 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Rc<DxvkResourceAllocation> DxvkImage::relocateStorage(
|
||||||
|
DxvkAllocationModes mode) {
|
||||||
|
if (!canRelocate())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return allocateStorageWithUsage(DxvkImageUsageInfo(), mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkImageView> DxvkImage::createView(
|
Rc<DxvkImageView> DxvkImage::createView(
|
||||||
const DxvkImageViewKey& info) {
|
const DxvkImageViewKey& info) {
|
||||||
std::unique_lock lock(m_viewMutex);
|
std::unique_lock lock(m_viewMutex);
|
||||||
@ -120,11 +129,13 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
Rc<DxvkResourceAllocation> DxvkImage::allocateStorage() {
|
Rc<DxvkResourceAllocation> DxvkImage::allocateStorage() {
|
||||||
return allocateStorageWithUsage(DxvkImageUsageInfo());
|
return allocateStorageWithUsage(DxvkImageUsageInfo(), 0u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Rc<DxvkResourceAllocation> DxvkImage::allocateStorageWithUsage(const DxvkImageUsageInfo& usageInfo) {
|
Rc<DxvkResourceAllocation> DxvkImage::allocateStorageWithUsage(
|
||||||
|
const DxvkImageUsageInfo& usageInfo,
|
||||||
|
DxvkAllocationModes mode) {
|
||||||
const DxvkFormatInfo* formatInfo = lookupFormatInfo(m_info.format);
|
const DxvkFormatInfo* formatInfo = lookupFormatInfo(m_info.format);
|
||||||
small_vector<VkFormat, 4> localViewFormats;
|
small_vector<VkFormat, 4> localViewFormats;
|
||||||
|
|
||||||
|
@ -515,6 +515,15 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
DxvkSparsePageTable* getSparsePageTable();
|
DxvkSparsePageTable* getSparsePageTable();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Allocates new backing storage with constraints
|
||||||
|
*
|
||||||
|
* \param [in] mode Allocation mode flags
|
||||||
|
* \returns Operation status and allocation
|
||||||
|
*/
|
||||||
|
Rc<DxvkResourceAllocation> relocateStorage(
|
||||||
|
DxvkAllocationModes mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Creates image resource
|
* \brief Creates image resource
|
||||||
*
|
*
|
||||||
@ -529,10 +538,12 @@ namespace dxvk {
|
|||||||
* Creates new backing storage with additional usage flags
|
* Creates new backing storage with additional usage flags
|
||||||
* enabled. Useful to expand on usage flags after creation.
|
* enabled. Useful to expand on usage flags after creation.
|
||||||
* \param [in] usage Usage flags to add
|
* \param [in] usage Usage flags to add
|
||||||
|
* \param [in] mode Allocation constraints
|
||||||
* \returns New underlying image resource
|
* \returns New underlying image resource
|
||||||
*/
|
*/
|
||||||
Rc<DxvkResourceAllocation> allocateStorageWithUsage(
|
Rc<DxvkResourceAllocation> allocateStorageWithUsage(
|
||||||
const DxvkImageUsageInfo& usage);
|
const DxvkImageUsageInfo& usage,
|
||||||
|
DxvkAllocationModes mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Assigns backing storage to the image
|
* \brief Assigns backing storage to the image
|
||||||
|
@ -522,6 +522,21 @@ namespace dxvk {
|
|||||||
*/
|
*/
|
||||||
virtual DxvkSparsePageTable* getSparsePageTable() = 0;
|
virtual DxvkSparsePageTable* getSparsePageTable() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Allocates new backing storage with constraints
|
||||||
|
*
|
||||||
|
* \param [in] mode Allocation mode flags to control behaviour.
|
||||||
|
* When relocating the resource to a preferred memory type,
|
||||||
|
* \c NoFallback should be set, when defragmenting device
|
||||||
|
* memory then \c NoAllocation should also be set.
|
||||||
|
* \returns \c true in the first field if the operation is
|
||||||
|
* considered successful, i.e. if an new backing allocation
|
||||||
|
* was successfully created or is unnecessary. The second
|
||||||
|
* field will contain the new allocation itself.
|
||||||
|
*/
|
||||||
|
virtual Rc<DxvkResourceAllocation> relocateStorage(
|
||||||
|
DxvkAllocationModes mode) = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::atomic<uint64_t> m_useCount = { 0u };
|
std::atomic<uint64_t> m_useCount = { 0u };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user