cache directwrite
This commit is contained in:
parent
69641f1c44
commit
ab222ffa1f
3 changed files with 32 additions and 5 deletions
|
|
@ -780,6 +780,7 @@ void Device::Initialize() {
|
||||||
CheckVkResult(vkCreateCommandPool(device, &commandPoolcreateInfo, NULL, &commandPool));
|
CheckVkResult(vkCreateCommandPool(device, &commandPoolcreateInfo, NULL, &commandPool));
|
||||||
|
|
||||||
vkGetPhysicalDeviceMemoryProperties(physDevice, &memoryProperties);
|
vkGetPhysicalDeviceMemoryProperties(physDevice, &memoryProperties);
|
||||||
|
CacheUploadStrategy();
|
||||||
|
|
||||||
vkGetAccelerationStructureBuildSizesKHR = reinterpret_cast<PFN_vkGetAccelerationStructureBuildSizesKHR>(vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureBuildSizesKHR"));
|
vkGetAccelerationStructureBuildSizesKHR = reinterpret_cast<PFN_vkGetAccelerationStructureBuildSizesKHR>(vkGetInstanceProcAddr(instance, "vkGetAccelerationStructureBuildSizesKHR"));
|
||||||
vkCreateAccelerationStructureKHR = reinterpret_cast<PFN_vkCreateAccelerationStructureKHR>(vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR"));
|
vkCreateAccelerationStructureKHR = reinterpret_cast<PFN_vkCreateAccelerationStructureKHR>(vkGetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR"));
|
||||||
|
|
@ -842,7 +843,7 @@ std::uint32_t Device::GetMemoryType(uint32_t typeBits, VkMemoryPropertyFlags req
|
||||||
throw std::runtime_error("Could not find a matching memory type");
|
throw std::runtime_error("Could not find a matching memory type");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::PreferDirectDeviceWrite(VkDeviceSize size) {
|
void Device::CacheUploadStrategy() {
|
||||||
constexpr VkMemoryPropertyFlags directFlags =
|
constexpr VkMemoryPropertyFlags directFlags =
|
||||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||||
|
|
||||||
|
|
@ -858,7 +859,8 @@ bool Device::PreferDirectDeviceWrite(VkDeviceSize size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!haveDirectType) {
|
if (!haveDirectType) {
|
||||||
return false;
|
directWriteBudget = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Compare the host-visible device-local heap against the largest plain
|
// 2. Compare the host-visible device-local heap against the largest plain
|
||||||
|
|
@ -871,10 +873,11 @@ bool Device::PreferDirectDeviceWrite(VkDeviceSize size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. ReBAR / UMA: the BAR heap covers (almost) all of VRAM -> direct.
|
// 3. ReBAR / UMA: the BAR heap covers (almost) all of VRAM -> map any size.
|
||||||
// barHeap >= 0.9 * vram, written to dodge floating point / overflow.
|
// barHeap >= 0.9 * vram, written to dodge floating point / overflow.
|
||||||
if (barHeap >= vram - vram / 10) {
|
if (barHeap >= vram - vram / 10) {
|
||||||
return true;
|
directWriteBudget = std::numeric_limits<VkDeviceSize>::max();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Small BAR window: direct only for buffers small enough that several
|
// 4. Small BAR window: direct only for buffers small enough that several
|
||||||
|
|
@ -884,5 +887,11 @@ bool Device::PreferDirectDeviceWrite(VkDeviceSize size) {
|
||||||
// both a 256 MiB and a 4 GiB window). VK_EXT_memory_budget would refine
|
// both a 256 MiB and a 4 GiB window). VK_EXT_memory_budget would refine
|
||||||
// this to the window's *remaining* space; see the header note.
|
// this to the window's *remaining* space; see the header note.
|
||||||
constexpr VkDeviceSize barWindowFraction = 8;
|
constexpr VkDeviceSize barWindowFraction = 8;
|
||||||
return size <= barHeap / barWindowFraction;
|
directWriteBudget = barHeap / barWindowFraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Device::PreferDirectDeviceWrite(VkDeviceSize size) {
|
||||||
|
// directWriteBudget caches the size-independent decision (CacheUploadStrategy):
|
||||||
|
// 0 -> never direct, max -> ReBAR/UMA so any size, else the small-window cap.
|
||||||
|
return directWriteBudget != 0 && size <= directWriteBudget;
|
||||||
}
|
}
|
||||||
|
|
@ -232,8 +232,22 @@ export namespace Crafter {
|
||||||
// small-window budget would consult VK_EXT_memory_budget for the
|
// small-window budget would consult VK_EXT_memory_budget for the
|
||||||
// window's *remaining* space rather than its total size; that needs the
|
// window's *remaining* space rather than its total size; that needs the
|
||||||
// extension enabled and is a follow-up.
|
// extension enabled and is a follow-up.
|
||||||
|
//
|
||||||
|
// Everything except the final size comparison depends only on
|
||||||
|
// memoryProperties, so it is derived once by CacheUploadStrategy (called
|
||||||
|
// at device creation) into the directWrite* members below; this leaves
|
||||||
|
// the per-allocation call a single bounds check.
|
||||||
static bool PreferDirectDeviceWrite(VkDeviceSize size);
|
static bool PreferDirectDeviceWrite(VkDeviceSize size);
|
||||||
|
|
||||||
|
// Size-independent half of PreferDirectDeviceWrite, cached from
|
||||||
|
// memoryProperties. directWriteBudget is the largest buffer that may be
|
||||||
|
// written directly: 0 when no resizable BAR exists (always stage),
|
||||||
|
// VkDeviceSize max for ReBAR/UMA (always map), or the small-window
|
||||||
|
// per-buffer cap otherwise. Recompute via CacheUploadStrategy whenever
|
||||||
|
// memoryProperties changes (device creation does this once).
|
||||||
|
inline static VkDeviceSize directWriteBudget = 0;
|
||||||
|
static void CacheUploadStrategy();
|
||||||
|
|
||||||
// ─── Wayland key repeat ────────────────────────────────────────
|
// ─── Wayland key repeat ────────────────────────────────────────
|
||||||
// TickKeyRepeats fires onRawKeyDown / onRawKeyHold / onTextInput on
|
// TickKeyRepeats fires onRawKeyDown / onRawKeyHold / onTextInput on
|
||||||
// the focused window for whichever key is currently repeating.
|
// the focused window for whichever key is currently repeating.
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,10 @@ void SetMemory(std::initializer_list<TypeSpec> types,
|
||||||
Device::memoryProperties.memoryHeaps[h].flags = s.flags;
|
Device::memoryProperties.memoryHeaps[h].flags = s.flags;
|
||||||
++h;
|
++h;
|
||||||
}
|
}
|
||||||
|
// PreferDirectDeviceWrite reads the cache CacheUploadStrategy derives from
|
||||||
|
// memoryProperties (device creation does this once); refresh it here since
|
||||||
|
// the test mutates the layout directly.
|
||||||
|
Device::CacheUploadStrategy();
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr VkMemoryHeapFlags HEAP_DEVICE_LOCAL = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
|
constexpr VkMemoryHeapFlags HEAP_DEVICE_LOCAL = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue