From 3b033bf3f08d23bfc42b1d7a6f9dd94a8b863c1d Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 27 Jan 2019 13:07:35 +1000 Subject: [PATCH] Vulkan: Move clear shader from Renderer to ShaderCache --- Source/Core/VideoBackends/Vulkan/Renderer.cpp | 53 +------------------ Source/Core/VideoBackends/Vulkan/Renderer.h | 7 --- .../Core/VideoBackends/Vulkan/ShaderCache.cpp | 22 +++++++- .../Core/VideoBackends/Vulkan/ShaderCache.h | 2 + 4 files changed, 24 insertions(+), 60 deletions(-) diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 71497633e1..584d41569a 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -76,12 +76,6 @@ bool Renderer::Initialize() BindEFBToStateTracker(); - if (!CompileShaders()) - { - PanicAlert("Failed to compile shaders."); - return false; - } - m_bounding_box = std::make_unique(); if (!m_bounding_box->Initialize()) { @@ -117,8 +111,6 @@ bool Renderer::Initialize() void Renderer::Shutdown() { ::Renderer::Shutdown(); - - DestroyShaders(); } std::unique_ptr Renderer::CreateTexture(const TextureConfig& config) @@ -447,7 +439,8 @@ void Renderer::ClearScreen(const EFBRectangle& rc, bool color_enable, bool alpha g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD), FramebufferManager::GetInstance()->GetEFBLoadRenderPass(), g_shader_cache->GetPassthroughVertexShader(), - g_shader_cache->GetPassthroughGeometryShader(), m_clear_fragment_shader); + g_shader_cache->GetPassthroughGeometryShader(), + g_shader_cache->GetClearFragmentShader()); draw.SetMultisamplingState(FramebufferManager::GetInstance()->GetEFBMultisamplingState()); draw.SetDepthState(depth_state); @@ -658,7 +651,6 @@ void Renderer::OnConfigChanged(u32 bits) if (bits & (CONFIG_CHANGE_BIT_HOST_CONFIG | CONFIG_CHANGE_BIT_MULTISAMPLES)) { RecreateEFBFramebuffer(); - RecompileShaders(); FramebufferManager::GetInstance()->RecompileShaders(); g_shader_cache->ReloadPipelineCache(); g_shader_cache->RecompileSharedShaders(); @@ -892,45 +884,4 @@ void Renderer::DrawIndexed(u32 base_index, u32 num_indices, u32 base_vertex) vkCmdDrawIndexed(g_command_buffer_mgr->GetCurrentCommandBuffer(), num_indices, 1, base_index, base_vertex, 0); } - -void Renderer::RecompileShaders() -{ - DestroyShaders(); - if (!CompileShaders()) - PanicAlert("Failed to recompile shaders."); -} - -bool Renderer::CompileShaders() -{ - static const char CLEAR_FRAGMENT_SHADER_SOURCE[] = R"( - layout(location = 0) in float3 uv0; - layout(location = 1) in float4 col0; - layout(location = 0) out float4 ocol0; - - void main() - { - ocol0 = col0; - } - - )"; - - std::string source = g_shader_cache->GetUtilityShaderHeader() + CLEAR_FRAGMENT_SHADER_SOURCE; - m_clear_fragment_shader = Util::CompileAndCreateFragmentShader(source); - - return m_clear_fragment_shader != VK_NULL_HANDLE; -} - -void Renderer::DestroyShaders() -{ - auto DestroyShader = [this](VkShaderModule& shader) { - if (shader != VK_NULL_HANDLE) - { - vkDestroyShaderModule(g_vulkan_context->GetDevice(), shader, nullptr); - shader = VK_NULL_HANDLE; - } - }; - - DestroyShader(m_clear_fragment_shader); -} - } // namespace Vulkan diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.h b/Source/Core/VideoBackends/Vulkan/Renderer.h index 552e36fa89..43e97279f0 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.h +++ b/Source/Core/VideoBackends/Vulkan/Renderer.h @@ -104,17 +104,10 @@ private: void RecreateEFBFramebuffer(); void BindFramebuffer(const VKFramebuffer* fb); - void RecompileShaders(); - bool CompileShaders(); - void DestroyShaders(); - std::unique_ptr m_swap_chain; std::unique_ptr m_bounding_box; // Keep a copy of sampler states to avoid cache lookups every draw std::array m_sampler_states = {}; - - // Shaders used for clear/blit. - VkShaderModule m_clear_fragment_shader = VK_NULL_HANDLE; }; } diff --git a/Source/Core/VideoBackends/Vulkan/ShaderCache.cpp b/Source/Core/VideoBackends/Vulkan/ShaderCache.cpp index eb03177be9..33181e920c 100644 --- a/Source/Core/VideoBackends/Vulkan/ShaderCache.cpp +++ b/Source/Core/VideoBackends/Vulkan/ShaderCache.cpp @@ -795,7 +795,19 @@ bool ShaderCache::CompileSharedShaders() } )"; - std::string header = GetUtilityShaderHeader(); + static const char CLEAR_FRAGMENT_SHADER_SOURCE[] = R"( + layout(location = 0) in float3 uv0; + layout(location = 1) in float4 col0; + layout(location = 0) out float4 ocol0; + + void main() + { + ocol0 = col0; + } + + )"; + + const std::string header = GetUtilityShaderHeader(); m_screen_quad_vertex_shader = Util::CompileAndCreateVertexShader(header + SCREEN_QUAD_VERTEX_SHADER_SOURCE); @@ -820,6 +832,11 @@ bool ShaderCache::CompileSharedShaders() } } + m_clear_fragment_shader = + Util::CompileAndCreateFragmentShader(header + CLEAR_FRAGMENT_SHADER_SOURCE); + if (m_clear_fragment_shader == VK_NULL_HANDLE) + return false; + return true; } @@ -837,5 +854,6 @@ void ShaderCache::DestroySharedShaders() DestroyShader(m_passthrough_vertex_shader); DestroyShader(m_screen_quad_geometry_shader); DestroyShader(m_passthrough_geometry_shader); + DestroyShader(m_clear_fragment_shader); } -} +} // namespace Vulkan diff --git a/Source/Core/VideoBackends/Vulkan/ShaderCache.h b/Source/Core/VideoBackends/Vulkan/ShaderCache.h index 28480569e0..51060358e2 100644 --- a/Source/Core/VideoBackends/Vulkan/ShaderCache.h +++ b/Source/Core/VideoBackends/Vulkan/ShaderCache.h @@ -116,6 +116,7 @@ public: VkShaderModule GetPassthroughVertexShader() const { return m_passthrough_vertex_shader; } VkShaderModule GetScreenQuadGeometryShader() const { return m_screen_quad_geometry_shader; } VkShaderModule GetPassthroughGeometryShader() const { return m_passthrough_geometry_shader; } + VkShaderModule GetClearFragmentShader() const { return m_clear_fragment_shader; } private: bool CreatePipelineCache(); @@ -136,6 +137,7 @@ private: VkShaderModule m_passthrough_vertex_shader = VK_NULL_HANDLE; VkShaderModule m_screen_quad_geometry_shader = VK_NULL_HANDLE; VkShaderModule m_passthrough_geometry_shader = VK_NULL_HANDLE; + VkShaderModule m_clear_fragment_shader = VK_NULL_HANDLE; }; extern std::unique_ptr g_shader_cache;