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)
|
void RendererShaderVk::CompileInternal(bool isRenderThread)
|
||||||
{
|
{
|
||||||
|
bool compileWithDebugInfo = ((VulkanRenderer*)g_renderer.get())->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT;
|
||||||
|
|
||||||
// try to retrieve SPIR-V module from cache
|
// 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);
|
cemu_assert_debug(m_baseHash != 0);
|
||||||
uint64 h1, h2;
|
uint64 h1, h2;
|
||||||
|
|
@ -329,21 +331,12 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
||||||
Shader.setStrings(&cstr, 1);
|
Shader.setStrings(&cstr, 1);
|
||||||
Shader.setEnvInput(glslang::EShSourceGlsl, state, glslang::EShClientVulkan, 100);
|
Shader.setEnvInput(glslang::EShSourceGlsl, state, glslang::EShClientVulkan, 100);
|
||||||
Shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetClientVersion::EShTargetVulkan_1_1);
|
Shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetClientVersion::EShTargetVulkan_1_1);
|
||||||
|
|
||||||
Shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
|
Shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
|
||||||
|
|
||||||
TBuiltInResource Resources = GetDefaultBuiltInResource();
|
|
||||||
std::string PreprocessedGLSL;
|
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;
|
glslang::TShader::ForbidIncluder Includer;
|
||||||
|
TBuiltInResource Resources = GetDefaultBuiltInResource();
|
||||||
|
EShMessages messagesPreprocess = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||||
if (!Shader.preprocess(&Resources, 450, ENoProfile, false, false, messagesPreprocess, &PreprocessedGLSL, Includer))
|
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()));
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EShMessages messagesParseLink;
|
|
||||||
if (vkr->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT)
|
|
||||||
messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules | EShMsgDebugInfo);
|
|
||||||
else
|
|
||||||
messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
|
||||||
|
|
||||||
const char* PreprocessedCStr = PreprocessedGLSL.c_str();
|
const char* PreprocessedCStr = PreprocessedGLSL.c_str();
|
||||||
Shader.setStrings(&PreprocessedCStr, 1);
|
Shader.setStrings(&PreprocessedCStr, 1);
|
||||||
|
EShMessages messagesParseLink = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
|
||||||
if (!Shader.parse(&Resources, 100, false, messagesParseLink))
|
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()));
|
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;
|
glslang::SpvOptions spvOptions;
|
||||||
spvOptions.disableOptimizer = false;
|
spvOptions.disableOptimizer = false;
|
||||||
spvOptions.generateDebugInfo = (vkr->IsDebugUtilsEnabled() && vkSetDebugUtilsObjectNameEXT);
|
|
||||||
spvOptions.validate = false;
|
spvOptions.validate = false;
|
||||||
spvOptions.optimizeSize = true;
|
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();
|
//auto beginTime = benchmarkTimer_start();
|
||||||
|
|
||||||
|
|
@ -403,7 +399,8 @@ void RendererShaderVk::CompileInternal(bool isRenderThread)
|
||||||
//double timeDur = benchmarkTimer_stop(beginTime);
|
//double timeDur = benchmarkTimer_stop(beginTime);
|
||||||
//forceLogRemoveMe_printf("Shader GLSL-to-SPIRV compilation took %lfms Size %08x", timeDur, spirvBuffer.size()*4);
|
//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;
|
uint64 h1, h2;
|
||||||
GenerateShaderPrecompiledCacheFilename(m_type, m_baseHash, m_auxHash, h1, h2);
|
GenerateShaderPrecompiledCacheFilename(m_type, m_baseHash, m_auxHash, h1, h2);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue