diff options
Diffstat (limited to 'src/video_core/vulkan_common')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 47 |
2 files changed, 52 insertions, 9 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 8bddca0c70..8fd9b6e69f 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -504,8 +504,8 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR CollectToolingInfo(); if (is_qualcomm) { - LOG_WARNING(Render_Vulkan, "Qualcomm drivers require scaled vertex format emulation"); must_emulate_scaled_formats = true; + LOG_WARNING(Render_Vulkan, "Qualcomm drivers require scaled vertex format emulation."); LOG_WARNING(Render_Vulkan, "Qualcomm drivers have broken custom border color."); RemoveExtensionFeature(extensions.custom_border_color, features.custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); @@ -523,11 +523,10 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR features.shader_atomic_int64.shaderBufferInt64Atomics = false; features.shader_atomic_int64.shaderSharedInt64Atomics = false; features.features.shaderInt64 = false; - LOG_WARNING(Render_Vulkan, "Qualcomm drivers have broken storage buffer access."); - features.bit8_storage.storageBuffer8BitAccess = false; - features.bit8_storage.uniformAndStorageBuffer8BitAccess = false; - features.bit16_storage.storageBuffer16BitAccess = false; - features.bit16_storage.uniformAndStorageBuffer16BitAccess = false; + LOG_WARNING(Render_Vulkan, "Qualcomm drivers have broken workgroup memory explicit layout."); + RemoveExtensionFeature(extensions.workgroup_memory_explicit_layout, + features.workgroup_memory_explicit_layout, + VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME); #if defined(__ANDROID__) && defined(ARCHITECTURE_arm64) // BCn patching only safe on Android 9+ (API 28+). Older versions crash on driver load. @@ -1356,10 +1355,7 @@ void Device::RemoveUnsuitableExtensions() { // VK_KHR_workgroup_memory_explicit_layout extensions.workgroup_memory_explicit_layout = - features.features.shaderInt16 && features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayout && - features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayout8BitAccess && - features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayout16BitAccess && features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayoutScalarBlockLayout; RemoveExtensionFeatureIfUnsuitable(extensions.workgroup_memory_explicit_layout, features.workgroup_memory_explicit_layout, diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index db92df70a6..c449f60324 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -305,6 +305,19 @@ public: return properties.driver.driverID; } + /// Returns true for tile-based deferred renderers. + bool IsTiler() const { + switch (GetDriverID()) { + case VK_DRIVER_ID_QUALCOMM_PROPRIETARY: + case VK_DRIVER_ID_ARM_PROPRIETARY: + case VK_DRIVER_ID_SAMSUNG_PROPRIETARY: + case VK_DRIVER_ID_MESA_TURNIP: + return true; + default: + return false; + } + } + bool ShouldBoostClocks() const; /// Returns uniform buffer alignment requirement. @@ -322,6 +335,11 @@ public: return properties.properties.limits.maxStorageBufferRange; } + std::array<u32, 3> GetMaxComputeWorkGroupCount() const { + const auto& count = properties.properties.limits.maxComputeWorkGroupCount; + return {count[0], count[1], count[2]}; + } + /// Returns the maximum size for push constants. VkDeviceSize GetMaxPushConstantsSize() const { return properties.properties.limits.maxPushConstantsSize; @@ -374,6 +392,18 @@ FN_MAX_LIMIT_LIST return features.descriptor_indexing.shaderSampledImageArrayNonUniformIndexing; } + bool IsStorageImageArrayNonUniformIndexingSupported() const { + return features.descriptor_indexing.shaderStorageImageArrayNonUniformIndexing; + } + + bool IsUniformTexelBufferArrayNonUniformIndexingSupported() const { + return features.descriptor_indexing.shaderUniformTexelBufferArrayNonUniformIndexing; + } + + bool IsStorageTexelBufferArrayNonUniformIndexingSupported() const { + return features.descriptor_indexing.shaderStorageTexelBufferArrayNonUniformIndexing; + } + /// Returns true if the device supports float64 natively. bool IsFloat64Supported() const { return features.features.shaderFloat64; @@ -513,6 +543,18 @@ FN_MAX_LIMIT_LIST return extensions.workgroup_memory_explicit_layout; } + bool IsWorkgroupMemoryExplicitLayout8BitAccessSupported() const { + return extensions.workgroup_memory_explicit_layout && + features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayout8BitAccess && + features.shader_float16_int8.shaderInt8; + } + + bool IsWorkgroupMemoryExplicitLayout16BitAccessSupported() const { + return extensions.workgroup_memory_explicit_layout && + features.workgroup_memory_explicit_layout.workgroupMemoryExplicitLayout16BitAccess && + features.features.shaderInt16; + } + /// Returns true if the device supports VK_KHR_image_format_list. bool IsKhrImageFormatListSupported() const { return extensions.image_format_list || instance_version >= VK_API_VERSION_1_2; @@ -765,6 +807,11 @@ FN_MAX_LIMIT_LIST return extensions.shader_atomic_int64; } + bool IsSharedInt64AtomicsSupported() const { + return extensions.shader_atomic_int64 && + features.shader_atomic_int64.shaderSharedInt64Atomics; + } + bool IsExtConditionalRendering() const { return extensions.conditional_rendering; } |
