mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-21 08:12:09 -05:00
fix(shader): avoid retaining IR after plan cache misses
This commit is contained in:
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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user