From 2e04dceaf0dfa8d98c8ae7439c65c83a06f65845 Mon Sep 17 00:00:00 2001
From: kd-11 <karokidii@gmail.com>
Date: Wed, 24 Jan 2018 20:26:17 +0300
Subject: [PATCH] rsx: misc fixes - Supply explicit options for spv emit
 allowing optimizations (not yet compiled into the backend) - Add epsilon fix
 to glslcommon - Fix shader dialog crash when using qt (race condition)

---
 rpcs3/Emu/RSX/Common/GLSLCommon.h       |  2 +-
 rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp | 12 +++++++++---
 rpcs3/Emu/RSX/rsx_cache.h               |  7 +++++++
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/rpcs3/Emu/RSX/Common/GLSLCommon.h b/rpcs3/Emu/RSX/Common/GLSLCommon.h
index 58464933ad..c3a0b314cb 100644
--- a/rpcs3/Emu/RSX/Common/GLSLCommon.h
+++ b/rpcs3/Emu/RSX/Common/GLSLCommon.h
@@ -337,7 +337,7 @@ namespace glsl
 		OS << "	result.x = 1.;\n";
 		OS << "	result.w = 1.;\n";
 		OS << "	result.y = clamped_val.x;\n";
-		OS << "	result.z = clamped_val.x > 0. ? exp(clamped_val.w * log(max(clamped_val.y, 0.000001))) : 0.;\n";
+		OS << "	result.z = clamped_val.x > 0. ? exp(clamped_val.w * log(max(clamped_val.y, 0.0000000001))) : 0.;\n";
 		OS << "	return result;\n";
 		OS << "}\n\n";
 
diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp
index 3510b1acca..ecdb5b99cf 100644
--- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp
+++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp
@@ -144,6 +144,10 @@ namespace vk
 
 		glslang::TProgram program;
 		glslang::TShader shader_object(lang);
+
+		shader_object.setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 100);
+		shader_object.setEnvClient(glslang::EShClientVulkan, 100);
+		shader_object.setEnvTarget(glslang::EshTargetSpv, 0x00001000);
 		
 		bool success = false;
 		const char *shader_text = shader.data();
@@ -154,11 +158,13 @@ namespace vk
 		if (shader_object.parse(&g_default_config, 400, EProfile::ECoreProfile, false, true, msg))
 		{
 			program.addShader(&shader_object);
-			success = program.link(EShMsgVulkanRules);
+			success = program.link(msg);
 			if (success)
 			{
-				glslang::TIntermediate* bytes = program.getIntermediate(lang);
-				glslang::GlslangToSpv(*bytes, spv);
+				glslang::SpvOptions options;
+				options.disableOptimizer = false;
+				options.optimizeSize = true;
+				glslang::GlslangToSpv(*program.getIntermediate(lang), spv, &options);
 			}
 		}
 		else
diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h
index 2669da79a3..fe5410cc79 100644
--- a/rpcs3/Emu/RSX/rsx_cache.h
+++ b/rpcs3/Emu/RSX/rsx_cache.h
@@ -282,6 +282,7 @@ namespace rsx
 		struct progress_dialog_helper
 		{
 			std::shared_ptr<MsgDialogBase> dlg;
+			atomic_t<bool> initialized{ false };
 
 			virtual void create()
 			{
@@ -300,7 +301,13 @@ namespace rsx
 				Emu.CallAfter([&]()
 				{
 					dlg->Create("Preloading cached shaders from disk.\nPlease wait...");
+					initialized.store(true);
 				});
+
+				while (!initialized.load() && !Emu.IsStopped())
+				{
+					_mm_pause();
+				}
 			}
 
 			virtual void update_msg(u32 processed, u32 entry_count)