mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-12-12 10:37:02 +00:00
vk: Always embed shader source code when RenderDoc (etc.) is attached
The only downside is that attaching RenderDoc to Cemu will cause it to ignore the spirv cache. This causes slightly longer load times when RenderDoc is attached and you had a prior shader cache that contained the non-debug shader.
This commit is contained in:
parent
ad89b5ef37
commit
280de39471
1 changed files with 18 additions and 21 deletions
|
|
@ -292,8 +292,10 @@ void RendererShaderVk::FinishCompilation()
|
|||
|
||||
void RendererShaderVk::CompileInternal(bool isRenderThread)
|
||||
{
|
||||
bool compileWithDebugInfo = ((VulkanRenderer*)g_renderer.get())->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT;
|
||||
|
||||
// try to retrieve SPIR-V module from cache
|
||||
if (s_isLoadingShadersVk && (m_isGameShader && !m_isGfxPackShader) && s_spirvCache)
|
||||
if (s_isLoadingShadersVk && (m_isGameShader && !m_isGfxPackShader) && s_spirvCache && !compileWithDebugInfo)
|
||||
{
|
||||
cemu_assert_debug(m_baseHash != 0);
|
||||
uint64 h1, h2;
|
||||
|
|
@ -329,21 +331,12 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
|||
Shader.setStrings(&cstr, 1);
|
||||
Shader.setEnvInput(glslang::EShSourceGlsl, state, glslang::EShClientVulkan, 100);
|
||||
Shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetClientVersion::EShTargetVulkan_1_1);
|
||||
|
||||
Shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
|
||||
|
||||
TBuiltInResource Resources = GetDefaultBuiltInResource();
|
||||
std::string PreprocessedGLSL;
|
||||
|
||||
VulkanRenderer* vkr = (VulkanRenderer*)g_renderer.get();
|
||||
|
||||
EShMessages messagesPreprocess;
|
||||
if (vkr->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT)
|
||||
messagesPreprocess = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules | EShMsgDebugInfo);
|
||||
else
|
||||
messagesPreprocess = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||
|
||||
glslang::TShader::ForbidIncluder Includer;
|
||||
TBuiltInResource Resources = GetDefaultBuiltInResource();
|
||||
EShMessages messagesPreprocess = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||
if (!Shader.preprocess(&Resources, 450, ENoProfile, false, false, messagesPreprocess, &PreprocessedGLSL, Includer))
|
||||
{
|
||||
cemuLog_log(LogType::Force, fmt::format("GLSL Preprocessing Failed For {:016x}_{:016x}: \"{}\"", m_baseHash, m_auxHash, Shader.getInfoLog()));
|
||||
|
|
@ -351,14 +344,9 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
|||
return;
|
||||
}
|
||||
|
||||
EShMessages messagesParseLink;
|
||||
if (vkr->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT)
|
||||
messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules | EShMsgDebugInfo);
|
||||
else
|
||||
messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||
|
||||
const char* PreprocessedCStr = PreprocessedGLSL.c_str();
|
||||
Shader.setStrings(&PreprocessedCStr, 1);
|
||||
EShMessages messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||
if (!Shader.parse(&Resources, 100, false, messagesParseLink))
|
||||
{
|
||||
cemuLog_log(LogType::Force, fmt::format("GLSL parsing failed for {:016x}_{:016x}: \"{}\"", m_baseHash, m_auxHash, Shader.getInfoLog()));
|
||||
|
|
@ -392,9 +380,17 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
|||
|
||||
glslang::SpvOptions spvOptions;
|
||||
spvOptions.disableOptimizer = false;
|
||||
spvOptions.generateDebugInfo = (vkr->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT);
|
||||
spvOptions.validate = false;
|
||||
spvOptions.optimizeSize = true;
|
||||
if (compileWithDebugInfo)
|
||||
{
|
||||
spvOptions.generateDebugInfo = true;
|
||||
spvOptions.emitNonSemanticShaderDebugInfo = true;
|
||||
spvOptions.emitNonSemanticShaderDebugSource = true;
|
||||
|
||||
Shader.addSourceText(m_glslCode.c_str(), (uint32)m_glslCode.size());
|
||||
Shader.setSourceFile(fmt::format("shader_{:016x}_{:016x}.glsl", m_baseHash, m_auxHash).c_str());
|
||||
}
|
||||
|
||||
//auto beginTime = benchmarkTimer_start();
|
||||
|
||||
|
|
@ -403,7 +399,8 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
|||
//double timeDur = benchmarkTimer_stop(beginTime);
|
||||
//forceLogRemoveMe_printf("Shader GLSL-to-SPIRV compilation took %lfms Size %08x", timeDur, spirvBuffer.size()*4);
|
||||
|
||||
if (s_spirvCache && m_isGameShader && m_isGfxPackShader == false)
|
||||
// store in cache, unless it got compiled with debug info or is a modified shader from a gfx pack
|
||||
if (s_spirvCache && m_isGameShader && m_isGfxPackShader == false && !compileWithDebugInfo)
|
||||
{
|
||||
uint64 h1, h2;
|
||||
GenerateShaderPrecompiledCacheFilename(m_type, m_baseHash, m_auxHash, h1, h2);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue