From 2fb4aed9d8b51b741fde7bb6a9c8c263a7be5fdd Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 4 Oct 2024 19:39:22 -0500 Subject: [PATCH] nvk: Advertise VK_KHR_fragment_shading_rate Part-of: --- docs/features.txt | 2 +- docs/relnotes/new_features.txt | 1 + src/nouveau/vulkan/nvk_image.c | 5 +++++ src/nouveau/vulkan/nvk_physical_device.c | 26 ++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/features.txt b/docs/features.txt index 9bf7f90786e..f5297f37cb9 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -523,7 +523,7 @@ Khronos extensions that are not part of any Vulkan version: VK_KHR_external_semaphore_fd DONE (anv, dzn, hasvk, nvk, pvr, radv, tu, v3dv, vn) VK_KHR_external_semaphore_win32 DONE (dzn) VK_KHR_fragment_shader_barycentric DONE (nvk/Turing+, radv/gfx10.3+) - VK_KHR_fragment_shading_rate DONE (anv/gen11+, radv/gfx10.3+, vn) + VK_KHR_fragment_shading_rate DONE (anv/gen11+, nvk/Turing+, radv/gfx10.3+, vn) VK_KHR_get_display_properties2 DONE (anv, nvk, pvr, radv, tu, v3dv) VK_KHR_get_surface_capabilities2 DONE (anv, lvp, nvk, pvr, radv, tu, v3dv, vn) VK_KHR_global_priority DONE (anv, radv, tu) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index f96b68f7bee..64efbb722f6 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -23,3 +23,4 @@ VK_EXT_depth_clamp_control on anv, hasvk, nvk, radv VK_KHR_shader_quad_control on nvk GL_EXT_draw_buffers2 on etnaviv/HALTI5+ GL_ARB_draw_buffers_blend on etnaviv/HALTI5+ +VK_KHR_fragment_shading_rate on NVK diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index e3ff600a9fc..793a6764f02 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -85,6 +85,9 @@ nvk_get_image_plane_format_features(struct nvk_physical_device *pdev, p_format == PIPE_FORMAT_R64_UINT || p_format == PIPE_FORMAT_R64_SINT) features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT; + if (p_format == PIPE_FORMAT_R8_UINT && tiling == VK_IMAGE_TILING_OPTIMAL) + features |= VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR; + if (features != 0) { features |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT; features |= VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT; @@ -273,6 +276,8 @@ vk_image_usage_to_format_features(VkImageUsageFlagBits usage_flag) case VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT: return VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT; + case VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR: + return VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR; default: return 0; } diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 4ef7aa8ee74..aeed734771a 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -45,6 +45,7 @@ #include "clc3c0.h" #include "clc597.h" #include "clc5c0.h" +#include "clc797.h" #include "clc997.h" static bool @@ -108,6 +109,7 @@ nvk_get_device_extensions(const struct nvk_instance *instance, .KHR_format_feature_flags2 = true, .KHR_fragment_shader_barycentric = info->cls_eng3d >= TURING_A && (nvk_nak_stages(info) & VK_SHADER_STAGE_FRAGMENT_BIT) != 0, + .KHR_fragment_shading_rate = info->cls_eng3d >= TURING_A, .KHR_get_memory_requirements2 = true, .KHR_image_format_list = true, .KHR_imageless_framebuffer = true, @@ -421,6 +423,11 @@ nvk_get_device_features(const struct nv_device_info *info, .fragmentShaderBarycentric = info->cls_eng3d >= TURING_A && (nvk_nak_stages(info) & VK_SHADER_STAGE_FRAGMENT_BIT) != 0, + /* VK_KHR_fragment_shading_rate */ + .pipelineFragmentShadingRate = info->cls_eng3d >= TURING_A, + .primitiveFragmentShadingRate = info->cls_eng3d >= TURING_A, + .attachmentFragmentShadingRate = info->cls_eng3d >= TURING_A, + /* VK_KHR_index_type_uint8 */ .indexTypeUint8 = true, @@ -1100,6 +1107,25 @@ nvk_get_device_properties(const struct nvk_instance *instance, /* VK_KHR_fragment_shader_barycentric */ .triStripVertexOrderIndependentOfProvokingVertex = false, + /* VK_KHR_fragment_shading_rate */ + .minFragmentShadingRateAttachmentTexelSize = { 16, 16 }, + .maxFragmentShadingRateAttachmentTexelSize = { 16, 16 }, + .maxFragmentShadingRateAttachmentTexelSizeAspectRatio = 1, + .primitiveFragmentShadingRateWithMultipleViewports = info->cls_eng3d >= AMPERE_B, + .layeredShadingRateAttachments = true, + .fragmentShadingRateNonTrivialCombinerOps = true, + .maxFragmentSize = { 4, 4 }, + .maxFragmentSizeAspectRatio = 2, + .maxFragmentShadingRateCoverageSamples = 16, + .maxFragmentShadingRateRasterizationSamples = 16, + .fragmentShadingRateWithShaderDepthStencilWrites = true, + .fragmentShadingRateWithSampleMask = true, + .fragmentShadingRateWithShaderSampleMask = true, + .fragmentShadingRateWithConservativeRasterization = true, + //.fragmentShadingRateWithFragmentShaderInterlock = true, + .fragmentShadingRateWithCustomSampleLocations = true, + .fragmentShadingRateStrictMultiplyCombiner = true, + /* VK_NV_shader_sm_builtins */ .shaderSMCount = (uint32_t)info->tpc_count * info->mp_per_tpc, .shaderWarpsPerSM = info->max_warps_per_mp,