From 21eaef04fc42d439587e952ccdf51dac662f5335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 29 Mar 2020 14:51:54 +0200 Subject: [PATCH] Vulkan: Pick shaders after calling ConvertStateToVulkanKey because it may end up disabling shader blending (due to too many copies, see DrawEngineCommon::ApplyShaderBlending). (So much state leaking all over the place ... I want to redesign the whole thing). Typo fix in comment --- GPU/Vulkan/DrawEngineVulkan.cpp | 8 +++++--- GPU/Vulkan/StateMappingVulkan.cpp | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 9a3ee27ed3..01f6d7106b 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -259,6 +259,7 @@ void DrawEngineVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *d } void DrawEngineVulkan::BeginFrame() { + // Too many issues right now to allow reuse. lastPipeline_ = nullptr; int curFrame = vulkan_->GetCurFrame(); @@ -808,12 +809,13 @@ void DrawEngineVulkan::DoFlush() { } if (!lastPipeline_ || gstate_c.IsDirty(DIRTY_BLEND_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE) || prim != lastPrim_) { - shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, true); // usehwtransform - _dbg_assert_msg_(G3D, vshader->UseHWTransform(), "Bad vshader"); - if (prim != lastPrim_ || gstate_c.IsDirty(DIRTY_BLEND_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_RASTER_STATE | DIRTY_DEPTHSTENCIL_STATE)) { ConvertStateToVulkanKey(*framebufferManager_, shaderManager_, prim, pipelineKey_, dynState_); } + + shaderManager_->GetShaders(prim, lastVType_, &vshader, &fshader, true); // usehwtransform + _dbg_assert_msg_(G3D, vshader->UseHWTransform(), "Bad vshader"); + Draw::NativeObject object = g_Config.iRenderingMode != FB_NON_BUFFERED_MODE ? Draw::NativeObject::FRAMEBUFFER_RENDERPASS : Draw::NativeObject::BACKBUFFER_RENDERPASS; VkRenderPass renderPass = (VkRenderPass)draw_->GetNativeObject(object); VulkanPipeline *pipeline = pipelineManager_->GetOrCreatePipeline(pipelineLayout_, renderPass, pipelineKey_, &dec_->decFmt, vshader, fshader, true); diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 65c5d03631..0e1b5d491f 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -172,6 +172,8 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag // Until next time, force it off. ResetShaderBlending(); gstate_c.SetAllowShaderBlend(false); + // Make sure we recompute the fragment shader ID to one that doesn't try to use shader blending. + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } } else if (blendState.resetShaderBlending) { ResetShaderBlending();