Skip to content

Commit 888fb5d

Browse files
authored
Enable KHR barycentric features during Vulkan device init (#11298)
# Summary I was trying to test some barycentric code on Falcor and the RHI was reporting that my gpu doesn't support barycentric rendering. I'm testing on linux using an RX 5700 XT graphics card. my card does not list the NV extension: https://vulkan.gpuinfo.org/displayreport.php?id=47720. # Test plan - [ ] validate changes against falcor with a shader that requires barycentric support. Signed-off-by: Michael Pollind <mpollind@gmail.com>
1 parent 74459f6 commit 888fb5d

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

tools/gfx/vulkan/vk-api.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,10 @@ struct VulkanExtendedFeatureProperties
301301
VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragmentShadingRateFeatures = {
302302
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR};
303303

304+
// Fragment shader barycentric features
305+
VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR fragmentShaderBarycentricFeatures = {
306+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR};
307+
304308
// Vulkan 1.2 features.
305309
VkPhysicalDeviceVulkan12Features vulkan12Features = {
306310
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES};

tools/gfx/vulkan/vk-device.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,10 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
544544
extendedFeatures.fragmentShadingRateFeatures.pNext = deviceFeatures2.pNext;
545545
deviceFeatures2.pNext = &extendedFeatures.fragmentShadingRateFeatures;
546546

547+
// fragment shader barycentric features
548+
extendedFeatures.fragmentShaderBarycentricFeatures.pNext = deviceFeatures2.pNext;
549+
deviceFeatures2.pNext = &extendedFeatures.fragmentShaderBarycentricFeatures;
550+
547551
// raytracing validation features
548552
extendedFeatures.rayTracingValidationFeatures.pNext = deviceFeatures2.pNext;
549553
deviceFeatures2.pNext = &extendedFeatures.rayTracingValidationFeatures;
@@ -851,11 +855,29 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
851855
deviceExtensions.add(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
852856
m_features.add("push-descriptor");
853857
}
854-
if (extensionNames.contains(VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME))
858+
859+
const bool khrFragmentBarycentrics =
860+
extensionNames.contains(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME) &&
861+
extendedFeatures.fragmentShaderBarycentricFeatures.fragmentShaderBarycentric == VK_TRUE;
862+
const bool nvFragmentBarycentrics =
863+
extensionNames.contains(VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
864+
if (khrFragmentBarycentrics || nvFragmentBarycentrics)
855865
{
856-
deviceExtensions.add(VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
857866
m_features.add("barycentrics");
858867
}
868+
869+
if (khrFragmentBarycentrics)
870+
{
871+
deviceExtensions.add(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
872+
extendedFeatures.fragmentShaderBarycentricFeatures.pNext =
873+
(void*)deviceCreateInfo.pNext;
874+
deviceCreateInfo.pNext = &extendedFeatures.fragmentShaderBarycentricFeatures;
875+
}
876+
if (nvFragmentBarycentrics)
877+
{
878+
deviceExtensions.add(VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
879+
}
880+
859881
if (extensionNames.contains(VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME))
860882
{
861883
deviceExtensions.add(VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME);

0 commit comments

Comments
 (0)