diff --git a/docs/features.txt b/docs/features.txt index 69bc7992920..0c9af3c56fd 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -601,7 +601,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_sample_locations DONE (anv, hasvk, nvk, radv/gfx9-, tu/a650) VK_EXT_shader_atomic_float DONE (anv, hasvk, lvp, radv) VK_EXT_shader_atomic_float2 DONE (anv/gen9+, lvp, radv) - VK_EXT_shader_image_atomic_int64 DONE (radv) + VK_EXT_shader_image_atomic_int64 DONE (nvk, radv) VK_EXT_shader_object DONE (lvp) VK_EXT_shader_stencil_export DONE (anv/gen9+, lvp, radv, tu, vn) VK_EXT_shader_subgroup_ballot DONE (anv, dzn, hasvk, lvp, nvk, radv, vn) diff --git a/src/nouveau/vulkan/nvk_cmd_clear.c b/src/nouveau/vulkan/nvk_cmd_clear.c index 4793fb9beab..e1c2b6334f1 100644 --- a/src/nouveau/vulkan/nvk_cmd_clear.c +++ b/src/nouveau/vulkan/nvk_cmd_clear.c @@ -298,6 +298,9 @@ nvk_CmdClearColorImage(VkCommandBuffer commandBuffer, }; VkFormat vk_format = image->vk.format; + if (vk_format == VK_FORMAT_R64_UINT || vk_format == VK_FORMAT_R64_SINT) + vk_format = VK_FORMAT_R32G32_UINT; + enum pipe_format p_format = vk_format_to_pipe_format(vk_format); assert(p_format != PIPE_FORMAT_NONE); diff --git a/src/nouveau/vulkan/nvk_image.c b/src/nouveau/vulkan/nvk_image.c index 6ac99d78d49..60d9dd8c09c 100644 --- a/src/nouveau/vulkan/nvk_image.c +++ b/src/nouveau/vulkan/nvk_image.c @@ -69,7 +69,8 @@ nvk_get_image_plane_format_features(struct nvk_physical_device *pdev, features |= VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT; } - if (p_format == PIPE_FORMAT_R32_UINT || p_format == PIPE_FORMAT_R32_SINT) + if (p_format == PIPE_FORMAT_R32_UINT || p_format == PIPE_FORMAT_R32_SINT || + p_format == PIPE_FORMAT_R64_UINT || p_format == PIPE_FORMAT_R64_SINT) features |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT; if (features != 0) { diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 3a1733495ba..9e88c4976d2 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -168,6 +168,8 @@ nvk_get_device_extensions(const struct nv_device_info *info, .EXT_sample_locations = info->cls_eng3d >= MAXWELL_B, .EXT_sampler_filter_minmax = info->cls_eng3d >= MAXWELL_B, .EXT_separate_stencil_usage = true, + .EXT_shader_image_atomic_int64 = info->cls_eng3d >= MAXWELL_A && + nvk_use_nak(info), .EXT_shader_demote_to_helper_invocation = true, .EXT_shader_subgroup_ballot = true, .EXT_shader_subgroup_vote = true, @@ -445,6 +447,12 @@ nvk_get_device_features(const struct nv_device_info *info, .robustImageAccess2 = true, .nullDescriptor = true, + /* VK_EXT_shader_image_atomic_int64 */ + .shaderImageInt64Atomics = info->cls_eng3d >= MAXWELL_A && + nvk_use_nak(info), + .sparseImageInt64Atomics = info->cls_eng3d >= MAXWELL_A && + nvk_use_nak(info), + /* VK_EXT_transform_feedback */ .transformFeedback = true, .geometryStreams = true, diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 5fb6387e94a..b798daa8a36 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -142,6 +142,7 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdev, .draw_parameters = true, .fragment_barycentric = true, .geometry_streams = true, + .image_atomic_int64 = true, .image_read_without_format = true, .image_write_without_format = true, .int8 = true,