aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/vulkan_common
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/vulkan_common')
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp14
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h47
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;
}