Merge pull request 'perf(pipeline): shared, disk-persisted VkPipelineCache (#69)' (#97) from claude/issue-69 into master
This commit is contained in:
commit
bd8076769a
7 changed files with 332 additions and 5 deletions
|
|
@ -161,6 +161,27 @@ export namespace Crafter {
|
|||
|
||||
inline static VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||
|
||||
// Core physical-device properties, captured once at Initialize from the
|
||||
// VkPhysicalDeviceProperties2 query. Kept because the pipeline-cache
|
||||
// persistence path needs vendorID / deviceID / pipelineCacheUUID to
|
||||
// decide whether an on-disk blob was written by this exact device.
|
||||
inline static VkPhysicalDeviceProperties deviceProperties = {};
|
||||
|
||||
// One process-wide pipeline cache fed to every vkCreate*Pipelines call
|
||||
// (compute UI/user shaders + RT pipelines). Pipeline compilation is a
|
||||
// one-time cold-start cost, not a per-frame one; a single shared cache
|
||||
// lets the driver reuse compiled shader binaries across the several
|
||||
// pipelines built at startup and — once persisted to disk (see
|
||||
// LoadPipelineCache / SavePipelineCache) — across runs. VK_NULL_HANDLE
|
||||
// until LoadPipelineCache runs; passing VK_NULL_HANDLE to a create call
|
||||
// is valid and simply means "no cache", so the create sites need no
|
||||
// null check.
|
||||
inline static VkPipelineCache pipelineCache = VK_NULL_HANDLE;
|
||||
// Where the serialized cache lives. Relative to the working directory,
|
||||
// matching the gpu_crash_dump-* convention. Set before Initialize to
|
||||
// relocate it.
|
||||
inline static std::filesystem::path pipelineCachePath = "pipeline_cache.bin";
|
||||
|
||||
inline static VkPhysicalDeviceDescriptorHeapPropertiesEXT descriptorHeapProperties = {
|
||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_PROPERTIES_EXT
|
||||
};
|
||||
|
|
@ -199,6 +220,23 @@ export namespace Crafter {
|
|||
// ComputeShader read the offset off the pipeline they record.
|
||||
|
||||
static void CheckVkResult(VkResult result);
|
||||
|
||||
// ─── Pipeline cache persistence (issue #69) ─────────────────────
|
||||
// LoadPipelineCache creates `pipelineCache`, seeding it from
|
||||
// pipelineCachePath when the file exists *and* its header matches this
|
||||
// device (PipelineCacheDataCompatible) — a stale or foreign blob is
|
||||
// discarded so the driver never rejects it. Called once from
|
||||
// Initialize. SavePipelineCache writes the driver's current cache blob
|
||||
// back out; Initialize registers it with std::atexit so the cache is
|
||||
// serialized at process shutdown without any explicit teardown call.
|
||||
static void LoadPipelineCache();
|
||||
static void SavePipelineCache();
|
||||
// True when `data` is a VkPipelineCache blob whose header was written by
|
||||
// a device with the same vendorID / deviceID / pipelineCacheUUID as
|
||||
// `deviceProperties`. Pure logic over the standard 32-byte cache header,
|
||||
// so it is driven directly by the PipelineCacheValidation test with no
|
||||
// GPU device. A blob too short to hold the header is incompatible.
|
||||
static bool PipelineCacheDataCompatible(std::span<const std::byte> data);
|
||||
// Selects a memory type index from typeBits that satisfies `required`.
|
||||
// When `preferred` bits are also given, a type satisfying both is
|
||||
// chosen first; if none exists we fall back to required-only rather
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ export namespace Crafter {
|
|||
.layout = VK_NULL_HANDLE
|
||||
};
|
||||
|
||||
Device::CheckVkResult(Device::vkCreateRayTracingPipelinesKHR(Device::device, {}, {}, 1, &rtPipelineInfo, nullptr, &pipeline));
|
||||
Device::CheckVkResult(Device::vkCreateRayTracingPipelinesKHR(Device::device, {}, Device::pipelineCache, 1, &rtPipelineInfo, nullptr, &pipeline));
|
||||
|
||||
std::size_t dataSize = Device::rayTracingProperties.shaderGroupHandleSize * rtPipelineInfo.groupCount;
|
||||
shaderHandles.resize(dataSize);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue