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
89
project.cpp
89
project.cpp
|
|
@ -328,6 +328,37 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
|
|||
bc.GetInterfacesAndImplementations(ifaces, blasImpls);
|
||||
cfg.tests.push_back(std::move(blasTest));
|
||||
|
||||
// Issue #64: TLAS host-input buffers (instanceBuffer / metadataBuffer)
|
||||
// grow on a high-water mark instead of reallocating to the exact count
|
||||
// every topology change. Drives the real hardware AS-build path — a
|
||||
// cube BLAS plus RenderingElement3D::BuildTLAS at a sequence of
|
||||
// instance counts — and asserts that a shrink (and any growth within
|
||||
// the high-water capacity) reuses the existing allocation while a
|
||||
// growth past it reallocates, with the validation layer reporting no
|
||||
// errors when an oversized instance buffer is fed to the build. Needs a
|
||||
// Vulkan RT device at runtime, so it shares the native build settings.
|
||||
Test tlasTest;
|
||||
Configuration& tlc = tlasTest.config;
|
||||
tlc.path = cfg.path;
|
||||
tlc.name = "TLASHighWaterMark";
|
||||
tlc.outputName = "TLASHighWaterMark";
|
||||
tlc.type = ConfigurationType::Executable;
|
||||
tlc.target = cfg.target;
|
||||
tlc.march = cfg.march;
|
||||
tlc.mtune = cfg.mtune;
|
||||
tlc.debug = cfg.debug;
|
||||
tlc.sysroot = cfg.sysroot;
|
||||
tlc.dependencies = cfg.dependencies;
|
||||
tlc.externalDependencies = cfg.externalDependencies;
|
||||
tlc.compileFlags = cfg.compileFlags;
|
||||
tlc.linkFlags = cfg.linkFlags;
|
||||
tlc.defines = cfg.defines;
|
||||
tlc.cFiles = cfg.cFiles;
|
||||
std::vector<fs::path> tlasImpls(impls.begin(), impls.end());
|
||||
tlasImpls.emplace_back("tests/TLASHighWaterMark/main");
|
||||
tlc.GetInterfacesAndImplementations(ifaces, tlasImpls);
|
||||
cfg.tests.push_back(std::move(tlasTest));
|
||||
|
||||
// Issue #51: FontAtlas only re-uploads the dirty sub-rect now,
|
||||
// tracked via FontAtlas::DirtyRect. The accumulation/clamp math is
|
||||
// pure CPU, so this test drives it directly — no GPU device needed
|
||||
|
|
@ -499,6 +530,35 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
|
|||
rfc.GetInterfacesAndImplementations(ifaces, rangedFlushImpls);
|
||||
cfg.tests.push_back(std::move(rangedFlushTest));
|
||||
|
||||
// Issue #63: VulkanBuffer::Resize now reuses the existing allocation in
|
||||
// place when a new request still fits the created capacity and the
|
||||
// immutable-at-create properties match (usage flags fixed at create;
|
||||
// chosen memory type still satisfies the required flags), instead of
|
||||
// always destroying + reallocating. The reuse guard is pure logic over
|
||||
// recorded fields, so this test stamps a fake handle + capacity/flags and
|
||||
// verifies the in-place path issues no Vulkan call — no GPU device needed.
|
||||
Test resizeTest;
|
||||
Configuration& rc = resizeTest.config;
|
||||
rc.path = cfg.path;
|
||||
rc.name = "VulkanBufferResizeReuse";
|
||||
rc.outputName = "VulkanBufferResizeReuse";
|
||||
rc.type = ConfigurationType::Executable;
|
||||
rc.target = cfg.target;
|
||||
rc.march = cfg.march;
|
||||
rc.mtune = cfg.mtune;
|
||||
rc.debug = cfg.debug;
|
||||
rc.sysroot = cfg.sysroot;
|
||||
rc.dependencies = cfg.dependencies;
|
||||
rc.externalDependencies = cfg.externalDependencies;
|
||||
rc.compileFlags = cfg.compileFlags;
|
||||
rc.linkFlags = cfg.linkFlags;
|
||||
rc.defines = cfg.defines;
|
||||
rc.cFiles = cfg.cFiles;
|
||||
std::vector<fs::path> resizeImpls(impls.begin(), impls.end());
|
||||
resizeImpls.emplace_back("tests/VulkanBufferResizeReuse/main");
|
||||
rc.GetInterfacesAndImplementations(ifaces, resizeImpls);
|
||||
cfg.tests.push_back(std::move(resizeTest));
|
||||
|
||||
// Issue #89: Device::PreferDirectDeviceWrite chooses the upload strategy
|
||||
// for a CPU-written, GPU-read buffer — direct HOST_VISIBLE|DEVICE_LOCAL
|
||||
// map+write on ReBAR/UMA vs. staged-into-pure-DEVICE_LOCAL on a small
|
||||
|
|
@ -614,6 +674,35 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
|
|||
hitImpls.emplace_back("tests/InputFieldHitTest/main");
|
||||
hc.GetInterfacesAndImplementations(ifaces, hitImpls);
|
||||
cfg.tests.push_back(std::move(hitTest));
|
||||
|
||||
// Issue #69: the engine feeds one shared Device::pipelineCache to every
|
||||
// vkCreate*Pipelines call and persists it across runs, discarding an
|
||||
// on-disk blob whose header doesn't match the current GPU. That gate —
|
||||
// Device::PipelineCacheDataCompatible — is pure logic over the standard
|
||||
// VkPipelineCache header and Device::deviceProperties, so this test
|
||||
// stamps synthetic device identities + headers and drives it directly,
|
||||
// no GPU device needed at runtime.
|
||||
Test cacheTest;
|
||||
Configuration& cc = cacheTest.config;
|
||||
cc.path = cfg.path;
|
||||
cc.name = "PipelineCacheValidation";
|
||||
cc.outputName = "PipelineCacheValidation";
|
||||
cc.type = ConfigurationType::Executable;
|
||||
cc.target = cfg.target;
|
||||
cc.march = cfg.march;
|
||||
cc.mtune = cfg.mtune;
|
||||
cc.debug = cfg.debug;
|
||||
cc.sysroot = cfg.sysroot;
|
||||
cc.dependencies = cfg.dependencies;
|
||||
cc.externalDependencies = cfg.externalDependencies;
|
||||
cc.compileFlags = cfg.compileFlags;
|
||||
cc.linkFlags = cfg.linkFlags;
|
||||
cc.defines = cfg.defines;
|
||||
cc.cFiles = cfg.cFiles;
|
||||
std::vector<fs::path> cacheImpls(impls.begin(), impls.end());
|
||||
cacheImpls.emplace_back("tests/PipelineCacheValidation/main");
|
||||
cc.GetInterfacesAndImplementations(ifaces, cacheImpls);
|
||||
cfg.tests.push_back(std::move(cacheTest));
|
||||
}
|
||||
|
||||
return cfg;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue