diff --git a/.gitmodules b/.gitmodules
index e71d26af6d..48feb4a81e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -24,3 +24,6 @@
[submodule "3rdparty/imgui/imgui"]
path = 3rdparty/imgui/imgui
url = https://github.com/ocornut/imgui.git
+[submodule "3rdparty/glslang/glslang"]
+ path = 3rdparty/glslang/glslang
+ url = https://github.com/KhronosGroup/glslang.git
diff --git a/3rdparty/glslang/CMakeLists.txt b/3rdparty/glslang/CMakeLists.txt
new file mode 100644
index 0000000000..3db3d21fae
--- /dev/null
+++ b/3rdparty/glslang/CMakeLists.txt
@@ -0,0 +1,58 @@
+add_library(glslang
+ glslang/glslang/CInterface/glslang_c_interface.cpp
+ glslang/glslang/GenericCodeGen/CodeGen.cpp
+ glslang/glslang/GenericCodeGen/Link.cpp
+ glslang/glslang/MachineIndependent/attribute.cpp
+ glslang/glslang/MachineIndependent/Constant.cpp
+ glslang/glslang/MachineIndependent/glslang_tab.cpp
+ glslang/glslang/MachineIndependent/InfoSink.cpp
+ glslang/glslang/MachineIndependent/Initialize.cpp
+ glslang/glslang/MachineIndependent/Intermediate.cpp
+ glslang/glslang/MachineIndependent/intermOut.cpp
+ glslang/glslang/MachineIndependent/IntermTraverse.cpp
+ glslang/glslang/MachineIndependent/iomapper.cpp
+ glslang/glslang/MachineIndependent/limits.cpp
+ glslang/glslang/MachineIndependent/linkValidate.cpp
+ glslang/glslang/MachineIndependent/parseConst.cpp
+ glslang/glslang/MachineIndependent/ParseContextBase.cpp
+ glslang/glslang/MachineIndependent/ParseHelper.cpp
+ glslang/glslang/MachineIndependent/PoolAlloc.cpp
+ glslang/glslang/MachineIndependent/preprocessor/Pp.cpp
+ glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp
+ glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp
+ glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+ glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp
+ glslang/glslang/MachineIndependent/propagateNoContraction.cpp
+ glslang/glslang/MachineIndependent/reflection.cpp
+ glslang/glslang/MachineIndependent/RemoveTree.cpp
+ glslang/glslang/MachineIndependent/Scan.cpp
+ glslang/glslang/MachineIndependent/ShaderLang.cpp
+ glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp
+ glslang/glslang/MachineIndependent/SymbolTable.cpp
+ glslang/glslang/MachineIndependent/Versions.cpp
+ glslang/OGLCompilersDLL/InitializeDll.cpp
+ glslang/SPIRV/disassemble.cpp
+ glslang/SPIRV/doc.cpp
+ glslang/SPIRV/GlslangToSpv.cpp
+ glslang/SPIRV/InReadableOrder.cpp
+ glslang/SPIRV/Logger.cpp
+ glslang/SPIRV/SpvBuilder.cpp
+ glslang/SPIRV/SpvPostProcess.cpp
+ glslang/SPIRV/SPVRemapper.cpp
+ glslang/SPIRV/SpvTools.cpp
+ glslang/StandAlone/ResourceLimits.cpp
+ glslang/StandAlone/resource_limits_c.cpp
+)
+
+if(WIN32)
+ target_sources(glslang PRIVATE glslang/glslang/OSDependent/Windows/ossource.cpp)
+else()
+ target_sources(glslang PRIVATE glslang/glslang/OSDependent/Unix/ossource.cpp)
+endif()
+
+target_include_directories(glslang PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/glslang" "${CMAKE_CURRENT_SOURCE_DIR}/include")
+
+# Needed for macOS compile.
+set_property(TARGET glslang PROPERTY CXX_STANDARD 11)
+set_property(TARGET glslang PROPERTY CXX_STANDARD_REQUIRED ON)
+
diff --git a/3rdparty/glslang/glslang b/3rdparty/glslang/glslang
new file mode 160000
index 0000000000..c9706bdda0
--- /dev/null
+++ b/3rdparty/glslang/glslang
@@ -0,0 +1 @@
+Subproject commit c9706bdda0ac22b9856f1aa8261e5b9e15cd20c5
diff --git a/3rdparty/glslang/glslang.vcxproj b/3rdparty/glslang/glslang.vcxproj
new file mode 100644
index 0000000000..55d8e42127
--- /dev/null
+++ b/3rdparty/glslang/glslang.vcxproj
@@ -0,0 +1,146 @@
+
+
+
+
+
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}
+ Win32Proj
+
+
+
+ StaticLibrary
+ $(DefaultPlatformToolset)
+ MultiByte
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AllRules.ruleset
+
+
+
+ TurnOffAllWarnings
+ %(PreprocessorDefinitions)
+ $(ProjectDir)glslang;$(ProjectDir)include;%(AdditionalIncludeDirectories)
+ stdcpp14
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/3rdparty/glslang/glslang.vcxproj.filters b/3rdparty/glslang/glslang.vcxproj.filters
new file mode 100644
index 0000000000..2c49020b82
--- /dev/null
+++ b/3rdparty/glslang/glslang.vcxproj.filters
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/3rdparty/glslang/include/glslang/build_info.h b/3rdparty/glslang/include/glslang/build_info.h
new file mode 100644
index 0000000000..9d70f7962d
--- /dev/null
+++ b/3rdparty/glslang/include/glslang/build_info.h
@@ -0,0 +1,62 @@
+// Copyright (C) 2020 The Khronos Group Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// Neither the name of The Khronos Group Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GLSLANG_BUILD_INFO
+#define GLSLANG_BUILD_INFO
+
+#define GLSLANG_VERSION_MAJOR 11
+#define GLSLANG_VERSION_MINOR 7
+#define GLSLANG_VERSION_PATCH 1
+#define GLSLANG_VERSION_FLAVOR ""
+
+#define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \
+ (((major) > GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+ (((minor) > GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+ ((patch) > GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \
+ (((major) > GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+ (((minor) > GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+ ((patch) >= GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \
+ (((major) < GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+ (((minor) < GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+ ((patch) < GLSLANG_VERSION_PATCH)))))
+
+#define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \
+ (((major) < GLSLANG_VERSION_MAJOR) || ((major) == GLSLANG_VERSION_MAJOR && \
+ (((minor) < GLSLANG_VERSION_MINOR) || ((minor) == GLSLANG_VERSION_MINOR && \
+ ((patch) <= GLSLANG_VERSION_PATCH)))))
+
+#endif // GLSLANG_BUILD_INFO
diff --git a/PCSX2_suite.sln b/PCSX2_suite.sln
index 5e43b47ea1..67018b6055 100644
--- a/PCSX2_suite.sln
+++ b/PCSX2_suite.sln
@@ -60,6 +60,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simpleini", "3rdparty\simpl
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imgui", "3rdparty\imgui\imgui.vcxproj", "{88FB34EC-845E-4F21-A552-F1573B9ED167}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glslang", "3rdparty\glslang\glslang.vcxproj", "{EF6834A9-11F3-4331-BC34-21B325ABB180}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug AVX2|Win32 = Debug AVX2|Win32
@@ -628,6 +630,30 @@ Global
{88FB34EC-845E-4F21-A552-F1573B9ED167}.Release|Win32.Build.0 = Release|Win32
{88FB34EC-845E-4F21-A552-F1573B9ED167}.Release|x64.ActiveCfg = Release|x64
{88FB34EC-845E-4F21-A552-F1573B9ED167}.Release|x64.Build.0 = Release|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug AVX2|Win32.ActiveCfg = Debug|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug AVX2|Win32.Build.0 = Debug|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug AVX2|x64.ActiveCfg = Debug|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug AVX2|x64.Build.0 = Debug|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug|Win32.Build.0 = Debug|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug|x64.ActiveCfg = Debug|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Debug|x64.Build.0 = Debug|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel AVX2|Win32.ActiveCfg = Devel|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel AVX2|Win32.Build.0 = Devel|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel AVX2|x64.ActiveCfg = Devel|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel AVX2|x64.Build.0 = Devel|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel|Win32.ActiveCfg = Devel|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel|Win32.Build.0 = Devel|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel|x64.ActiveCfg = Devel|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Devel|x64.Build.0 = Devel|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release AVX2|Win32.ActiveCfg = Release|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release AVX2|Win32.Build.0 = Release|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release AVX2|x64.ActiveCfg = Release|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release AVX2|x64.Build.0 = Release|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release|Win32.ActiveCfg = Release|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release|Win32.Build.0 = Release|Win32
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release|x64.ActiveCfg = Release|x64
+ {EF6834A9-11F3-4331-BC34-21B325ABB180}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -654,6 +680,7 @@ Global
{BF74C473-DC04-44B3-92E8-4145F4E77342} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{1EC8B3C0-8FB3-46DE-A2E0-A9121203F266} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{88FB34EC-845E-4F21-A552-F1573B9ED167} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
+ {EF6834A9-11F3-4331-BC34-21B325ABB180} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0BC474EA-3628-45D3-9DBC-E22D0B7E0F77}
diff --git a/cmake/SearchForStuff.cmake b/cmake/SearchForStuff.cmake
index b0d6cd50fa..8bfc82639c 100644
--- a/cmake/SearchForStuff.cmake
+++ b/cmake/SearchForStuff.cmake
@@ -244,6 +244,7 @@ else()
endif()
add_subdirectory(3rdparty/glad EXCLUDE_FROM_ALL)
+add_subdirectory(3rdparty/glslang EXCLUDE_FROM_ALL)
add_subdirectory(3rdparty/simpleini EXCLUDE_FROM_ALL)
add_subdirectory(3rdparty/imgui EXCLUDE_FROM_ALL)