summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp27
1 files changed, 11 insertions, 16 deletions
diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
index 289e99cae0..eff1497e7f 100644
--- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
+++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
@@ -78,6 +78,8 @@ static std::string GetGLSLVersionString()
return "#version 400";
case Glsl430:
return "#version 430";
+ case Glsl450:
+ return "#version 450";
default:
// Shouldn't ever hit this
return "#version ERROR";
@@ -720,25 +722,18 @@ void ProgramShaderCache::CreateHeader()
}
std::string shader_shuffle_string;
- if (g_ogl_config.bSupportsShaderThreadShuffleNV)
+ if (g_ogl_config.bSupportsKHRShaderSubgroup)
{
shader_shuffle_string = R"(
-#extension GL_NV_shader_thread_group : enable
-#extension GL_NV_shader_thread_shuffle : enable
-#define SUPPORTS_SUBGROUP_REDUCTION 1
+#extension GL_KHR_shader_subgroup_basic : enable
+#extension GL_KHR_shader_subgroup_arithmetic : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
-// The xor shuffle below produces incorrect results if all threads in a warp are not active.
-#define CAN_USE_SUBGROUP_REDUCTION (ballotThreadNV(true) == 0xFFFFFFFFu)
-
-#define IS_HELPER_INVOCATION gl_HelperThreadNV
-#define IS_FIRST_ACTIVE_INVOCATION (gl_ThreadInWarpNV == findLSB(ballotThreadNV(!gl_HelperThreadNV)))
-#define SUBGROUP_REDUCTION(func, value) value = func(value, shuffleXorNV(value, 16, 32)); \
- value = func(value, shuffleXorNV(value, 8, 32)); \
- value = func(value, shuffleXorNV(value, 4, 32)); \
- value = func(value, shuffleXorNV(value, 2, 32)); \
- value = func(value, shuffleXorNV(value, 1, 32));
-#define SUBGROUP_MIN(value) SUBGROUP_REDUCTION(min, value)
-#define SUBGROUP_MAX(value) SUBGROUP_REDUCTION(max, value)
+#define SUPPORTS_SUBGROUP_REDUCTION 1
+#define IS_HELPER_INVOCATION gl_HelperInvocation
+#define IS_FIRST_ACTIVE_INVOCATION (subgroupElect())
+#define SUBGROUP_MIN(value) value = subgroupMin(value)
+#define SUBGROUP_MAX(value) value = subgroupMax(value)
)";
}