Browse Source

Start using GL_ARB_shader_ballot

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
c4e2cb7f2e

+ 4 - 0
shaders/Common.glsl

@@ -44,4 +44,8 @@ const uint MAX_U32 = 0xFFFFFFFFu;
 #define SCALE_LOCATION 1
 #define ALPHA_LOCATION 2
 
+#if !defined(ANKI_ARB_SHADER_BALLOT)
+#define readFirstInvocationARB(x_) (x_)
+#endif
+
 #endif

+ 1 - 1
shaders/Pps.frag.glsl

@@ -115,7 +115,7 @@ void main()
 	out_color = textureLod(u_isRt, uv, 0.0).rgb;
 #endif
 
-	out_color = tonemap(out_color, u_averageLuminancePad3.x, 0.0);
+	out_color = tonemap(out_color, readFirstInvocationARB(u_averageLuminancePad3.x), 0.0);
 
 #if BLOOM_ENABLED
 	vec3 bloom = textureLod(u_ppsBloomLfRt, uv, 0.0).rgb;

+ 2 - 1
src/anki/gr/vulkan/Common.h

@@ -37,7 +37,7 @@ class GrManagerImpl;
 #define ANKI_VK_LOGW(...) ANKI_LOG("VK  ", WARNING, __VA_ARGS__)
 #define ANKI_VK_LOGF(...) ANKI_LOG("VK  ", FATAL, __VA_ARGS__)
 
-enum class VulkanExtensions : U8
+enum class VulkanExtensions : U16
 {
 	NONE = 0,
 	KHR_MAINENANCE1 = 1 << 0,
@@ -48,6 +48,7 @@ enum class VulkanExtensions : U8
 	KHR_SURFACE = 1 << 5,
 	EXT_DEBUG_MARKER = 1 << 6,
 	NV_DEDICATED_ALLOCATION = 1 << 7,
+	EXT_SHADER_SUBGROUP_BALLOT = 1 << 8,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions, inline)
 

+ 5 - 0
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -471,6 +471,11 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				m_extensions |= VulkanExtensions::NV_DEDICATED_ALLOCATION;
 				extensionsToEnable[extensionsToEnableCount++] = VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME;
 			}
+			else if(CString(extensionInfos[extCount].extensionName) == VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME)
+			{
+				m_extensions |= VulkanExtensions::EXT_SHADER_SUBGROUP_BALLOT;
+				extensionsToEnable[extensionsToEnableCount++] = VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME;
+			}
 		}
 
 		if(!!(m_extensions & VulkanExtensions::KHR_MAINENANCE1))

+ 6 - 0
src/anki/gr/vulkan/ShaderImpl.cpp

@@ -174,6 +174,11 @@ static const char* SHADER_HEADER = R"(#version 450 core
 #define ANKI_WRITE_POSITION(x_) gl_Position = x_; gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5
 #endif
 
+#if %s
+#extension GL_ARB_shader_ballot : require
+#define ANKI_ARB_SHADER_BALLOT 1
+#endif
+
 %s)";
 
 ShaderImpl::~ShaderImpl()
@@ -244,6 +249,7 @@ Error ShaderImpl::init(ShaderType shaderType, const CString& source)
 		MAX_TEXTURE_BINDINGS,
 		MAX_TEXTURE_BINDINGS + MAX_UNIFORM_BUFFER_BINDINGS,
 		MAX_TEXTURE_BINDINGS + MAX_UNIFORM_BUFFER_BINDINGS + MAX_STORAGE_BUFFER_BINDINGS,
+		!!(getGrManagerImpl().getExtensions() & VulkanExtensions::EXT_SHADER_SUBGROUP_BALLOT) ? "1" : "0",
 		&source[0]);
 
 	std::vector<unsigned int> spirv;

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit e75f0c1129986d465e81334fa39b320bcdba44cf
+Subproject commit 7c8d2e06f5bfe4fb48c14132c1b6ec97d58d1ec3