fix(shader): avoid retaining IR after plan cache misses

This commit is contained in:
MarcZX100 committed 2026-10-15 10:15:33 +00:00
1 parent f95dc97134
commit c00b0dfb9f
2 files changed
+27 -1

No files matched your search

@@ -1871,6 +1871,28 @@ void verifyPlanRoundTrip() {
const auto reloadedPlan = GetResourcePlan(registeredRequest);
require(ShaderDiskCache::Totals().planHits == beforeReload.planHits + 1u, "a released registration plan was not reloaded from the disk cache");
require(samePlan(*registeredPlan, *reloadedPlan), "a released registration plan changed when reloaded");
auto reloadFixture = fixtures.front();
reloadFixture.waveSize = 32u;
reloadFixture.code.insert(reloadFixture.code.begin(), 0xbf800004u);
const auto reloadRequest = reloadFixture.Request(true);
const auto reloadHandle = PrepareShader(reloadRequest);
static_cast<void>(GetResourcePlan(reloadRequest));
ShaderDiskCache::Flush();
std::vector<std::byte> reloadKey;
ShaderDiskCache::BuildPlanKey(reloadRequest, 32u, reloadKey);
const auto reloadPath = ShaderDiskCache::EntryDirectory() / ShaderDiskCache::EntryName(reloadKey);
require(std::filesystem::is_regular_file(reloadPath), "the reload regression plan was not persisted");
const auto preservedPath = reloadPath.string() + ".reload-preserved";
std::filesystem::rename(reloadPath, preservedPath);
ReleaseUndrawnResourcePlan(*reloadHandle);
static_cast<void>(GetResourcePlan(reloadRequest));
auto secondLayout = reloadRequest;
secondLayout.layout.pushConstantSizeBytes = 0u;
ShaderPreparationContext preparation;
static_cast<void>(PrepareShader(secondLayout, &preparation));
require(preparation.ResourcePrograms() == 1u, "a plan reload retained full IR after an artifact for that layout was already available");
RequestMemoryView registeredMemory(registeredRequest.context.memory);
const auto runtimeCapture = CaptureResources(registeredRequest, registeredMemory.MakeRuntime(registeredRequest.context.userData, registeredRequest.shader.codeAddress), *registeredHandle);
const auto beforeKeep = ShaderDiskCache::Totals();
+5 -1
View File
@@ -397,6 +397,8 @@ bool diskPlans() {
return enabled && ShaderDiskCache::Enabled() && !DebugProbeActive();
}
bool sameLayout(const BindingLayout& left, const BindingLayout& right);
std::shared_ptr<SourceEntry> getSource(const RecompileRequest& request, ShaderPreparationContext* preparation = nullptr, bool reclaim = true) {
static PrimedSharedMutex mutex;
// Entries whose code hashes alike share a bucket; the code comparison picks the right one.
@@ -455,7 +457,9 @@ std::shared_ptr<SourceEntry> getSource(const RecompileRequest& request, ShaderPr
try {
ResourceProgram resource(request, preparation, reclaim);
source->plan = std::move(resource.plan);
source->program = std::move(resource.program);
if (std::ranges::none_of(source->variants, [&](const auto& variant) { return sameLayout(variant->layout, request.layout); })) {
source->program = std::move(resource.program);
}
} catch (...) {
if (FailureMemo()) source->planFailure = std::current_exception();
throw;