From 17adc28b2c8a5f0dfe2abcbf306570c5b84d3e9f Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Fri, 18 Sep 2026 01:18:03 -0400 Subject: [PATCH] Remove some dead accesors --- .../renderer_vulkan/maxwell_to_vk.cpp | 8 ++- .../renderer_vulkan/vk_graphics_pipeline.cpp | 2 +- .../renderer_vulkan/vk_multi_range_buffer.cpp | 10 +++- .../renderer_vulkan/vk_rasterizer.cpp | 3 + .../vulkan_common/vulkan_device.cpp | 26 +------- src/video_core/vulkan_common/vulkan_device.h | 59 +++++-------------- .../vulkan_common/vulkan_wrapper.cpp | 23 ++++++++ src/video_core/vulkan_common/vulkan_wrapper.h | 3 + 8 files changed, 61 insertions(+), 73 deletions(-) diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index b730ae4d58..dae9fe0269 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp @@ -70,12 +70,14 @@ VkSamplerAddressMode WrapMode(const Device& device, } ASSERT(false); return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - case Tegra::Texture::WrapMode::MirrorOnceClampToEdge: - return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE; case Tegra::Texture::WrapMode::MirrorOnceBorder: UNIMPLEMENTED(); - return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE; + [[fallthrough]]; + case Tegra::Texture::WrapMode::MirrorOnceClampToEdge: case Tegra::Texture::WrapMode::MirrorOnceClampOGL: + if (!device.IsKhrSamplerMirrorClampToEdgeSupported()) { + return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + } return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE; default: UNIMPLEMENTED_MSG("Unimplemented wrap mode={}", wrap_mode); diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 7ee1c608c0..101fab301e 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -740,7 +740,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .vertexBindingDivisorCount = static_cast(vertex_binding_divisors.size()), .pVertexBindingDivisors = vertex_binding_divisors.data(), }; - if (!vertex_binding_divisors.empty()) { + if (!vertex_binding_divisors.empty() && device.IsExtVertexAttributeDivisorSupported()) { vertex_input_ci.pNext = &input_divisor_ci; } const bool has_tess_stages = spv_modules[1] || spv_modules[2]; diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp index 4d84390002..6d1ae5fc53 100644 --- a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp +++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp @@ -32,8 +32,6 @@ MultiRangeBufferCache::MultiRangeBufferCache(const Device& device) { VkDeviceSize MultiRangeBufferCache::QueryBlockSize(const Device& device, u32& memory_type_bits) const { - const VkDevice logical = *device.GetLogical(); - const auto& dld = device.GetDispatchLoader(); const VkBufferCreateInfo probe_ci{ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, .pNext = nullptr, @@ -44,6 +42,14 @@ VkDeviceSize MultiRangeBufferCache::QueryBlockSize(const Device& device, .queueFamilyIndexCount = 0, .pQueueFamilyIndices = nullptr, }; + if (device.IsKhrMaintenance4Supported()) { + const VkMemoryRequirements reqs = + device.GetLogical().GetDeviceBufferMemoryRequirements(probe_ci); + memory_type_bits = reqs.memoryTypeBits; + return reqs.alignment; + } + const VkDevice logical = *device.GetLogical(); + const auto& dld = device.GetDispatchLoader(); VkBuffer probe{}; if (dld.vkCreateBuffer(logical, &probe_ci, nullptr, &probe) != VK_SUCCESS) { return 0; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index c7978ea9fc..fd95ea288b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -326,6 +326,9 @@ void RasterizerVulkan::DrawIndirect() { return; } if (params.include_count) { + if (!device.IsDrawIndirectCountSupported()) { + return; + } const auto count = buffer_cache.GetDrawIndirectCount(); const auto& draw_buffer = count.first; const auto& offset_base = count.second; diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 9a9bfdd43b..27379be506 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -949,6 +949,8 @@ bool Device::GetSuitability(bool requires_swapchain) { extensions.depth_stencil_resolve = extensions.depth_stencil_resolve && (instance_version >= VK_API_VERSION_1_2 || extensions.create_renderpass2); + extensions.draw_indirect_count = + extensions.draw_indirect_count || instance_version >= VK_API_VERSION_1_2; RemoveExtensionIfUnsuitable(extensions.depth_stencil_resolve, VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME); @@ -1408,18 +1410,6 @@ void Device::RemoveUnsuitableExtensions() { features.workgroup_memory_explicit_layout, VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME); - // VK_KHR_maintenance1 - extensions.maintenance1 = loaded_extensions.contains(VK_KHR_MAINTENANCE_1_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance1, VK_KHR_MAINTENANCE_1_EXTENSION_NAME); - - // VK_KHR_maintenance2 - extensions.maintenance2 = loaded_extensions.contains(VK_KHR_MAINTENANCE_2_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance2, VK_KHR_MAINTENANCE_2_EXTENSION_NAME); - - // VK_KHR_maintenance3 - extensions.maintenance3 = loaded_extensions.contains(VK_KHR_MAINTENANCE_3_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance3, VK_KHR_MAINTENANCE_3_EXTENSION_NAME); - // VK_KHR_maintenance4 extensions.maintenance4 = features.maintenance4.maintenance4; RemoveExtensionFeatureIfUnsuitable(extensions.maintenance4, features.maintenance4, @@ -1430,18 +1420,6 @@ void Device::RemoveUnsuitableExtensions() { RemoveExtensionFeatureIfUnsuitable(extensions.maintenance5, features.maintenance5, VK_KHR_MAINTENANCE_5_EXTENSION_NAME); - // VK_KHR_maintenance6 - extensions.maintenance6 = features.maintenance6.maintenance6; - RemoveExtensionFeatureIfUnsuitable(extensions.maintenance6, features.maintenance6, - VK_KHR_MAINTENANCE_6_EXTENSION_NAME); - - // VK_KHR_maintenance7 - extensions.maintenance7 = loaded_extensions.contains(VK_KHR_MAINTENANCE_7_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance7, VK_KHR_MAINTENANCE_7_EXTENSION_NAME); - - // VK_KHR_maintenance8 - extensions.maintenance8 = loaded_extensions.contains(VK_KHR_MAINTENANCE_8_EXTENSION_NAME); - RemoveExtensionIfUnsuitable(extensions.maintenance8, VK_KHR_MAINTENANCE_8_EXTENSION_NAME); // VK_KHR_synchronization2 extensions.synchronization2 = features.synchronization2.synchronization2; diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index c6d6df16b1..8b93aad373 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -72,7 +72,6 @@ VK_DEFINE_HANDLE(VmaAllocator) FEATURE(EXT, TransformFeedback, TRANSFORM_FEEDBACK, transform_feedback) \ FEATURE(EXT, VertexInputDynamicState, VERTEX_INPUT_DYNAMIC_STATE, vertex_input_dynamic_state) \ FEATURE(KHR, Maintenance5, MAINTENANCE_5, maintenance5) \ - FEATURE(KHR, Maintenance6, MAINTENANCE_6, maintenance6) \ FEATURE(KHR, PipelineExecutableProperties, PIPELINE_EXECUTABLE_PROPERTIES, \ pipeline_executable_properties) \ FEATURE(KHR, ShaderQuadControl, SHADER_QUAD_CONTROL, shader_quad_control) \ @@ -104,17 +103,11 @@ VK_DEFINE_HANDLE(VmaAllocator) EXTENSION(KHR, SWAPCHAIN, swapchain) \ EXTENSION(KHR, SWAPCHAIN_MUTABLE_FORMAT, swapchain_mutable_format) \ EXTENSION(KHR, IMAGE_FORMAT_LIST, image_format_list) \ - EXTENSION(KHR, MAINTENANCE_1, maintenance1) \ - EXTENSION(KHR, MAINTENANCE_2, maintenance2) \ - EXTENSION(KHR, MAINTENANCE_3, maintenance3) \ - EXTENSION(KHR, MAINTENANCE_7, maintenance7) \ - EXTENSION(KHR, MAINTENANCE_8, maintenance8) \ EXTENSION(NV, DEVICE_DIAGNOSTICS_CONFIG, device_diagnostics_config) \ EXTENSION(NV, GEOMETRY_SHADER_PASSTHROUGH, geometry_shader_passthrough) \ EXTENSION(NV, VIEWPORT_ARRAY2, viewport_array2) \ EXTENSION(NV, VIEWPORT_SWIZZLE, viewport_swizzle) \ EXTENSION(EXT, FILTER_CUBIC, filter_cubic) \ - EXTENSION(IMG, FILTER_CUBIC, filter_cubic_img) \ EXTENSION(QCOM, FILTER_CUBIC_WEIGHTS, filter_cubic_weights) // Define extensions which must be supported. @@ -549,11 +542,6 @@ FN_MAX_LIMIT_LIST return extensions.geometry_shader_passthrough; } - /// Returns true if the device supports VK_KHR_uniform_buffer_standard_layout. - bool IsKhrUniformBufferStandardLayoutSupported() const { - return extensions.uniform_buffer_standard_layout; - } - /// Returns true if the device supports VK_KHR_push_descriptor. bool IsKhrPushDescriptorSupported() const { return extensions.push_descriptor; @@ -1004,27 +992,27 @@ FN_MAX_LIMIT_LIST return features2.features.multiViewport; } - /// Returns true if the device supports VK_KHR_maintenance1. - bool IsKhrMaintenance1Supported() const { - return extensions.maintenance1; - } - - /// Returns true if the device supports VK_KHR_maintenance2. - bool IsKhrMaintenance2Supported() const { - return extensions.maintenance2; - } - - /// Returns true if the device supports VK_KHR_maintenance3. - bool IsKhrMaintenance3Supported() const { - return extensions.maintenance3; - } - + /// Returns true if the device supports VK_KHR_maintenance5. /// Returns true if the device supports VK_KHR_maintenance4. bool IsKhrMaintenance4Supported() const { return extensions.maintenance4; } - /// Returns true if the device supports VK_KHR_maintenance5. + /// Returns true if the device can read the draw count from a buffer. + bool IsDrawIndirectCountSupported() const { + return extensions.draw_indirect_count; + } + + /// Returns true if the device supports VK_EXT_vertex_attribute_divisor. + bool IsExtVertexAttributeDivisorSupported() const { + return extensions.vertex_attribute_divisor; + } + + /// Returns true if the device supports VK_KHR_sampler_mirror_clamp_to_edge. + bool IsKhrSamplerMirrorClampToEdgeSupported() const { + return extensions.sampler_mirror_clamp_to_edge; + } + bool IsKhrMaintenance5Supported() const { return extensions.maintenance5; } @@ -1046,21 +1034,6 @@ FN_MAX_LIMIT_LIST properties.maintenance5.earlyFragmentSampleMaskTestBeforeSampleCounting; } - /// Returns true if the device supports VK_KHR_maintenance6. - bool IsKhrMaintenance6Supported() const { - return extensions.maintenance6; - } - - /// Returns true if the device supports VK_KHR_maintenance7. - bool IsKhrMaintenance7Supported() const { - return extensions.maintenance7; - } - - /// Returns true if the device supports VK_KHR_maintenance8. - bool IsKhrMaintenance8Supported() const { - return extensions.maintenance8; - } - /// Returns true if the device supports UINT8 index buffer conversion via compute shader. bool SupportsUint8Indices() const { return features.bit8_storage.storageBuffer8BitAccess && diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 652f864890..d5012ddd83 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -216,6 +216,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkFreeDescriptorSets); X(vkFreeMemory); X(vkGetBufferMemoryRequirements2); + X(vkGetDeviceBufferMemoryRequirements); X(vkGetDeviceQueue); X(vkGetEventStatus); X(vkGetFenceStatus); @@ -266,6 +267,12 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { Proc(dld.vkCmdDrawIndexedIndirectCount, dld, "vkCmdDrawIndexedIndirectCountKHR", device); } + // Maintenance4 queries are core in Vulkan 1.3, otherwise require VK_KHR_maintenance4 + if (!dld.vkGetDeviceBufferMemoryRequirements) { + Proc(dld.vkGetDeviceBufferMemoryRequirements, dld, + "vkGetDeviceBufferMemoryRequirementsKHR", device); + } + // Synchronization2 is core in Vulkan 1.3, otherwise requires VK_KHR_synchronization2 if (!dld.vkCmdPipelineBarrier2) { Proc(dld.vkCmdPipelineBarrier2, dld, "vkCmdPipelineBarrier2KHR", device); @@ -874,6 +881,22 @@ VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer, return requirements.memoryRequirements; } +VkMemoryRequirements Device::GetDeviceBufferMemoryRequirements( + const VkBufferCreateInfo& ci) const noexcept { + const VkDeviceBufferMemoryRequirements info{ + .sType = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS, + .pNext = nullptr, + .pCreateInfo = &ci, + }; + VkMemoryRequirements2 requirements{ + .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, + .pNext = nullptr, + .memoryRequirements{}, + }; + dld->vkGetDeviceBufferMemoryRequirements(handle, &info, &requirements); + return requirements.memoryRequirements; +} + VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept { VkMemoryRequirements requirements; dld->vkGetImageMemoryRequirements(handle, image, &requirements); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 2a2c5fedc7..5c2d78bc2c 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -332,6 +332,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkFreeDescriptorSets vkFreeDescriptorSets{}; PFN_vkFreeMemory vkFreeMemory{}; PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2{}; + PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements{}; PFN_vkGetDeviceQueue vkGetDeviceQueue{}; PFN_vkGetEventStatus vkGetEventStatus{}; PFN_vkGetFenceStatus vkGetFenceStatus{}; @@ -1105,6 +1106,8 @@ public: VkMemoryRequirements GetBufferMemoryRequirements(VkBuffer buffer, void* pnext = nullptr) const noexcept; + VkMemoryRequirements GetDeviceBufferMemoryRequirements(const VkBufferCreateInfo& ci) const noexcept; + VkMemoryRequirements GetImageMemoryRequirements(VkImage image) const noexcept; std::vector GetPipelineExecutablePropertiesKHR(