From 9b5414545a9d687c1e360899c88bee543c964195 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:02:33 +0200 Subject: [PATCH 01/13] GL: use unique_ptr for prgramBinaryCache --- .../HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp | 13 +++++-------- .../HW/Latte/Renderer/OpenGL/RendererShaderGL.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 4d7fe2b9..107fe5dc 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -276,8 +276,8 @@ void RendererShaderGL::ShaderCacheLoading_begin(uint64 cacheTitleId) { const uint32 cacheMagic = GeneratePrecompiledCacheId(); const std::string cacheFilename = fmt::format("{:016x}_gl.bin", cacheTitleId); - s_programBinaryCache = FileCache::Open(ActiveSettings::GetCachePath("shaderCache/precompiled/{}", cacheFilename), true, cacheMagic); - if (s_programBinaryCache == nullptr) + s_programBinaryCache.reset(FileCache::Open(ActiveSettings::GetCachePath("shaderCache/precompiled/{}", cacheFilename), true, cacheMagic)); + if (!s_programBinaryCache) cemuLog_log(LogType::Force, "Unable to open OpenGL precompiled cache {}", cacheFilename); } s_isLoadingShaders = true; @@ -290,13 +290,10 @@ void RendererShaderGL::ShaderCacheLoading_end() void RendererShaderGL::ShaderCacheLoading_Close() { - if(s_programBinaryCache) - { - delete s_programBinaryCache; - s_programBinaryCache = nullptr; - } + s_programBinaryCache.reset(); g_compiled_shaders_total = 0; g_compiled_shaders_async = 0; } -FileCache* RendererShaderGL::s_programBinaryCache{}; + +std::unique_ptr RendererShaderGL::s_programBinaryCache{}; diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h index 1e8784ff..9dbd0b1e 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h @@ -40,6 +40,6 @@ private: bool m_shader_attached{ false }; bool m_isCompiled{ false }; - static class FileCache* s_programBinaryCache; + static std::unique_ptr s_programBinaryCache; }; From 7d6a8b53a434747b031a14c57bbb69851db95ef4 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:15:50 +0200 Subject: [PATCH 02/13] Remove unused isRendererThread argument from PreponeCompilation --- src/Cafe/HW/Latte/Core/LatteShader.cpp | 6 +++--- src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp | 2 +- src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp | 2 +- src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h | 2 +- src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/RendererShader.h | 2 +- src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp | 8 ++++---- src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h | 4 ++-- .../HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp | 8 ++++---- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp | 6 +++--- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 91de6310..749860aa 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -848,7 +848,7 @@ LatteDecompilerShader* LatteShader_CompileSeparableVertexShader(uint64 baseHash, if (g_renderer->GetType() == RendererAPI::OpenGL) { if (vertexShader->shader) - vertexShader->shader->PreponeCompilation(true); + vertexShader->shader->PreponeCompilation(); LatteShader_FinishCompilation(vertexShader); } @@ -877,7 +877,7 @@ LatteDecompilerShader* LatteShader_CompileSeparableGeometryShader(uint64 baseHas if (g_renderer->GetType() == RendererAPI::OpenGL) { if (geometryShader->shader) - geometryShader->shader->PreponeCompilation(true); + geometryShader->shader->PreponeCompilation(); LatteShader_FinishCompilation(geometryShader); } @@ -906,7 +906,7 @@ LatteDecompilerShader* LatteShader_CompileSeparablePixelShader(uint64 baseHash, if (g_renderer->GetType() == RendererAPI::OpenGL) { if (pixelShader->shader) - pixelShader->shader->PreponeCompilation(true); + pixelShader->shader->PreponeCompilation(); LatteShader_FinishCompilation(pixelShader); } diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index 571961f4..030dfbfe 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -868,7 +868,7 @@ RendererShaderGL* rectsEmulationGS_generateShaderGL(LatteDecompilerShader* verte gsSrc.append("}\r\n"); auto glShader = new RendererShaderGL(RendererShader::ShaderType::kGeometry, 0, 0, false, false, gsSrc); - glShader->PreponeCompilation(true); + glShader->PreponeCompilation(); return glShader; } diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 107fe5dc..0486fdff 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -157,7 +157,7 @@ RendererShaderGL::~RendererShaderGL() glDeleteProgram(m_program); } -void RendererShaderGL::PreponeCompilation(bool isRenderThread) +void RendererShaderGL::PreponeCompilation() { // the logic for initiating compilation is currently in the constructor // here we only guarantee that it is finished before we return diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h index 9dbd0b1e..b82e8dba 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h @@ -10,7 +10,7 @@ public: virtual ~RendererShaderGL(); - void PreponeCompilation(bool isRenderThread) override; + void PreponeCompilation() override; bool IsCompiled() override; bool WaitForCompiled() override; diff --git a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp index a4f538a8..b760c764 100644 --- a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp +++ b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp @@ -254,8 +254,8 @@ RendererOutputShader::RendererOutputShader(const std::string& vertex_source, con m_vertex_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, vertex_source, false, false)); m_fragment_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, finalFragmentSrc, false, false)); - m_vertex_shader->PreponeCompilation(true); - m_fragment_shader->PreponeCompilation(true); + m_vertex_shader->PreponeCompilation(); + m_fragment_shader->PreponeCompilation(); if (!m_vertex_shader->WaitForCompiled()) throw std::exception(); diff --git a/src/Cafe/HW/Latte/Renderer/RendererShader.h b/src/Cafe/HW/Latte/Renderer/RendererShader.h index 2bc66769..7dd80291 100644 --- a/src/Cafe/HW/Latte/Renderer/RendererShader.h +++ b/src/Cafe/HW/Latte/Renderer/RendererShader.h @@ -14,7 +14,7 @@ public: ShaderType GetType() const { return m_type; } - virtual void PreponeCompilation(bool isRenderThread) = 0; // if shader not yet compiled, compile it synchronously (if possible) or alternatively wait for compilation. After this function IsCompiled() is guaranteed to be true + virtual void PreponeCompilation() = 0; // if shader not yet compiled, compile it synchronously (if possible) or alternatively wait for compilation. After this function IsCompiled() is guaranteed to be true virtual bool IsCompiled() = 0; virtual bool WaitForCompiled() = 0; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp index 15fd66e0..beeb745a 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp @@ -174,7 +174,7 @@ public: job->m_compilationState.setValue(RendererShaderVk::COMPILATION_STATE::COMPILING); s_compilationQueueMutex.unlock(); // compile - job->CompileInternal(false); + job->CompileInternal(); ++g_compiled_shaders_async; // mark as compiled cemu_assert_debug(job->m_compilationState.getValue() == RendererShaderVk::COMPILATION_STATE::COMPILING); @@ -264,7 +264,7 @@ void RendererShaderVk::FinishCompilation() m_glslCode.shrink_to_fit(); } -void RendererShaderVk::CompileInternal(bool isRenderThread) +void RendererShaderVk::CompileInternal() { const bool compileWithDebugInfo = ((VulkanRenderer*)g_renderer.get())->IsTracingToolEnabled(); @@ -393,7 +393,7 @@ void RendererShaderVk::CompileInternal(bool isRenderThread) FinishCompilation(); } -void RendererShaderVk::PreponeCompilation(bool isRenderThread) +void RendererShaderVk::PreponeCompilation() { ShaderVkThreadPool.s_compilationQueueMutex.lock(); bool isStillQueued = m_compilationState.hasState(COMPILATION_STATE::QUEUED); @@ -413,7 +413,7 @@ void RendererShaderVk::PreponeCompilation(bool isRenderThread) else { // compile synchronously - CompileInternal(isRenderThread); + CompileInternal(); m_compilationState.setValue(COMPILATION_STATE::DONE); } } diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h index e2e1169a..d2b37de4 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h @@ -49,12 +49,12 @@ public: s_dependencyLock.unlock(); } - void PreponeCompilation(bool isRenderThread) override; + void PreponeCompilation() override; bool IsCompiled() override; bool WaitForCompiled() override; private: - void CompileInternal(bool isRenderThread); + void CompileInternal(); void FinishCompilation(); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp index 55b2330e..ae8c82ca 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp @@ -158,7 +158,7 @@ RendererShaderVk* rectsEmulationGS_generate(LatteDecompilerShader* vertexShader, gsSrc.append("}\r\n"); auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kGeometry, 0, 0, false, false, gsSrc); - vkShader->PreponeCompilation(true); + vkShader->PreponeCompilation(); return vkShader; } @@ -964,11 +964,11 @@ bool PipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool show { // if some shader stages are not compiled yet, compile them now if (m_vkVertexShader && m_vkVertexShader->IsCompiled() == false) - m_vkVertexShader->PreponeCompilation(isRenderThread); + m_vkVertexShader->PreponeCompilation(); if (m_vkPixelShader && m_vkPixelShader->IsCompiled() == false) - m_vkPixelShader->PreponeCompilation(isRenderThread); + m_vkPixelShader->PreponeCompilation(); if (m_vkGeometryShader && m_vkGeometryShader->IsCompiled() == false) - m_vkGeometryShader->PreponeCompilation(isRenderThread); + m_vkGeometryShader->PreponeCompilation(); } if (shaderStages.empty()) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp index e3e42012..33386399 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp @@ -181,7 +181,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_vs() std::string shaderStr(vsShaderSrc); auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kVertex, 0, 0, false, false, shaderStr); - vkShader->PreponeCompilation(true); + vkShader->PreponeCompilation(); return vkShader; } @@ -199,7 +199,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_ps_colorToDepth() std::string shaderStr(psShaderSrc); auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, shaderStr); - vkShader->PreponeCompilation(true); + vkShader->PreponeCompilation(); return vkShader; } @@ -218,7 +218,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_ps_depthToColor() std::string shaderStr(psShaderSrc); auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, shaderStr); - vkShader->PreponeCompilation(true); + vkShader->PreponeCompilation(); return vkShader; } From cb47ed8499ca903b9ba6a208577a5f55d1fea221 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:38:53 +0200 Subject: [PATCH 03/13] Remove LatteShader_FinishCompilation CleanupAfterCompile is already done in LatteShader_CreateRendererShader WaitForCompiled is already done in PreponeCompilation --- src/Cafe/HW/Latte/Core/LatteShader.cpp | 19 +++---------------- src/Cafe/HW/Latte/Core/LatteShader.h | 1 - src/Cafe/HW/Latte/Core/LatteShaderCache.cpp | 5 ++++- src/Cafe/HW/Latte/Core/LatteShaderGL.cpp | 2 ++ 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 749860aa..89294a0c 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -367,19 +367,6 @@ void LatteShader_CreateRendererShader(LatteDecompilerShader* shader, bool compil LatteShader_CleanupAfterCompile(shader); } -void LatteShader_FinishCompilation(LatteDecompilerShader* shader) -{ - if (shader->hasError) - { - cemuLog_logDebug(LogType::Force, "LatteShader_finishCompilation(): Skipped because of error in shader {:x}", shader->baseHash); - return; - } - shader->shader->WaitForCompiled(); - - LatteShader_prepareSeparableUniforms(shader); - LatteShader_CleanupAfterCompile(shader); -} - void LatteSHRC_RegisterShader(LatteDecompilerShader* shader, uint64 baseHash, uint64 auxHash) { auto& cache = LatteSHRC_GetCacheByType(shader->shaderType); @@ -849,7 +836,7 @@ LatteDecompilerShader* LatteShader_CompileSeparableVertexShader(uint64 baseHash, { if (vertexShader->shader) vertexShader->shader->PreponeCompilation(); - LatteShader_FinishCompilation(vertexShader); + LatteShader_prepareSeparableUniforms(vertexShader); } LatteSHRC_RegisterShader(vertexShader, vertexShader->baseHash, vertexShader->auxHash); @@ -878,7 +865,7 @@ LatteDecompilerShader* LatteShader_CompileSeparableGeometryShader(uint64 baseHas { if (geometryShader->shader) geometryShader->shader->PreponeCompilation(); - LatteShader_FinishCompilation(geometryShader); + LatteShader_prepareSeparableUniforms(geometryShader); } LatteSHRC_RegisterShader(geometryShader, geometryShader->baseHash, geometryShader->auxHash); @@ -907,7 +894,7 @@ LatteDecompilerShader* LatteShader_CompileSeparablePixelShader(uint64 baseHash, { if (pixelShader->shader) pixelShader->shader->PreponeCompilation(); - LatteShader_FinishCompilation(pixelShader); + LatteShader_prepareSeparableUniforms(pixelShader); } LatteSHRC_RegisterShader(pixelShader, _shaderBaseHash_ps, psAuxHash); diff --git a/src/Cafe/HW/Latte/Core/LatteShader.h b/src/Cafe/HW/Latte/Core/LatteShader.h index 85d53b01..253de4e1 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.h +++ b/src/Cafe/HW/Latte/Core/LatteShader.h @@ -100,7 +100,6 @@ void LatteShader_GetDecompilerOptions(struct LatteDecompilerOptions& options, La LatteDecompilerShader* LatteShader_CreateShaderFromDecompilerOutput(LatteDecompilerOutput_t& decompilerOutput, uint64 baseHash, bool calculateAuxHash, uint64 optionalAuxHash, uint32* contextRegister); void LatteShader_CreateRendererShader(LatteDecompilerShader* shader, bool compileAsync); -void LatteShader_FinishCompilation(LatteDecompilerShader* shader); void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader); diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index 14a1f9b0..23cdd415 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -112,7 +112,10 @@ void LatteShaderCache_updateCompileQueue(sint32 maxRemainingEntries) break; auto shader = shaderCompileQueue.entry[0].shader; if (shader) - LatteShader_FinishCompilation(shader); + { + shader->shader->PreponeCompilation(); + LatteShader_prepareSeparableUniforms(shader); + } LatteShaderCache_removeFromCompileQueue(0); } } diff --git a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp index 09c484e6..c5e0a05b 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp @@ -28,6 +28,8 @@ void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) { if (g_renderer->GetType() != RendererAPI::OpenGL) return; + if(shader->hasError) + return; auto shaderGL = (RendererShaderGL*)shader->shader; // setup uniform info From 2f98a451db02403b2f632ab3dae8f49968655007 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:43:46 +0200 Subject: [PATCH 04/13] ShaderCache: theoretical loading speedup by first checking to see if a shader later in the queue is already compiled --- src/Cafe/HW/Latte/Core/LatteShaderCache.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index 23cdd415..89763c67 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -106,6 +106,18 @@ void LatteShaderCache_removeFromCompileQueue(sint32 index) */ void LatteShaderCache_updateCompileQueue(sint32 maxRemainingEntries) { + // remove any shaders that are already done + for (size_t i = 0; i < shaderCompileQueue.count; i++) + { + auto shaderEntry = shaderCompileQueue.entry[i].shader; + if (!shaderEntry) + continue; + if (shaderEntry->shader->IsCompiled()) + { + LatteShader_prepareSeparableUniforms(shaderEntry); + LatteShaderCache_removeFromCompileQueue(i); + } + } while (true) { if (shaderCompileQueue.count <= maxRemainingEntries) From c5612558feefea74a73acceefaab494e1db7a96e Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:45:02 +0200 Subject: [PATCH 05/13] GL: delay shader error check and program linking to improve parallel shader compilation --- .../Renderer/OpenGL/RendererShaderGL.cpp | 83 +++++++++---------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 0486fdff..42b0fe31 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -109,37 +109,13 @@ RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxH glShaderSource(m_shader_object, 1, &c_str, &size); glCompileShader(m_shader_object); - GLint log_length; - glGetShaderiv(m_shader_object, GL_INFO_LOG_LENGTH, &log_length); - if (log_length > 0) - { - char log[2048]{}; - GLsizei log_size; - glGetShaderInfoLog(m_shader_object, std::min(log_length, sizeof(log) - 1), &log_size, log); - cemuLog_log(LogType::Force, "Error/Warning in shader:"); - cemuLog_log(LogType::Force, log); - } - // set debug name - if (LaunchSettings::NSightModeEnabled()) + if (LaunchSettings::NSightModeEnabled()) { auto objNameStr = fmt::format("shader_{:016x}_{:016x}", m_baseHash, m_auxHash); glObjectLabel(GL_SHADER, m_shader_object, objNameStr.size(), objNameStr.c_str()); } - m_program = glCreateProgram(); - glProgramParameteri(m_program, GL_PROGRAM_SEPARABLE, GL_TRUE); - glProgramParameteri(m_program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); - glAttachShader(m_program, m_shader_object); - m_shader_attached = true; - glLinkProgram(m_program); - - storeBinary(); - - // count shader compilation - if (!s_isLoadingShaders) - ++g_compiled_shaders_total; - // we can throw away the GLSL code to conserve RAM m_glslSource.clear(); m_glslSource.shrink_to_fit(); @@ -168,47 +144,61 @@ void RendererShaderGL::PreponeCompilation() bool RendererShaderGL::IsCompiled() { - cemu_assert_debug(false); - return true; + if(m_isCompiled) + return true; + GLint isShaderComplete; + glGetShaderiv(m_shader_object, GL_COMPLETION_STATUS_ARB, &isShaderComplete); + if(isShaderComplete) + WaitForCompiled(); // since COMPLETION_STATUS == true, this should be very fast + return m_isCompiled; } bool RendererShaderGL::WaitForCompiled() { char infoLog[8 * 1024]; + GLint log_length; if (m_isCompiled) return true; + + // count shader compilation + if (!s_isLoadingShaders) + ++g_compiled_shaders_total; + // check if compilation was successful GLint compileStatus = GL_FALSE; glGetShaderiv(m_shader_object, GL_COMPILE_STATUS, &compileStatus); - if (compileStatus == 0) + if (compileStatus == GL_FALSE) { - uint32 infoLogLength, tempLength; - glGetShaderiv(m_shader_object, GL_INFO_LOG_LENGTH, (GLint *)&infoLogLength); - if (infoLogLength != 0) + glGetShaderiv(m_shader_object, GL_INFO_LOG_LENGTH, &log_length); + if (log_length > 0) { - tempLength = sizeof(infoLog) - 1; - glGetShaderInfoLog(m_shader_object, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog); - infoLog[tempLength] = '\0'; - cemuLog_log(LogType::Force, "Compile error in shader. Log:"); + glGetShaderInfoLog(m_shader_object, sizeof(infoLog), &log_length, infoLog); + cemuLog_log(LogType::Force, "Error/Warning in shader:"); cemuLog_log(LogType::Force, infoLog); } + if (m_shader_object != 0) glDeleteShader(m_shader_object); m_isCompiled = true; return false; } + + m_program = glCreateProgram(); + glProgramParameteri(m_program, GL_PROGRAM_SEPARABLE, GL_TRUE); + glProgramParameteri(m_program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + glAttachShader(m_program, m_shader_object); + m_shader_attached = true; + glLinkProgram(m_program); + // get shader binary GLint linkStatus = GL_FALSE; glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus); - if (linkStatus == 0) + if (linkStatus == GL_FALSE) { - uint32 infoLogLength, tempLength; - glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, (GLint *)&infoLogLength); - if (infoLogLength != 0) + glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, (GLint *)&log_length); + if (log_length != 0) { - tempLength = sizeof(infoLog) - 1; - glGetProgramInfoLog(m_program, std::min(infoLogLength, tempLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog); - infoLog[tempLength] = '\0'; + glGetProgramInfoLog(m_program, sizeof(infoLog), &log_length, (GLcharARB*)infoLog); cemuLog_log(LogType::Force, "Link error in shader. Log:"); cemuLog_log(LogType::Force, infoLog); } @@ -216,8 +206,13 @@ bool RendererShaderGL::WaitForCompiled() return false; } - /*glDetachShader(m_program, m_shader_object); - m_shader_attached = false;*/ + storeBinary(); + + glDetachShader(m_program, m_shader_object); + m_shader_attached = false; + glDeleteShader(m_shader_object); + m_shader_object = 0; + m_isCompiled = true; return true; } From 4a6096985a2d4a4c0fbcd511f0176859b7e3dedc Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 10:18:59 +0200 Subject: [PATCH 06/13] only use GL_COMPLETION_STATUS_ARB when the extension is used --- .../HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 42b0fe31..0864f357 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -146,9 +146,16 @@ bool RendererShaderGL::IsCompiled() { if(m_isCompiled) return true; - GLint isShaderComplete; + + if(!glMaxShaderCompilerThreadsARB) + { + WaitForCompiled(); + return true; + } + + GLint isShaderComplete = 0; glGetShaderiv(m_shader_object, GL_COMPLETION_STATUS_ARB, &isShaderComplete); - if(isShaderComplete) + if (isShaderComplete) WaitForCompiled(); // since COMPLETION_STATUS == true, this should be very fast return m_isCompiled; } From d42bea0d3ce754baf8ea3c5351216d0c22b7e37a Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 24 Jul 2025 10:55:32 +0200 Subject: [PATCH 07/13] immediately issue link call as well --- .../Renderer/OpenGL/RendererShaderGL.cpp | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 0864f357..f0cb3dde 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -116,6 +116,13 @@ RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxH glObjectLabel(GL_SHADER, m_shader_object, objNameStr.size(), objNameStr.c_str()); } + m_program = glCreateProgram(); + glProgramParameteri(m_program, GL_PROGRAM_SEPARABLE, GL_TRUE); + glProgramParameteri(m_program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); + glAttachShader(m_program, m_shader_object); + m_shader_attached = true; + glLinkProgram(m_program); + // we can throw away the GLSL code to conserve RAM m_glslSource.clear(); m_glslSource.shrink_to_fit(); @@ -153,9 +160,12 @@ bool RendererShaderGL::IsCompiled() return true; } - GLint isShaderComplete = 0; + GLint isShaderComplete = 0, isProgramComplete = 0; glGetShaderiv(m_shader_object, GL_COMPLETION_STATUS_ARB, &isShaderComplete); - if (isShaderComplete) + if(!isShaderComplete) + return false; + glGetProgramiv(m_program, GL_COMPLETION_STATUS_ARB, &isProgramComplete); + if (isProgramComplete) WaitForCompiled(); // since COMPLETION_STATUS == true, this should be very fast return m_isCompiled; } @@ -186,17 +196,13 @@ bool RendererShaderGL::WaitForCompiled() if (m_shader_object != 0) glDeleteShader(m_shader_object); + if (m_program != 0) + glDeleteProgram(m_program); + m_program = m_shader_object = 0; m_isCompiled = true; return false; } - m_program = glCreateProgram(); - glProgramParameteri(m_program, GL_PROGRAM_SEPARABLE, GL_TRUE); - glProgramParameteri(m_program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); - glAttachShader(m_program, m_shader_object); - m_shader_attached = true; - glLinkProgram(m_program); - // get shader binary GLint linkStatus = GL_FALSE; glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus); From aea9023ee9bada9e972dc384f4da94d0dac530f7 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 15:07:36 +0100 Subject: [PATCH 08/13] Avoid copying shader source string --- src/Cafe/HW/Latte/Core/LatteShader.cpp | 2 +- src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h | 2 +- src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h | 2 +- src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h | 2 +- src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp | 2 +- src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h | 2 +- src/Cafe/HW/Latte/Renderer/Renderer.h | 2 +- src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h | 2 +- .../HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp | 2 +- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp | 4 ++-- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h | 2 +- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp | 6 +++--- 18 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 89294a0c..595230d7 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -360,7 +360,7 @@ void LatteShader_CreateRendererShader(LatteDecompilerShader* shader, bool compil } // create shader - shader->shader = g_renderer->shader_create(shaderType, shader->baseHash, shader->auxHash, shaderSrc, true, shader->isCustomShader); + shader->shader = g_renderer->shader_create(shaderType, shader->baseHash, shader->auxHash, std::move(shaderSrc), true, shader->isCustomShader); if (shader->shader == nullptr) shader->hasError = true; // after renderer shader creation we can throw away any intermediate info diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp index 7ceaf74d..ceb12742 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp @@ -996,9 +996,9 @@ void MetalRenderer::buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, m_state.m_uniformBufferOffsets[GetMtlGeneralShaderType(shaderType)][bufferIndex] = offset; } -RendererShader* MetalRenderer::shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool isGameShader, bool isGfxPackShader) +RendererShader* MetalRenderer::shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool isGameShader, bool isGfxPackShader) { - return new RendererShaderMtl(this, type, baseHash, auxHash, isGameShader, isGfxPackShader, source); + return new RendererShaderMtl(this, type, baseHash, auxHash, isGameShader, isGfxPackShader, std::move(source)); } void MetalRenderer::streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBufferOffset, uint32 rangeAddr, uint32 rangeSize) diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h index e905b834..7d4d9d80 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h @@ -241,7 +241,7 @@ public: void buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, uint32 bufferIndex, uint32 offset, uint32 size) override; // shader - RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool compileAsync, bool isGfxPackSource) override; + RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool compileAsync, bool isGfxPackSource) override; // streamout void streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBufferOffset, uint32 rangeAddr, uint32 rangeSize) override; diff --git a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp index f00af85a..a6f9d5aa 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp @@ -213,8 +213,8 @@ void RendererShaderMtl::Shutdown() shaderMtlThreadPool.StopThreads(); } -RendererShaderMtl::RendererShaderMtl(MetalRenderer* mtlRenderer, ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& mslCode) - : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_mtlr{mtlRenderer}, m_mslCode{mslCode} +RendererShaderMtl::RendererShaderMtl(MetalRenderer* mtlRenderer, ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& mslCode) + : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_mtlr{mtlRenderer}, m_mslCode{std::move(mslCode)} { // start async compilation shaderMtlThreadPool.s_compilationQueueMutex.lock(); diff --git a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h index 1a0c33a9..64b42fd0 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h +++ b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h @@ -28,7 +28,7 @@ public: static void Initialize(); static void Shutdown(); - RendererShaderMtl(class MetalRenderer* mtlRenderer, ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& mslCode); + RendererShaderMtl(class MetalRenderer* mtlRenderer, ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& mslCode); virtual ~RendererShaderMtl(); MTL::Function* GetFunction() const diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp index a4d1966d..c9308fe4 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp @@ -1306,9 +1306,9 @@ void OpenGLRenderer::attributeStream_unbindVertexBuffer() glBindBuffer(GL_ARRAY_BUFFER, 0); } -RendererShader* OpenGLRenderer::shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool isGameShader, bool isGfxPackShader) +RendererShader* OpenGLRenderer::shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool isGameShader, bool isGfxPackShader) { - return new RendererShaderGL(type, baseHash, auxHash, isGameShader, isGfxPackShader, source); + return new RendererShaderGL(type, baseHash, auxHash, isGameShader, isGfxPackShader, std::move(source)); } void OpenGLRenderer::shader_bind(RendererShader* shader) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h index 5b9ccd41..159657ab 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h @@ -145,7 +145,7 @@ public: void uniformData_update(); // shader - RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool isGameShader, bool isGfxPackShader) override; + RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool isGameShader, bool isGfxPackShader) override; void shader_bind(RendererShader* shader); void shader_unbind(RendererShader::ShaderType shaderType); diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index 030dfbfe..fb524be1 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -867,7 +867,7 @@ RendererShaderGL* rectsEmulationGS_generateShaderGL(LatteDecompilerShader* verte gsSrc.append("}\r\n"); - auto glShader = new RendererShaderGL(RendererShader::ShaderType::kGeometry, 0, 0, false, false, gsSrc); + auto glShader = new RendererShaderGL(RendererShader::ShaderType::kGeometry, 0, 0, false, false, std::move(gsSrc)); glShader->PreponeCompilation(); return glShader; diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index f0cb3dde..fa343c5c 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -73,8 +73,8 @@ void RendererShaderGL::storeBinary() } } -RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& glslSource) - : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_glslSource(glslSource) +RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& glslSource) + : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_glslSource(std::move(glslSource)) { GLenum glShaderType; switch (type) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h index b82e8dba..31f6b827 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h @@ -6,7 +6,7 @@ class RendererShaderGL : public RendererShader { public: - RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& glslSource); + RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& glslSource); virtual ~RendererShaderGL(); diff --git a/src/Cafe/HW/Latte/Renderer/Renderer.h b/src/Cafe/HW/Latte/Renderer/Renderer.h index 01a6d3b2..e2060f4d 100644 --- a/src/Cafe/HW/Latte/Renderer/Renderer.h +++ b/src/Cafe/HW/Latte/Renderer/Renderer.h @@ -131,7 +131,7 @@ public: virtual void buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, uint32 bufferIndex, uint32 offset, uint32 size) = 0; // shader - virtual RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool compileAsync, bool isGfxPackSource) = 0; + virtual RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool compileAsync, bool isGfxPackSource) = 0; // streamout virtual void streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBufferOffset, uint32 rangeAddr, uint32 rangeSize) = 0; diff --git a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp index b760c764..293d3174 100644 --- a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp +++ b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp @@ -251,8 +251,8 @@ RendererOutputShader::RendererOutputShader(const std::string& vertex_source, con else finalFragmentSrc = PrependFragmentPreamble(fragment_source); - m_vertex_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, vertex_source, false, false)); - m_fragment_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, finalFragmentSrc, false, false)); + m_vertex_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, std::string(vertex_source), false, false)); + m_fragment_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::string(finalFragmentSrc), false, false)); m_vertex_shader->PreponeCompilation(); m_fragment_shader->PreponeCompilation(); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp index beeb745a..73cf86b3 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp @@ -195,8 +195,8 @@ private: std::atomic m_threadsActive; }ShaderVkThreadPool; -RendererShaderVk::RendererShaderVk(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& glslCode) - : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_glslCode(glslCode) +RendererShaderVk::RendererShaderVk(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& glslCode) + : RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_glslCode(std::move(glslCode)) { // start async compilation ShaderVkThreadPool.s_compilationQueueMutex.lock(); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h index d2b37de4..4bd9c8f1 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h @@ -25,7 +25,7 @@ public: static void ShaderCacheLoading_end(); static void ShaderCacheLoading_Close(); - RendererShaderVk(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& glslCode); + RendererShaderVk(ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, std::string&& glslCode); virtual ~RendererShaderVk(); static void Init(); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp index ae8c82ca..73812383 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp @@ -157,7 +157,7 @@ RendererShaderVk* rectsEmulationGS_generate(LatteDecompilerShader* vertexShader, gsSrc.append("}\r\n"); - auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kGeometry, 0, 0, false, false, gsSrc); + auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kGeometry, 0, 0, false, false, std::move(gsSrc)); vkShader->PreponeCompilation(); return vkShader; } diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index d70cb065..0203e97e 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -1293,9 +1293,9 @@ VkDeviceCreateInfo VulkanRenderer::CreateDeviceCreateInfo(const std::vector buffer_genStrideWorkaroundVertexBuffer(MPTR buffer, uint32 size, uint32 oldStride); void buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, uint32 bufferIndex, uint32 offset, uint32 size) override; - RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool isGameShader, bool isGfxPackShader) override; + RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, std::string&& source, bool isGameShader, bool isGfxPackShader) override; IndexAllocation indexData_reserveIndexMemory(uint32 size) override; void indexData_releaseIndexMemory(IndexAllocation& allocation) override; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp index 33386399..f286f19f 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp @@ -180,7 +180,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_vs() "}\r\n"; std::string shaderStr(vsShaderSrc); - auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kVertex, 0, 0, false, false, shaderStr); + auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kVertex, 0, 0, false, false, std::move(shaderStr)); vkShader->PreponeCompilation(); return vkShader; } @@ -198,7 +198,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_ps_colorToDepth() "}\r\n"; std::string shaderStr(psShaderSrc); - auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, shaderStr); + auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, std::move(shaderStr)); vkShader->PreponeCompilation(); return vkShader; } @@ -217,7 +217,7 @@ RendererShaderVk* _vkGenSurfaceCopyShader_ps_depthToColor() "}\r\n"; std::string shaderStr(psShaderSrc); - auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, shaderStr); + auto vkShader = new RendererShaderVk(RendererShader::ShaderType::kFragment, 0, 0, false, false, std::move(shaderStr)); vkShader->PreponeCompilation(); return vkShader; } From edf6edde177b050747f3679bec987fadffea1527 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 18:14:02 +0100 Subject: [PATCH 09/13] Defer waiting for shader to be compiled to point of use --- src/Cafe/HW/Latte/Core/LatteShader.cpp | 27 ++++------------- src/Cafe/HW/Latte/Core/LatteShaderCache.cpp | 4 --- src/Cafe/HW/Latte/Core/LatteShaderGL.cpp | 2 -- .../Renderer/OpenGL/OpenGLRendererCore.cpp | 17 +++++++++-- .../Renderer/OpenGL/RendererShaderGL.cpp | 29 +++++++++++++++---- .../Latte/Renderer/OpenGL/RendererShaderGL.h | 4 +++ 6 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 595230d7..54c5acc1 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -14,6 +14,7 @@ #include "util/helpers/StringParser.h" #include "config/ActiveSettings.h" #include "Cafe/GameProfile/GameProfile.h" +#include "HW/Latte/Renderer/OpenGL/RendererShaderGL.h" #include "util/containers/flat_hash_map.hpp" #if ENABLE_METAL #include "Cafe/HW/Latte/Renderer/Metal/LatteToMtl.h" @@ -363,6 +364,11 @@ void LatteShader_CreateRendererShader(LatteDecompilerShader* shader, bool compil shader->shader = g_renderer->shader_create(shaderType, shader->baseHash, shader->auxHash, std::move(shaderSrc), true, shader->isCustomShader); if (shader->shader == nullptr) shader->hasError = true; + if (g_renderer->GetType() == RendererAPI::OpenGL) + { + RendererShaderGL* shaderGL = static_cast(shader->shader); + shaderGL->SetDecompilerShader(shader); + } // after renderer shader creation we can throw away any intermediate info LatteShader_CleanupAfterCompile(shader); } @@ -832,13 +838,6 @@ LatteDecompilerShader* LatteShader_CompileSeparableVertexShader(uint64 baseHash, LatteShader_CreateRendererShader(vertexShader, false); performanceMonitor.numCompiledVS++; - if (g_renderer->GetType() == RendererAPI::OpenGL) - { - if (vertexShader->shader) - vertexShader->shader->PreponeCompilation(); - LatteShader_prepareSeparableUniforms(vertexShader); - } - LatteSHRC_RegisterShader(vertexShader, vertexShader->baseHash, vertexShader->auxHash); return vertexShader; } @@ -861,13 +860,6 @@ LatteDecompilerShader* LatteShader_CompileSeparableGeometryShader(uint64 baseHas LatteShader_CreateRendererShader(geometryShader, false); performanceMonitor.numCompiledGS++; - if (g_renderer->GetType() == RendererAPI::OpenGL) - { - if (geometryShader->shader) - geometryShader->shader->PreponeCompilation(); - LatteShader_prepareSeparableUniforms(geometryShader); - } - LatteSHRC_RegisterShader(geometryShader, geometryShader->baseHash, geometryShader->auxHash); return geometryShader; } @@ -890,13 +882,6 @@ LatteDecompilerShader* LatteShader_CompileSeparablePixelShader(uint64 baseHash, LatteShaderCache_writeSeparablePixelShader(_shaderBaseHash_ps, psAuxHash, pixelShaderPtr, pixelShaderSize, LatteGPUState.contextRegister, usesGeometryShader); } - if (g_renderer->GetType() == RendererAPI::OpenGL) - { - if (pixelShader->shader) - pixelShader->shader->PreponeCompilation(); - LatteShader_prepareSeparableUniforms(pixelShader); - } - LatteSHRC_RegisterShader(pixelShader, _shaderBaseHash_ps, psAuxHash); return pixelShader; } diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index 89763c67..305e3011 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -114,7 +114,6 @@ void LatteShaderCache_updateCompileQueue(sint32 maxRemainingEntries) continue; if (shaderEntry->shader->IsCompiled()) { - LatteShader_prepareSeparableUniforms(shaderEntry); LatteShaderCache_removeFromCompileQueue(i); } } @@ -124,10 +123,7 @@ void LatteShaderCache_updateCompileQueue(sint32 maxRemainingEntries) break; auto shader = shaderCompileQueue.entry[0].shader; if (shader) - { shader->shader->PreponeCompilation(); - LatteShader_prepareSeparableUniforms(shader); - } LatteShaderCache_removeFromCompileQueue(0); } } diff --git a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp index c5e0a05b..7a22539a 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp @@ -26,8 +26,6 @@ bool gxShader_checkIfSuccessfullyLinked(GLuint glProgram) void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) { - if (g_renderer->GetType() != RendererAPI::OpenGL) - return; if(shader->hasError) return; diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index fb524be1..821252d3 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -912,9 +912,20 @@ void OpenGLRenderer::draw_genericDrawHandler(uint32 baseVertex, uint32 baseInsta { beginPerfMonProfiling(performanceMonitor.gpuTime_dcStageShaderAndUniformMgr); LatteSHRC_UpdateActiveShaders(); - LatteDecompilerShader* vs = (LatteDecompilerShader*)LatteSHRC_GetActiveVertexShader(); - LatteDecompilerShader* gs = (LatteDecompilerShader*)LatteSHRC_GetActiveGeometryShader(); - LatteDecompilerShader* ps = (LatteDecompilerShader*)LatteSHRC_GetActivePixelShader(); + LatteDecompilerShader* vs = LatteSHRC_GetActiveVertexShader(); + LatteDecompilerShader* gs = LatteSHRC_GetActiveGeometryShader(); + LatteDecompilerShader* ps = LatteSHRC_GetActivePixelShader(); + + for (auto& i : {vs, gs, ps}) + { + if (!i) + continue; + if (!i->shader->IsCompiled()) + { + i->shader->WaitForCompiled(); + } + } + if (vs) shader_bind(vs->shader); else diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index fa343c5c..31034222 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" #include "Cemu/FileCache/FileCache.h" +#include "HW/Latte/Core/LatteShader.h" #include "config/ActiveSettings.h" #include "config/LaunchSettings.h" @@ -42,7 +43,7 @@ bool RendererShaderGL::loadBinary() m_program = 0; return false; } - m_isCompiled = true; + m_binaryLoaded = true; return true; } @@ -154,7 +155,7 @@ bool RendererShaderGL::IsCompiled() if(m_isCompiled) return true; - if(!glMaxShaderCompilerThreadsARB) + if(!glMaxShaderCompilerThreadsARB || m_binaryLoaded) { WaitForCompiled(); return true; @@ -172,10 +173,17 @@ bool RendererShaderGL::IsCompiled() bool RendererShaderGL::WaitForCompiled() { - char infoLog[8 * 1024]; - GLint log_length; if (m_isCompiled) return true; + if (m_binaryLoaded) + { + LatteShader_prepareSeparableUniforms(m_decompilerShader); + m_isCompiled = true; + return true; + } + + char infoLog[8 * 1024]; + GLint log_length; // count shader compilation if (!s_isLoadingShaders) @@ -219,14 +227,19 @@ bool RendererShaderGL::WaitForCompiled() return false; } - storeBinary(); - glDetachShader(m_program, m_shader_object); m_shader_attached = false; glDeleteShader(m_shader_object); m_shader_object = 0; + storeBinary(); + m_isCompiled = true; + if (m_decompilerShader) + { + LatteShader_prepareSeparableUniforms(m_decompilerShader); + } + return true; } @@ -254,6 +267,10 @@ void RendererShaderGL::SetUniform4iv(sint32 location, void* data, sint32 count) { glProgramUniform4iv(m_program, location, count, (const GLint*)data); } +void RendererShaderGL::SetDecompilerShader(LatteDecompilerShader* decompilerShader) +{ + m_decompilerShader = decompilerShader; +} void RendererShaderGL::ShaderCacheLoading_begin(uint64 cacheTitleId) { diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h index 31f6b827..2d4f986b 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h @@ -24,6 +24,8 @@ public: void SetUniform2fv(sint32 location, void* data, sint32 count); void SetUniform4iv(sint32 location, void* data, sint32 count); + void SetDecompilerShader(class LatteDecompilerShader* decompilerShader); + static void ShaderCacheLoading_begin(uint64 cacheTitleId); static void ShaderCacheLoading_end(); static void ShaderCacheLoading_Close(); @@ -31,6 +33,7 @@ public: private: GLuint m_program; GLuint m_shader_object; + LatteDecompilerShader* m_decompilerShader = nullptr; bool loadBinary(); void storeBinary(); @@ -39,6 +42,7 @@ private: bool m_shader_attached{ false }; bool m_isCompiled{ false }; + bool m_binaryLoaded { false }; static std::unique_ptr s_programBinaryCache; }; From ce6ac0451d4eec519e63f7096de488f3d27e4552 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 19:28:56 +0100 Subject: [PATCH 10/13] Attempt to fix compiling metal --- CMakeLists.txt | 4 ++-- .../HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp | 10 +++++----- src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp | 2 +- src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a00879fe..d2f23696 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,8 +73,8 @@ add_definitions(-DEMULATOR_VERSION_PATCH=${EMULATOR_VERSION_PATCH}) set_property(GLOBAL PROPERTY USE_FOLDERS ON) # enable link time optimization for release builds -set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON) -set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON) +#set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)# +#set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON)# if (MSVC) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT CemuBin) diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp index 6193ab10..737554ed 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalPipelineCompiler.cpp @@ -176,8 +176,8 @@ static RendererShaderMtl* rectsEmulationGS_generate(MetalRenderer* metalRenderer gsSrc.append("}\r\n"); - auto mtlShader = new RendererShaderMtl(metalRenderer, RendererShader::ShaderType::kGeometry, 0, 0, false, false, gsSrc); - mtlShader->PreponeCompilation(true); + auto mtlShader = new RendererShaderMtl(metalRenderer, RendererShader::ShaderType::kGeometry, 0, 0, false, false, std::move(gsSrc)); + mtlShader->PreponeCompilation(); return mtlShader; } @@ -321,11 +321,11 @@ bool MetalPipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool { // if some shader stages are not compiled yet, compile them now if (m_vertexShaderMtl && !m_vertexShaderMtl->IsCompiled()) - m_vertexShaderMtl->PreponeCompilation(isRenderThread); + m_vertexShaderMtl->PreponeCompilation(); if (m_geometryShaderMtl && !m_geometryShaderMtl->IsCompiled()) - m_geometryShaderMtl->PreponeCompilation(isRenderThread); + m_geometryShaderMtl->PreponeCompilation(); if (m_pixelShaderMtl && !m_pixelShaderMtl->IsCompiled()) - m_pixelShaderMtl->PreponeCompilation(isRenderThread); + m_pixelShaderMtl->PreponeCompilation(); } else { diff --git a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp index a6f9d5aa..bf94bddc 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.cpp @@ -231,7 +231,7 @@ RendererShaderMtl::~RendererShaderMtl() m_function->release(); } -void RendererShaderMtl::PreponeCompilation(bool isRenderThread) +void RendererShaderMtl::PreponeCompilation() { shaderMtlThreadPool.s_compilationQueueMutex.lock(); bool isStillQueued = m_compilationState.hasState(COMPILATION_STATE::QUEUED); diff --git a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h index 64b42fd0..0246223a 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h +++ b/src/Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h @@ -36,7 +36,7 @@ public: return m_function; } - void PreponeCompilation(bool isRenderThread) override; + void PreponeCompilation() override; bool IsCompiled() override; bool WaitForCompiled() override; From 6c9d031d98002a0886bc564cfba0ef42d6c5e0c4 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 19:48:44 +0100 Subject: [PATCH 11/13] Remove LatteDraw header and deprecated shader compilation code --- src/Cafe/CMakeLists.txt | 3 +- src/Cafe/HW/Latte/Core/FetchShader.cpp | 1 - src/Cafe/HW/Latte/Core/LatteBufferData.cpp | 1 - .../HW/Latte/Core/LatteCommandProcessor.cpp | 1 - .../HW/Latte/Core/LatteDefaultShaders.cpp | 42 ++----- src/Cafe/HW/Latte/Core/LatteDefaultShaders.h | 1 + src/Cafe/HW/Latte/Core/LatteDraw.h | 4 - src/Cafe/HW/Latte/Core/LatteQuery.cpp | 1 - src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp | 2 +- src/Cafe/HW/Latte/Core/LatteShaderGL.cpp | 119 ------------------ src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp | 1 - src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp | 1 - src/Cafe/HW/Latte/Core/LatteTextureCache.cpp | 1 - .../HW/Latte/Core/LatteTextureReadback.cpp | 1 - src/Cafe/HW/Latte/Core/LatteThread.cpp | 1 - .../LatteDecompiler.cpp | 1 - .../LatteDecompilerEmitGLSL.cpp | 1 - .../LatteDecompilerEmitGLSLAttrDecoder.cpp | 1 - .../LatteDecompilerEmitMSL.cpp | 1 - .../LatteDecompilerEmitMSLAttrDecoder.cpp | 1 - .../Latte/Renderer/OpenGL/OpenGLRenderer.cpp | 1 - .../Renderer/OpenGL/OpenGLRendererCore.cpp | 1 - .../Renderer/OpenGL/OpenGLSurfaceCopy.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Command.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_ContextState.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Draw.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Memory.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Surface.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_Texture.cpp | 1 - src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp | 1 - src/Cafe/OS/libs/swkbd/swkbd.cpp | 1 - 33 files changed, 16 insertions(+), 182 deletions(-) delete mode 100644 src/Cafe/HW/Latte/Core/LatteDraw.h diff --git a/src/Cafe/CMakeLists.txt b/src/Cafe/CMakeLists.txt index 78a8cce0..eb1db4f6 100644 --- a/src/Cafe/CMakeLists.txt +++ b/src/Cafe/CMakeLists.txt @@ -108,8 +108,7 @@ add_library(CemuCafe HW/Latte/Core/LatteConst.h HW/Latte/Core/LatteDefaultShaders.cpp HW/Latte/Core/LatteDefaultShaders.h - HW/Latte/Core/LatteDraw.h - HW/Latte/Core/LatteGSCopyShaderParser.cpp + HW/Latte/Core/LatteGSCopyShaderParser.cpp HW/Latte/Core/Latte.h HW/Latte/Core/LatteIndices.cpp HW/Latte/Core/LatteIndices.h diff --git a/src/Cafe/HW/Latte/Core/FetchShader.cpp b/src/Cafe/HW/Latte/Core/FetchShader.cpp index 7d724e13..2e229c2a 100644 --- a/src/Cafe/HW/Latte/Core/FetchShader.cpp +++ b/src/Cafe/HW/Latte/Core/FetchShader.cpp @@ -3,7 +3,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInstructions.h" #include "Cafe/HW/Latte/Core/FetchShader.h" diff --git a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp index 7620e6a7..2ac37eb8 100644 --- a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp +++ b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" diff --git a/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp b/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp index 963c49f7..509911f3 100644 --- a/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp +++ b/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp @@ -4,7 +4,6 @@ #include "Cafe/OS/libs/gx2/GX2_Event.h" // for notification callbacks #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp index 7c590dbb..1fc76ebf 100644 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp +++ b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp @@ -1,28 +1,13 @@ #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" +#include "Cafe/HW/Latte/Renderer/Renderer.h" +#include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" #include "util/helpers/StringBuf.h" LatteDefaultShader_t* _copyShader_depthToColor; LatteDefaultShader_t* _copyShader_colorToDepth; -void LatteDefaultShader_pixelCopyShader_generateVSBody(StringBuf* vs) -{ - vs->add("#version 420\r\n"); - vs->add("out vec2 passUV;\r\n"); - vs->add("uniform vec4 uf_vertexOffsets[4];\r\n"); - vs->add("\r\n"); - vs->add("void main(){\r\n"); - vs->add("int vID = gl_VertexID;\r\n"); - vs->add("passUV = uf_vertexOffsets[vID].zw;\r\n"); - vs->add("gl_Position = vec4(uf_vertexOffsets[vID].xy, 0.0, 1.0);\r\n"); - vs->add("}\r\n"); -} - -GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS); -GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source); - LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() { if (_copyShader_depthToColor != 0) @@ -31,9 +16,6 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - StringBuf fCStr_vertexShader(1024 * 16); - LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - StringBuf fCStr_defaultFragShader(1024 * 16); fCStr_defaultFragShader.add("#version 420\r\n"); fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); @@ -44,11 +26,14 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() fCStr_defaultFragShader.add("colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0);\r\n"); fCStr_defaultFragShader.add("}\r\n"); - defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); + RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::string{fCStr_defaultFragShader.c_str()}, false, false)); + fragShader->PreponeCompilation(); + + defaultShader->glProgamId = fragShader->GetProgram(); catchOpenGLError(); - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = fragShader->GetUniformLocation("textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = fragShader->GetUniformLocation("uf_vertexOffsets"); _copyShader_depthToColor = defaultShader; catchOpenGLError(); @@ -63,9 +48,6 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth() LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - StringBuf fCStr_vertexShader(1024 * 16); - LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - StringBuf fCStr_defaultFragShader(1024 * 16); fCStr_defaultFragShader.add("#version 420\r\n"); fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); @@ -77,9 +59,11 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth() fCStr_defaultFragShader.add("}\r\n"); - defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); + RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::string{fCStr_defaultFragShader.c_str()}, false, false)); + fragShader->PreponeCompilation(); + defaultShader->glProgamId = fragShader->GetProgram(); + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = fragShader->GetUniformLocation("textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = fragShader->GetUniformLocation("uf_vertexOffsets"); _copyShader_colorToDepth = defaultShader; catchOpenGLError(); diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h index 3776a3d2..d9324555 100644 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h +++ b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h @@ -1,4 +1,5 @@ +#include "Common/GLInclude/GLInclude.h" typedef struct { GLuint glProgamId; diff --git a/src/Cafe/HW/Latte/Core/LatteDraw.h b/src/Cafe/HW/Latte/Core/LatteDraw.h deleted file mode 100644 index 89c34dc0..00000000 --- a/src/Cafe/HW/Latte/Core/LatteDraw.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "Common/GLInclude/GLInclude.h" - -void LatteDraw_cleanupAfterFrame(); \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteQuery.cpp b/src/Cafe/HW/Latte/Core/LatteQuery.cpp index a8329e63..11e12baf 100644 --- a/src/Cafe/HW/Latte/Core/LatteQuery.cpp +++ b/src/Cafe/HW/Latte/Core/LatteQuery.cpp @@ -1,6 +1,5 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteQueryObject.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp b/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp index 1bdbc4bb..9d83b226 100644 --- a/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp +++ b/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteOverlay.h" #include "Cafe/HW/Latte/Core/LatteBufferCache.h" @@ -681,6 +680,7 @@ void LatteRenderTarget_trackUpdates() } } +void LatteDraw_cleanupAfterFrame(); void LatteRenderTarget_itHLESwapScanBuffer() { performanceMonitor.cycle[performanceMonitor.cycleIndex].frameCounter++; diff --git a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp index 7a22539a..f7cddb9a 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp @@ -1,28 +1,9 @@ #include "Common/GLInclude/GLInclude.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h" #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" -#include "util/helpers/StringBuf.h" -bool gxShader_checkIfSuccessfullyLinked(GLuint glProgram) -{ - int status = -1; - glGetProgramiv(glProgram, GL_LINK_STATUS, &status); - if( status == GL_TRUE ) - return true; - // in debug mode, get and print shader error log - char infoLog[48*1024]; - uint32 infoLogLength, tempLength; - glGetProgramiv(glProgram, GL_INFO_LOG_LENGTH, (GLint *)&infoLogLength); - tempLength = sizeof(infoLog)-1; - glGetProgramInfoLog(glProgram, std::min(tempLength, infoLogLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog); - infoLog[tempLength] = '\0'; - cemuLog_log(LogType::Force, "Link error in raw shader"); - cemuLog_log(LogType::Force, infoLog); - return false; -} void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) { @@ -66,103 +47,3 @@ void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) } } } -GLuint gpu7ShaderGLDepr_compileShader(const std::string& source, uint32_t type) -{ - cemu_assert(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER); - const GLuint shader_object = glCreateShader(type); - - const char *c_str = source.c_str(); - const GLint size = (GLint)source.size(); - glShaderSource(shader_object, 1, &c_str, &size); - glCompileShader(shader_object); - - GLint log_length; - glGetShaderiv(shader_object, GL_INFO_LOG_LENGTH, &log_length); - if (log_length > 0) - { - char log[2048]{}; - GLsizei log_size; - glGetShaderInfoLog(shader_object, std::min(log_length, (GLint)sizeof(log) - 1), &log_size, log); - cemuLog_log(LogType::Force, "Error/Warning in vertex shader:"); - cemuLog_log(LogType::Force, log); - } - - return shader_object; -} -GLuint gpu7ShaderGLDepr_compileVertexShader(const std::string& source) -{ - return gpu7ShaderGLDepr_compileShader(source, GL_VERTEX_SHADER); -} - -GLuint gpu7ShaderGLDepr_compileFragmentShader(const std::string& source) -{ - return gpu7ShaderGLDepr_compileShader(source, GL_FRAGMENT_SHADER); -} - -GLuint gpu7ShaderGLDepr_compileVertexShader(const char* shaderSource, sint32 shaderSourceLength) -{ - uint32 shaderObject = glCreateShader(GL_VERTEX_SHADER); - GLchar* srcPtr = (GLchar*)shaderSource; - GLint srcLen = shaderSourceLength; - glShaderSource(shaderObject, 1, &srcPtr, &srcLen); - glCompileShader(shaderObject); - uint32 shaderLogLengthInfo, shaderLogLen; - glGetShaderiv(shaderObject, GL_INFO_LOG_LENGTH, (GLint *)&shaderLogLengthInfo); - if (shaderLogLengthInfo > 0) - { - char messageLog[2048]{}; - glGetShaderInfoLog(shaderObject, std::min(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog); - cemuLog_log(LogType::Force, "Error/Warning in vertex shader:"); - cemuLog_log(LogType::Force, messageLog); - } - return shaderObject; -} - -GLuint gpu7ShaderGLDepr_compileFragmentShader(const char* shaderSource, sint32 shaderSourceLength) -{ - uint32 shaderObject = glCreateShader(GL_FRAGMENT_SHADER); - GLchar* srcPtr = (GLchar*)shaderSource; - GLint srcLen = shaderSourceLength; - glShaderSource(shaderObject, 1, &srcPtr, &srcLen); - glCompileShader(shaderObject); - uint32 shaderLogLengthInfo, shaderLogLen; - char messageLog[2048]; - glGetShaderiv(shaderObject, GL_INFO_LOG_LENGTH, (GLint *)&shaderLogLengthInfo); - if (shaderLogLengthInfo > 0) - { - memset(messageLog, 0, sizeof(messageLog)); - glGetShaderInfoLog(shaderObject, std::min(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog); - cemuLog_log(LogType::Force, "Error/Warning in fragment shader:"); - cemuLog_log(LogType::Force, messageLog); - } - return shaderObject; -} - -GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS) -{ - GLuint glShaderProgram = glCreateProgram(); - GLuint vertexShader = gpu7ShaderGLDepr_compileVertexShader(strSourceVS->c_str(), strSourceVS->getLen()); - glAttachShader(glShaderProgram, vertexShader); - GLuint fragmentShader = gpu7ShaderGLDepr_compileFragmentShader(strSourceFS->c_str(), strSourceFS->getLen()); - glAttachShader(glShaderProgram, fragmentShader); - glLinkProgram(glShaderProgram); - if( gxShader_checkIfSuccessfullyLinked(glShaderProgram) == false ) - { - return 0; - } - return glShaderProgram; -} - -GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source) -{ - const GLuint programm = glCreateProgram(); - - auto vertex_shader = std::async(std::launch::deferred, gpu7ShaderGLDepr_compileShader, vertex_source, GL_VERTEX_SHADER); - auto fragment_shader = std::async(std::launch::deferred, gpu7ShaderGLDepr_compileShader, fragment_source, GL_FRAGMENT_SHADER); - - glAttachShader(programm, vertex_shader.get()); - glAttachShader(programm, fragment_shader.get()); - - glLinkProgram(programm); - return gxShader_checkIfSuccessfullyLinked(programm) ? programm : 0; -} diff --git a/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp b/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp index ccea31b8..21e92294 100644 --- a/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp +++ b/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/Core/LatteConst.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/GameProfile/GameProfile.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" diff --git a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp index 45be6843..c836ba3c 100644 --- a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp @@ -1,5 +1,4 @@ #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" diff --git a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp index 3145e90e..ea80e598 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp @@ -1,5 +1,4 @@ #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Common/cpu_features.h" diff --git a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp index 8df5dcea..07b5299a 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp @@ -1,5 +1,4 @@ #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Common/GLInclude/GLInclude.h" diff --git a/src/Cafe/HW/Latte/Core/LatteThread.cpp b/src/Cafe/HW/Latte/Core/LatteThread.cpp index 743ab679..f1c85704 100644 --- a/src/Cafe/HW/Latte/Core/LatteThread.cpp +++ b/src/Cafe/HW/Latte/Core/LatteThread.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/GameProfile/GameProfile.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp index 13188743..e3bf4230 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp index e7ebcf3a..f7863af2 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp @@ -3,7 +3,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp index 76d76322..e2431610 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp index cb512308..6df7d3fc 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp @@ -3,7 +3,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp index 9ee5c31f..8ca4c695 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp index c9308fe4..ee9a0358 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp @@ -2,7 +2,6 @@ #include "WindowSystem.h" #include "Cafe/HW/Latte/Core/LatteRingBuffer.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteOverlay.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureGL.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index 821252d3..f59388ca 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -1,7 +1,6 @@ #include "Common/GLInclude/GLInclude.h" #include "Cafe/HW/Latte/Core/LatteRingBuffer.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteSoftware.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp index d578b842..ee9c67fa 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp @@ -6,7 +6,6 @@ #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Cafe/HW/Latte/Core/LatteShader.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Command.cpp b/src/Cafe/OS/libs/gx2/GX2_Command.cpp index d12bf210..7f8f0bd0 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Command.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Command.cpp @@ -1,5 +1,4 @@ #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/OS/common/OSCommon.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/OS/libs/coreinit/coreinit.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp b/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp index fb631a11..3da87aaf 100644 --- a/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Draw.cpp b/src/Cafe/OS/libs/gx2/GX2_Draw.cpp index 3a5fff5b..d7774dfe 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Draw.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Draw.cpp @@ -1,7 +1,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Memory.cpp b/src/Cafe/OS/libs/gx2/GX2_Memory.cpp index d5054784..e3d750db 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Memory.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Memory.cpp @@ -3,7 +3,6 @@ #include "GX2.h" #include "GX2_Resource.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" // default GX2 allocator (not the same as the GX2R allocator, but GX2R uses this allocator by default) MPTR gx2Mem_defaultAlloc = MPTR_NULL; diff --git a/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp b/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp index 4ef37b18..095e13e3 100644 --- a/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp @@ -1,7 +1,6 @@ #include "Cafe/OS/common/OSCommon.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Surface.cpp b/src/Cafe/OS/libs/gx2/GX2_Surface.cpp index 1d858e18..3bfcda23 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Surface.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Surface.cpp @@ -3,7 +3,6 @@ #include "GX2_Surface.h" #include "GX2_Resource.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp b/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp index f52f38e7..da177795 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" #include "util/highresolutiontimer/HighResolutionTimer.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Texture.cpp b/src/Cafe/OS/libs/gx2/GX2_Texture.cpp index d986e307..26b8fd18 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Texture.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Texture.cpp @@ -4,7 +4,6 @@ #include "GX2_Texture.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp b/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp index d91a8529..78873983 100644 --- a/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp @@ -1,7 +1,6 @@ #include "Cafe/OS/common/OSCommon.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/swkbd/swkbd.cpp b/src/Cafe/OS/libs/swkbd/swkbd.cpp index 4e82783a..b077bd8b 100644 --- a/src/Cafe/OS/libs/swkbd/swkbd.cpp +++ b/src/Cafe/OS/libs/swkbd/swkbd.cpp @@ -2,7 +2,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" -#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" From 2e87847eebaaffaff9790df2f97a12042c40a3ca Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 20:05:07 +0100 Subject: [PATCH 12/13] C++-ify GL default shader code --- .../HW/Latte/Core/LatteDefaultShaders.cpp | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp index 1fc76ebf..8ec3fcef 100644 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp +++ b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp @@ -3,7 +3,6 @@ #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" -#include "util/helpers/StringBuf.h" LatteDefaultShader_t* _copyShader_depthToColor; LatteDefaultShader_t* _copyShader_colorToDepth; @@ -13,20 +12,20 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() if (_copyShader_depthToColor != 0) return _copyShader_depthToColor; catchOpenGLError(); - LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); - memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); + LatteDefaultShader_t* defaultShader = new LatteDefaultShader_t{}; - StringBuf fCStr_defaultFragShader(1024 * 16); - fCStr_defaultFragShader.add("#version 420\r\n"); - fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); - fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); - fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); - fCStr_defaultFragShader.add("\r\n"); - fCStr_defaultFragShader.add("void main(){\r\n"); - fCStr_defaultFragShader.add("colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0);\r\n"); - fCStr_defaultFragShader.add("}\r\n"); + std::string defaultFragmentShader = + R"glsl(#version 420 + in vec2 passUV; + uniform sampler2D textureSrc; + layout(location = 0) out vec4 colorOut0; - RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::string{fCStr_defaultFragShader.c_str()}, false, false)); + void main(){ + colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0); + } + )glsl"; + + RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::move(defaultFragmentShader), false, false)); fragShader->PreponeCompilation(); defaultShader->glProgamId = fragShader->GetProgram(); @@ -45,21 +44,19 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth() if (_copyShader_colorToDepth != 0) return _copyShader_colorToDepth; catchOpenGLError(); - LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); - memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); + LatteDefaultShader_t* defaultShader = new LatteDefaultShader_t{}; - StringBuf fCStr_defaultFragShader(1024 * 16); - fCStr_defaultFragShader.add("#version 420\r\n"); - fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); - fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); - fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); - fCStr_defaultFragShader.add("\r\n"); - fCStr_defaultFragShader.add("void main(){\r\n"); - fCStr_defaultFragShader.add("gl_FragDepth = texture(textureSrc, passUV).r;\r\n"); - fCStr_defaultFragShader.add("}\r\n"); + std::string defaultFragShader = R"glsl(#version 420 + in vec2 passUV; + uniform sampler2D textureSrc; + layout(location = 0) out vec4 colorOut0; + void main() { + gl_FragDepth = texture(textureSrc, passUV).r; + } + )glsl"; - RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::string{fCStr_defaultFragShader.c_str()}, false, false)); + RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::move(defaultFragShader), false, false)); fragShader->PreponeCompilation(); defaultShader->glProgamId = fragShader->GetProgram(); defaultShader->copyShaderUniforms.uniformLoc_textureSrc = fragShader->GetUniformLocation("textureSrc"); From eb48b871d8e460e498d17c5ad6b2dc5cf9e1059e Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Thu, 22 Jan 2026 20:13:36 +0100 Subject: [PATCH 13/13] Revert "Remove LatteDraw header and deprecated shader compilation code" This reverts commit 657d9f6f431c34ff905436c11817b76e97107a00. Revert "C++-ify GL default shader code" This reverts commit 81a6f92f8d43fdcc344346111fc1ccdf8a534d5d. --- src/Cafe/CMakeLists.txt | 3 +- src/Cafe/HW/Latte/Core/FetchShader.cpp | 1 + src/Cafe/HW/Latte/Core/LatteBufferData.cpp | 1 + .../HW/Latte/Core/LatteCommandProcessor.cpp | 1 + .../HW/Latte/Core/LatteDefaultShaders.cpp | 83 +++++++----- src/Cafe/HW/Latte/Core/LatteDefaultShaders.h | 1 - src/Cafe/HW/Latte/Core/LatteDraw.h | 4 + src/Cafe/HW/Latte/Core/LatteQuery.cpp | 1 + src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp | 2 +- src/Cafe/HW/Latte/Core/LatteShaderGL.cpp | 119 ++++++++++++++++++ src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp | 1 + src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp | 1 + src/Cafe/HW/Latte/Core/LatteTextureCache.cpp | 1 + .../HW/Latte/Core/LatteTextureReadback.cpp | 1 + src/Cafe/HW/Latte/Core/LatteThread.cpp | 1 + .../LatteDecompiler.cpp | 1 + .../LatteDecompilerEmitGLSL.cpp | 1 + .../LatteDecompilerEmitGLSLAttrDecoder.cpp | 1 + .../LatteDecompilerEmitMSL.cpp | 1 + .../LatteDecompilerEmitMSLAttrDecoder.cpp | 1 + .../Latte/Renderer/OpenGL/OpenGLRenderer.cpp | 1 + .../Renderer/OpenGL/OpenGLRendererCore.cpp | 1 + .../Renderer/OpenGL/OpenGLSurfaceCopy.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Command.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_ContextState.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Draw.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Memory.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Surface.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_Texture.cpp | 1 + src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp | 1 + src/Cafe/OS/libs/swkbd/swkbd.cpp | 1 + 33 files changed, 204 insertions(+), 35 deletions(-) create mode 100644 src/Cafe/HW/Latte/Core/LatteDraw.h diff --git a/src/Cafe/CMakeLists.txt b/src/Cafe/CMakeLists.txt index eb1db4f6..78a8cce0 100644 --- a/src/Cafe/CMakeLists.txt +++ b/src/Cafe/CMakeLists.txt @@ -108,7 +108,8 @@ add_library(CemuCafe HW/Latte/Core/LatteConst.h HW/Latte/Core/LatteDefaultShaders.cpp HW/Latte/Core/LatteDefaultShaders.h - HW/Latte/Core/LatteGSCopyShaderParser.cpp + HW/Latte/Core/LatteDraw.h + HW/Latte/Core/LatteGSCopyShaderParser.cpp HW/Latte/Core/Latte.h HW/Latte/Core/LatteIndices.cpp HW/Latte/Core/LatteIndices.h diff --git a/src/Cafe/HW/Latte/Core/FetchShader.cpp b/src/Cafe/HW/Latte/Core/FetchShader.cpp index 2e229c2a..7d724e13 100644 --- a/src/Cafe/HW/Latte/Core/FetchShader.cpp +++ b/src/Cafe/HW/Latte/Core/FetchShader.cpp @@ -3,6 +3,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInstructions.h" #include "Cafe/HW/Latte/Core/FetchShader.h" diff --git a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp index 2ac37eb8..7620e6a7 100644 --- a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp +++ b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" diff --git a/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp b/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp index 509911f3..963c49f7 100644 --- a/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp +++ b/src/Cafe/HW/Latte/Core/LatteCommandProcessor.cpp @@ -4,6 +4,7 @@ #include "Cafe/OS/libs/gx2/GX2_Event.h" // for notification callbacks #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp index 8ec3fcef..7c590dbb 100644 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp +++ b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.cpp @@ -1,38 +1,54 @@ #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" -#include "Cafe/HW/Latte/Renderer/Renderer.h" -#include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" +#include "util/helpers/StringBuf.h" LatteDefaultShader_t* _copyShader_depthToColor; LatteDefaultShader_t* _copyShader_colorToDepth; +void LatteDefaultShader_pixelCopyShader_generateVSBody(StringBuf* vs) +{ + vs->add("#version 420\r\n"); + vs->add("out vec2 passUV;\r\n"); + vs->add("uniform vec4 uf_vertexOffsets[4];\r\n"); + vs->add("\r\n"); + vs->add("void main(){\r\n"); + vs->add("int vID = gl_VertexID;\r\n"); + vs->add("passUV = uf_vertexOffsets[vID].zw;\r\n"); + vs->add("gl_Position = vec4(uf_vertexOffsets[vID].xy, 0.0, 1.0);\r\n"); + vs->add("}\r\n"); +} + +GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS); +GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source); + LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_depthToColor() { if (_copyShader_depthToColor != 0) return _copyShader_depthToColor; catchOpenGLError(); - LatteDefaultShader_t* defaultShader = new LatteDefaultShader_t{}; + LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); + memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - std::string defaultFragmentShader = - R"glsl(#version 420 - in vec2 passUV; - uniform sampler2D textureSrc; - layout(location = 0) out vec4 colorOut0; + StringBuf fCStr_vertexShader(1024 * 16); + LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - void main(){ - colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0); - } - )glsl"; + StringBuf fCStr_defaultFragShader(1024 * 16); + fCStr_defaultFragShader.add("#version 420\r\n"); + fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); + fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); + fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); + fCStr_defaultFragShader.add("\r\n"); + fCStr_defaultFragShader.add("void main(){\r\n"); + fCStr_defaultFragShader.add("colorOut0 = vec4(texture(textureSrc, passUV).r,0.0,0.0,1.0);\r\n"); + fCStr_defaultFragShader.add("}\r\n"); - RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::move(defaultFragmentShader), false, false)); - fragShader->PreponeCompilation(); - - defaultShader->glProgamId = fragShader->GetProgram(); + defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); catchOpenGLError(); - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = fragShader->GetUniformLocation("textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = fragShader->GetUniformLocation("uf_vertexOffsets"); + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); _copyShader_depthToColor = defaultShader; catchOpenGLError(); @@ -44,23 +60,26 @@ LatteDefaultShader_t* LatteDefaultShader_getPixelCopyShader_colorToDepth() if (_copyShader_colorToDepth != 0) return _copyShader_colorToDepth; catchOpenGLError(); - LatteDefaultShader_t* defaultShader = new LatteDefaultShader_t{}; + LatteDefaultShader_t* defaultShader = (LatteDefaultShader_t*)malloc(sizeof(LatteDefaultShader_t)); + memset(defaultShader, 0, sizeof(LatteDefaultShader_t)); - std::string defaultFragShader = R"glsl(#version 420 - in vec2 passUV; - uniform sampler2D textureSrc; - layout(location = 0) out vec4 colorOut0; + StringBuf fCStr_vertexShader(1024 * 16); + LatteDefaultShader_pixelCopyShader_generateVSBody(&fCStr_vertexShader); - void main() { - gl_FragDepth = texture(textureSrc, passUV).r; - } - )glsl"; + StringBuf fCStr_defaultFragShader(1024 * 16); + fCStr_defaultFragShader.add("#version 420\r\n"); + fCStr_defaultFragShader.add("in vec2 passUV;\r\n"); + fCStr_defaultFragShader.add("uniform sampler2D textureSrc;\r\n"); + fCStr_defaultFragShader.add("layout(location = 0) out vec4 colorOut0;\r\n"); + fCStr_defaultFragShader.add("\r\n"); + fCStr_defaultFragShader.add("void main(){\r\n"); + fCStr_defaultFragShader.add("gl_FragDepth = texture(textureSrc, passUV).r;\r\n"); + fCStr_defaultFragShader.add("}\r\n"); - RendererShaderGL* fragShader = static_cast(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, std::move(defaultFragShader), false, false)); - fragShader->PreponeCompilation(); - defaultShader->glProgamId = fragShader->GetProgram(); - defaultShader->copyShaderUniforms.uniformLoc_textureSrc = fragShader->GetUniformLocation("textureSrc"); - defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = fragShader->GetUniformLocation("uf_vertexOffsets"); + + defaultShader->glProgamId = gxShaderDepr_compileRaw(&fCStr_vertexShader, &fCStr_defaultFragShader); + defaultShader->copyShaderUniforms.uniformLoc_textureSrc = glGetUniformLocation(defaultShader->glProgamId, "textureSrc"); + defaultShader->copyShaderUniforms.uniformLoc_vertexOffsets = glGetUniformLocation(defaultShader->glProgamId, "uf_vertexOffsets"); _copyShader_colorToDepth = defaultShader; catchOpenGLError(); diff --git a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h index d9324555..3776a3d2 100644 --- a/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h +++ b/src/Cafe/HW/Latte/Core/LatteDefaultShaders.h @@ -1,5 +1,4 @@ -#include "Common/GLInclude/GLInclude.h" typedef struct { GLuint glProgamId; diff --git a/src/Cafe/HW/Latte/Core/LatteDraw.h b/src/Cafe/HW/Latte/Core/LatteDraw.h new file mode 100644 index 00000000..89c34dc0 --- /dev/null +++ b/src/Cafe/HW/Latte/Core/LatteDraw.h @@ -0,0 +1,4 @@ +#pragma once +#include "Common/GLInclude/GLInclude.h" + +void LatteDraw_cleanupAfterFrame(); \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteQuery.cpp b/src/Cafe/HW/Latte/Core/LatteQuery.cpp index 11e12baf..a8329e63 100644 --- a/src/Cafe/HW/Latte/Core/LatteQuery.cpp +++ b/src/Cafe/HW/Latte/Core/LatteQuery.cpp @@ -1,5 +1,6 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteQueryObject.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp b/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp index 9d83b226..1bdbc4bb 100644 --- a/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp +++ b/src/Cafe/HW/Latte/Core/LatteRenderTarget.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteOverlay.h" #include "Cafe/HW/Latte/Core/LatteBufferCache.h" @@ -680,7 +681,6 @@ void LatteRenderTarget_trackUpdates() } } -void LatteDraw_cleanupAfterFrame(); void LatteRenderTarget_itHLESwapScanBuffer() { performanceMonitor.cycle[performanceMonitor.cycleIndex].frameCounter++; diff --git a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp index f7cddb9a..7a22539a 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderGL.cpp @@ -1,9 +1,28 @@ #include "Common/GLInclude/GLInclude.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h" #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" +#include "util/helpers/StringBuf.h" +bool gxShader_checkIfSuccessfullyLinked(GLuint glProgram) +{ + int status = -1; + glGetProgramiv(glProgram, GL_LINK_STATUS, &status); + if( status == GL_TRUE ) + return true; + // in debug mode, get and print shader error log + char infoLog[48*1024]; + uint32 infoLogLength, tempLength; + glGetProgramiv(glProgram, GL_INFO_LOG_LENGTH, (GLint *)&infoLogLength); + tempLength = sizeof(infoLog)-1; + glGetProgramInfoLog(glProgram, std::min(tempLength, infoLogLength), (GLsizei*)&tempLength, (GLcharARB*)infoLog); + infoLog[tempLength] = '\0'; + cemuLog_log(LogType::Force, "Link error in raw shader"); + cemuLog_log(LogType::Force, infoLog); + return false; +} void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) { @@ -47,3 +66,103 @@ void LatteShader_prepareSeparableUniforms(LatteDecompilerShader* shader) } } } +GLuint gpu7ShaderGLDepr_compileShader(const std::string& source, uint32_t type) +{ + cemu_assert(type == GL_VERTEX_SHADER || type == GL_FRAGMENT_SHADER); + const GLuint shader_object = glCreateShader(type); + + const char *c_str = source.c_str(); + const GLint size = (GLint)source.size(); + glShaderSource(shader_object, 1, &c_str, &size); + glCompileShader(shader_object); + + GLint log_length; + glGetShaderiv(shader_object, GL_INFO_LOG_LENGTH, &log_length); + if (log_length > 0) + { + char log[2048]{}; + GLsizei log_size; + glGetShaderInfoLog(shader_object, std::min(log_length, (GLint)sizeof(log) - 1), &log_size, log); + cemuLog_log(LogType::Force, "Error/Warning in vertex shader:"); + cemuLog_log(LogType::Force, log); + } + + return shader_object; +} +GLuint gpu7ShaderGLDepr_compileVertexShader(const std::string& source) +{ + return gpu7ShaderGLDepr_compileShader(source, GL_VERTEX_SHADER); +} + +GLuint gpu7ShaderGLDepr_compileFragmentShader(const std::string& source) +{ + return gpu7ShaderGLDepr_compileShader(source, GL_FRAGMENT_SHADER); +} + +GLuint gpu7ShaderGLDepr_compileVertexShader(const char* shaderSource, sint32 shaderSourceLength) +{ + uint32 shaderObject = glCreateShader(GL_VERTEX_SHADER); + GLchar* srcPtr = (GLchar*)shaderSource; + GLint srcLen = shaderSourceLength; + glShaderSource(shaderObject, 1, &srcPtr, &srcLen); + glCompileShader(shaderObject); + uint32 shaderLogLengthInfo, shaderLogLen; + glGetShaderiv(shaderObject, GL_INFO_LOG_LENGTH, (GLint *)&shaderLogLengthInfo); + if (shaderLogLengthInfo > 0) + { + char messageLog[2048]{}; + glGetShaderInfoLog(shaderObject, std::min(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog); + cemuLog_log(LogType::Force, "Error/Warning in vertex shader:"); + cemuLog_log(LogType::Force, messageLog); + } + return shaderObject; +} + +GLuint gpu7ShaderGLDepr_compileFragmentShader(const char* shaderSource, sint32 shaderSourceLength) +{ + uint32 shaderObject = glCreateShader(GL_FRAGMENT_SHADER); + GLchar* srcPtr = (GLchar*)shaderSource; + GLint srcLen = shaderSourceLength; + glShaderSource(shaderObject, 1, &srcPtr, &srcLen); + glCompileShader(shaderObject); + uint32 shaderLogLengthInfo, shaderLogLen; + char messageLog[2048]; + glGetShaderiv(shaderObject, GL_INFO_LOG_LENGTH, (GLint *)&shaderLogLengthInfo); + if (shaderLogLengthInfo > 0) + { + memset(messageLog, 0, sizeof(messageLog)); + glGetShaderInfoLog(shaderObject, std::min(shaderLogLengthInfo, sizeof(messageLog) - 1), (GLsizei*)&shaderLogLen, (GLcharARB*)messageLog); + cemuLog_log(LogType::Force, "Error/Warning in fragment shader:"); + cemuLog_log(LogType::Force, messageLog); + } + return shaderObject; +} + +GLuint gxShaderDepr_compileRaw(StringBuf* strSourceVS, StringBuf* strSourceFS) +{ + GLuint glShaderProgram = glCreateProgram(); + GLuint vertexShader = gpu7ShaderGLDepr_compileVertexShader(strSourceVS->c_str(), strSourceVS->getLen()); + glAttachShader(glShaderProgram, vertexShader); + GLuint fragmentShader = gpu7ShaderGLDepr_compileFragmentShader(strSourceFS->c_str(), strSourceFS->getLen()); + glAttachShader(glShaderProgram, fragmentShader); + glLinkProgram(glShaderProgram); + if( gxShader_checkIfSuccessfullyLinked(glShaderProgram) == false ) + { + return 0; + } + return glShaderProgram; +} + +GLuint gxShaderDepr_compileRaw(const std::string& vertex_source, const std::string& fragment_source) +{ + const GLuint programm = glCreateProgram(); + + auto vertex_shader = std::async(std::launch::deferred, gpu7ShaderGLDepr_compileShader, vertex_source, GL_VERTEX_SHADER); + auto fragment_shader = std::async(std::launch::deferred, gpu7ShaderGLDepr_compileShader, fragment_source, GL_FRAGMENT_SHADER); + + glAttachShader(programm, vertex_shader.get()); + glAttachShader(programm, fragment_shader.get()); + + glLinkProgram(programm); + return gxShader_checkIfSuccessfullyLinked(programm) ? programm : 0; +} diff --git a/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp b/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp index 21e92294..ccea31b8 100644 --- a/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp +++ b/src/Cafe/HW/Latte/Core/LatteStreamoutGPU.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/Core/LatteConst.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/GameProfile/GameProfile.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" diff --git a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp index c836ba3c..45be6843 100644 --- a/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Core/LatteSurfaceCopy.cpp @@ -1,4 +1,5 @@ #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" diff --git a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp index ea80e598..3145e90e 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp @@ -1,4 +1,5 @@ #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Common/cpu_features.h" diff --git a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp index 07b5299a..8df5dcea 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp @@ -1,4 +1,5 @@ #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Common/GLInclude/GLInclude.h" diff --git a/src/Cafe/HW/Latte/Core/LatteThread.cpp b/src/Cafe/HW/Latte/Core/LatteThread.cpp index f1c85704..743ab679 100644 --- a/src/Cafe/HW/Latte/Core/LatteThread.cpp +++ b/src/Cafe/HW/Latte/Core/LatteThread.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/GameProfile/GameProfile.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp index e3bf4230..13188743 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp index f7863af2..e7ebcf3a 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSL.cpp @@ -3,6 +3,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp index e2431610..76d76322 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitGLSLAttrDecoder.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp index 6df7d3fc..cb512308 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp @@ -3,6 +3,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h" diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp index 8ca4c695..9ee5c31f 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLAttrDecoder.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/Core/LatteShaderAssembly.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp index ee9a0358..c9308fe4 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp @@ -2,6 +2,7 @@ #include "WindowSystem.h" #include "Cafe/HW/Latte/Core/LatteRingBuffer.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteOverlay.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureGL.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index f59388ca..821252d3 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -1,6 +1,7 @@ #include "Common/GLInclude/GLInclude.h" #include "Cafe/HW/Latte/Core/LatteRingBuffer.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Cafe/HW/Latte/Core/LatteShader.h" #include "Cafe/HW/Latte/Core/LatteSoftware.h" diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp index ee9c67fa..d578b842 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp @@ -6,6 +6,7 @@ #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" #include "Cafe/HW/Latte/Core/LatteShader.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteDefaultShaders.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Command.cpp b/src/Cafe/OS/libs/gx2/GX2_Command.cpp index 7f8f0bd0..d12bf210 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Command.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Command.cpp @@ -1,4 +1,5 @@ #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/OS/common/OSCommon.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/OS/libs/coreinit/coreinit.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp b/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp index 3da87aaf..fb631a11 100644 --- a/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_ContextState.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Draw.cpp b/src/Cafe/OS/libs/gx2/GX2_Draw.cpp index d7774dfe..3a5fff5b 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Draw.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Draw.cpp @@ -1,6 +1,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Memory.cpp b/src/Cafe/OS/libs/gx2/GX2_Memory.cpp index e3d750db..d5054784 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Memory.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Memory.cpp @@ -3,6 +3,7 @@ #include "GX2.h" #include "GX2_Resource.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" // default GX2 allocator (not the same as the GX2R allocator, but GX2R uses this allocator by default) MPTR gx2Mem_defaultAlloc = MPTR_NULL; diff --git a/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp b/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp index 095e13e3..4ef37b18 100644 --- a/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_RenderTarget.cpp @@ -1,6 +1,7 @@ #include "Cafe/OS/common/OSCommon.h" #include "GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Surface.cpp b/src/Cafe/OS/libs/gx2/GX2_Surface.cpp index 3bfcda23..1d858e18 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Surface.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Surface.cpp @@ -3,6 +3,7 @@ #include "GX2_Surface.h" #include "GX2_Resource.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp b/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp index da177795..f52f38e7 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Surface_Copy.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LatteAsyncCommands.h" #include "Cafe/HW/Latte/LatteAddrLib/LatteAddrLib.h" #include "util/highresolutiontimer/HighResolutionTimer.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_Texture.cpp b/src/Cafe/OS/libs/gx2/GX2_Texture.cpp index 26b8fd18..d986e307 100644 --- a/src/Cafe/OS/libs/gx2/GX2_Texture.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_Texture.cpp @@ -4,6 +4,7 @@ #include "GX2_Texture.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Core/LattePM4.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" diff --git a/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp b/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp index 78873983..d91a8529 100644 --- a/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp +++ b/src/Cafe/OS/libs/gx2/GX2_shader_legacy.cpp @@ -1,6 +1,7 @@ #include "Cafe/OS/common/OSCommon.h" #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/ISA/LatteReg.h" #include "Cafe/HW/Latte/Core/LattePM4.h" diff --git a/src/Cafe/OS/libs/swkbd/swkbd.cpp b/src/Cafe/OS/libs/swkbd/swkbd.cpp index b077bd8b..4e82783a 100644 --- a/src/Cafe/OS/libs/swkbd/swkbd.cpp +++ b/src/Cafe/OS/libs/swkbd/swkbd.cpp @@ -2,6 +2,7 @@ #include "Cafe/HW/Latte/ISA/RegDefines.h" #include "Cafe/OS/libs/gx2/GX2.h" #include "Cafe/HW/Latte/Core/Latte.h" +#include "Cafe/HW/Latte/Core/LatteDraw.h" #include "Cafe/HW/Latte/Renderer/Renderer.h"