Shader Recompiler: Auto stub special registers and dump pipelines on exception.
This commit is contained in:
parent
8beda6a2bf
commit
710ca3ca49
|
@ -161,7 +161,8 @@ enum class SpecialRegister : u64 {
|
||||||
LOG_WARNING(Shader, "(STUBBED) SR_AFFINITY");
|
LOG_WARNING(Shader, "(STUBBED) SR_AFFINITY");
|
||||||
return ir.Imm32(0); // This is the default value hardware returns.
|
return ir.Imm32(0); // This is the default value hardware returns.
|
||||||
default:
|
default:
|
||||||
throw NotImplementedException("S2R special register {}", special_register);
|
LOG_CRITICAL(Shader, "(STUBBED) Special register {}", special_register);
|
||||||
|
return ir.Imm32(0); // This is the default value hardware returns.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
|
@ -664,6 +664,19 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
||||||
std::move(modules), infos);
|
std::move(modules), infos);
|
||||||
|
|
||||||
} catch (const Shader::Exception& exception) {
|
} catch (const Shader::Exception& exception) {
|
||||||
|
auto hash = key.Hash();
|
||||||
|
size_t env_index{0};
|
||||||
|
for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
|
||||||
|
if (key.unique_hashes[index] == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Shader::Environment& env{*envs[env_index]};
|
||||||
|
++env_index;
|
||||||
|
|
||||||
|
const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))};
|
||||||
|
Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0);
|
||||||
|
env.Dump(hash, key.unique_hashes[index]);
|
||||||
|
}
|
||||||
LOG_ERROR(Render_Vulkan, "{}", exception.what());
|
LOG_ERROR(Render_Vulkan, "{}", exception.what());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue