Merge remote-tracking branch 'origin/master' into claude/issue-61
# Conflicts: # interfaces/Crafter.Graphics-Device.cppm # interfaces/Crafter.Graphics-VulkanBuffer.cppm # project.cpp
This commit is contained in:
commit
1f12f074b1
11 changed files with 860 additions and 9 deletions
|
|
@ -169,6 +169,27 @@ export namespace Crafter {
|
|||
// creation; defaults to 1 so the rounding math is well-defined before then.
|
||||
inline static VkDeviceSize nonCoherentAtomSize = 1;
|
||||
|
||||
// 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
|
||||
};
|
||||
|
|
@ -207,6 +228,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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue