Browse Source

Add barycentrics support

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
a997686198

+ 3 - 0
AnKi/Gr/Common.h

@@ -225,6 +225,9 @@ public:
 
 	/// Can create PipelineQuery objects.
 	Bool m_pipelineQuery = false;
+
+	/// Has access to barycentrics.
+	Bool m_barycentrics = false;
 };
 ANKI_END_PACKED_STRUCT
 

+ 2 - 1
AnKi/Gr/Vulkan/Common.h

@@ -96,7 +96,8 @@ enum class VulkanExtensions : U64
 	kKHR_maintenance_4 = 1u << 29u,
 	kKHR_draw_indirect_count = 1u << 30u,
 	kEXT_mesh_shader = 1u << 31u,
-	kEXT_host_query_reset = 32u,
+	kEXT_host_query_reset = 1_U64 << 32_U64,
+	kKHR_fragment_shader_barycentric = 1_U64 << 33_U64,
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
 

+ 24 - 0
AnKi/Gr/Vulkan/GrManagerImpl.cpp

@@ -818,6 +818,11 @@ Error GrManagerImpl::initDevice()
 				m_extensions |= VulkanExtensions::kEXT_host_query_reset;
 				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
 			}
+			else if(extensionName == VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME)
+			{
+				m_extensions |= VulkanExtensions::kKHR_fragment_shader_barycentric;
+				extensionsToEnable[extensionsToEnableCount++] = extensionName.cstr();
+			}
 		}
 
 		ANKI_VK_LOGI("Will enable the following device extensions:");
@@ -1160,6 +1165,25 @@ Error GrManagerImpl::initDevice()
 		return Error::kFunctionFailed;
 	}
 
+	// Barycentrics
+	VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR baryFeatures = {};
+	if(!!(m_extensions & VulkanExtensions::kKHR_fragment_shader_barycentric))
+	{
+		baryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
+		getPhysicalDevicaFeatures2(baryFeatures);
+
+		if(baryFeatures.fragmentShaderBarycentric == false)
+		{
+			ANKI_VK_LOGE("VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR::fragmentShaderBarycentric is false");
+			return Error::kFunctionFailed;
+		}
+
+		baryFeatures.pNext = const_cast<void*>(ci.pNext);
+		ci.pNext = &baryFeatures;
+
+		m_capabilities.m_barycentrics = true;
+	}
+
 	VkPhysicalDeviceMaintenance4FeaturesKHR maintenance4Features = {};
 	if(!!(m_extensions & VulkanExtensions::kKHR_maintenance_4))
 	{

+ 2 - 4
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -567,15 +567,13 @@ FragOut main(
 	ANKI_MAYBE_UNUSED(uv);
 
 #		if DIFFUSE_TEX
-#			if REALLY_ALPHA_TEST
 	const RVec4 diffColorA = g_bindlessTextures2dF32[localConstants.m_diffuseTex].Sample(g_globalSampler, uv) * localConstants.m_diffuseScale;
+	const RVec3 diffColor = diffColorA.rgb;
+#			if REALLY_ALPHA_TEST
 	if(diffColorA.a == 0.0f)
 	{
 		discard;
 	}
-	const RVec3 diffColor = diffColorA.rgb;
-#			else
-	const RVec3 diffColor = g_bindlessTextures2dF32[localConstants.m_diffuseTex].Sample(g_globalSampler, uv).rgb;
 #			endif
 #		else
 	const RVec3 diffColor = localConstants.m_diffuseScale;