diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 15 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 26 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 33 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 2 |
5 files changed, 50 insertions, 33 deletions
diff --git a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp index 588ce6139..a658a3276 100644 --- a/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_compute_pipeline.cpp | |||
| @@ -131,12 +131,7 @@ ComputePipeline::ComputePipeline(const Device& device, VKDescriptorPool& descrip | |||
| 131 | })} {} | 131 | })} {} |
| 132 | 132 | ||
| 133 | void ComputePipeline::ConfigureBufferCache(BufferCache& buffer_cache) { | 133 | void ComputePipeline::ConfigureBufferCache(BufferCache& buffer_cache) { |
| 134 | u32 enabled_uniforms{}; | 134 | buffer_cache.SetEnabledComputeUniformBuffers(info.constant_buffer_mask); |
| 135 | for (const auto& desc : info.constant_buffer_descriptors) { | ||
| 136 | enabled_uniforms |= ((1ULL << desc.count) - 1) << desc.index; | ||
| 137 | } | ||
| 138 | buffer_cache.SetEnabledComputeUniformBuffers(enabled_uniforms); | ||
| 139 | |||
| 140 | buffer_cache.UnbindComputeStorageBuffers(); | 135 | buffer_cache.UnbindComputeStorageBuffers(); |
| 141 | size_t index{}; | 136 | size_t index{}; |
| 142 | for (const auto& desc : info.storage_buffers_descriptors) { | 137 | for (const auto& desc : info.storage_buffers_descriptors) { |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index c2a41a360..49ff911d6 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -177,7 +177,20 @@ ComputePipeline PipelineCache::CreateComputePipeline(ShaderInfo* shader_info) { | |||
| 177 | if (const std::optional<u128> cached_hash{env.Analyze(qmd.program_start)}) { | 177 | if (const std::optional<u128> cached_hash{env.Analyze(qmd.program_start)}) { |
| 178 | // TODO: Load from cache | 178 | // TODO: Load from cache |
| 179 | } | 179 | } |
| 180 | const auto [info, code]{Shader::RecompileSPIRV(env, qmd.program_start)}; | 180 | const auto& float_control{device.FloatControlProperties()}; |
| 181 | const Shader::Profile profile{ | ||
| 182 | .unified_descriptor_binding = true, | ||
| 183 | .support_float_controls = true, | ||
| 184 | .support_separate_denorm_behavior = float_control.denormBehaviorIndependence == | ||
| 185 | VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR, | ||
| 186 | .support_separate_rounding_mode = | ||
| 187 | float_control.roundingModeIndependence == VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR, | ||
| 188 | .support_fp16_denorm_preserve = float_control.shaderDenormPreserveFloat16 != VK_FALSE, | ||
| 189 | .support_fp32_denorm_preserve = float_control.shaderDenormPreserveFloat32 != VK_FALSE, | ||
| 190 | .support_fp16_denorm_flush = float_control.shaderDenormFlushToZeroFloat16 != VK_FALSE, | ||
| 191 | .support_fp32_denorm_flush = float_control.shaderDenormFlushToZeroFloat32 != VK_FALSE, | ||
| 192 | }; | ||
| 193 | const auto [info, code]{Shader::RecompileSPIRV(profile, env, qmd.program_start)}; | ||
| 181 | 194 | ||
| 182 | FILE* file = fopen("D:\\shader.spv", "wb"); | 195 | FILE* file = fopen("D:\\shader.spv", "wb"); |
| 183 | fwrite(code.data(), 4, code.size(), file); | 196 | fwrite(code.data(), 4, code.size(), file); |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 85f903125..4887d6fd9 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -43,6 +43,7 @@ constexpr std::array REQUIRED_EXTENSIONS{ | |||
| 43 | VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, | 43 | VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME, |
| 44 | VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, | 44 | VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME, |
| 45 | VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, | 45 | VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, |
| 46 | VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME, | ||
| 46 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, | 47 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, |
| 47 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, | 48 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, |
| 48 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, | 49 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, |
| @@ -200,6 +201,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 200 | CheckSuitability(surface != nullptr); | 201 | CheckSuitability(surface != nullptr); |
| 201 | SetupFamilies(surface); | 202 | SetupFamilies(surface); |
| 202 | SetupFeatures(); | 203 | SetupFeatures(); |
| 204 | SetupProperties(); | ||
| 203 | 205 | ||
| 204 | const auto queue_cis = GetDeviceQueueCreateInfos(); | 206 | const auto queue_cis = GetDeviceQueueCreateInfos(); |
| 205 | const std::vector extensions = LoadExtensions(surface != nullptr); | 207 | const std::vector extensions = LoadExtensions(surface != nullptr); |
| @@ -426,8 +428,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 426 | 428 | ||
| 427 | graphics_queue = logical.GetQueue(graphics_family); | 429 | graphics_queue = logical.GetQueue(graphics_family); |
| 428 | present_queue = logical.GetQueue(present_family); | 430 | present_queue = logical.GetQueue(present_family); |
| 429 | |||
| 430 | use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue(); | ||
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | Device::~Device() = default; | 433 | Device::~Device() = default; |
| @@ -600,7 +600,7 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 600 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; | 600 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; |
| 601 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; | 601 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; |
| 602 | 602 | ||
| 603 | VkPhysicalDeviceFeatures2 features2{}; | 603 | VkPhysicalDeviceFeatures2KHR features2{}; |
| 604 | features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; | 604 | features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; |
| 605 | features2.pNext = &robustness2; | 605 | features2.pNext = &robustness2; |
| 606 | 606 | ||
| @@ -684,7 +684,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 684 | true); | 684 | true); |
| 685 | } | 685 | } |
| 686 | } | 686 | } |
| 687 | VkPhysicalDeviceFeatures2KHR features; | 687 | VkPhysicalDeviceFeatures2KHR features{}; |
| 688 | features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; | 688 | features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; |
| 689 | 689 | ||
| 690 | VkPhysicalDeviceProperties2KHR physical_properties; | 690 | VkPhysicalDeviceProperties2KHR physical_properties; |
| @@ -806,11 +806,21 @@ void Device::SetupFamilies(VkSurfaceKHR surface) { | |||
| 806 | } | 806 | } |
| 807 | 807 | ||
| 808 | void Device::SetupFeatures() { | 808 | void Device::SetupFeatures() { |
| 809 | const auto supported_features{physical.GetFeatures()}; | 809 | const VkPhysicalDeviceFeatures features{physical.GetFeatures()}; |
| 810 | is_formatless_image_load_supported = supported_features.shaderStorageImageReadWithoutFormat; | 810 | is_formatless_image_load_supported = features.shaderStorageImageReadWithoutFormat; |
| 811 | is_shader_storage_image_multisample = supported_features.shaderStorageImageMultisample; | 811 | is_shader_storage_image_multisample = features.shaderStorageImageMultisample; |
| 812 | is_blit_depth_stencil_supported = TestDepthStencilBlits(); | 812 | is_blit_depth_stencil_supported = TestDepthStencilBlits(); |
| 813 | is_optimal_astc_supported = IsOptimalAstcSupported(supported_features); | 813 | is_optimal_astc_supported = IsOptimalAstcSupported(features); |
| 814 | } | ||
| 815 | |||
| 816 | void Device::SetupProperties() { | ||
| 817 | float_controls.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR; | ||
| 818 | |||
| 819 | VkPhysicalDeviceProperties2KHR properties2{}; | ||
| 820 | properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; | ||
| 821 | properties2.pNext = &float_controls; | ||
| 822 | |||
| 823 | physical.GetProperties2KHR(properties2); | ||
| 814 | } | 824 | } |
| 815 | 825 | ||
| 816 | void Device::CollectTelemetryParameters() { | 826 | void Device::CollectTelemetryParameters() { |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 96c0f8c60..82bccc8f0 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -128,6 +128,11 @@ public: | |||
| 128 | return properties.limits.maxComputeSharedMemorySize; | 128 | return properties.limits.maxComputeSharedMemorySize; |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | /// Returns float control properties of the device. | ||
| 132 | const VkPhysicalDeviceFloatControlsPropertiesKHR& FloatControlProperties() const { | ||
| 133 | return float_controls; | ||
| 134 | } | ||
| 135 | |||
| 131 | /// Returns true if ASTC is natively supported. | 136 | /// Returns true if ASTC is natively supported. |
| 132 | bool IsOptimalAstcSupported() const { | 137 | bool IsOptimalAstcSupported() const { |
| 133 | return is_optimal_astc_supported; | 138 | return is_optimal_astc_supported; |
| @@ -223,11 +228,6 @@ public: | |||
| 223 | return reported_extensions; | 228 | return reported_extensions; |
| 224 | } | 229 | } |
| 225 | 230 | ||
| 226 | /// Returns true if the setting for async shader compilation is enabled. | ||
| 227 | bool UseAsynchronousShaders() const { | ||
| 228 | return use_asynchronous_shaders; | ||
| 229 | } | ||
| 230 | |||
| 231 | u64 GetDeviceLocalMemory() const { | 231 | u64 GetDeviceLocalMemory() const { |
| 232 | return device_access_memory; | 232 | return device_access_memory; |
| 233 | } | 233 | } |
| @@ -245,6 +245,9 @@ private: | |||
| 245 | /// Sets up device features. | 245 | /// Sets up device features. |
| 246 | void SetupFeatures(); | 246 | void SetupFeatures(); |
| 247 | 247 | ||
| 248 | /// Sets up device properties. | ||
| 249 | void SetupProperties(); | ||
| 250 | |||
| 248 | /// Collects telemetry information from the device. | 251 | /// Collects telemetry information from the device. |
| 249 | void CollectTelemetryParameters(); | 252 | void CollectTelemetryParameters(); |
| 250 | 253 | ||
| @@ -267,14 +270,15 @@ private: | |||
| 267 | bool IsFormatSupported(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage, | 270 | bool IsFormatSupported(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage, |
| 268 | FormatType format_type) const; | 271 | FormatType format_type) const; |
| 269 | 272 | ||
| 270 | VkInstance instance; ///< Vulkan instance. | 273 | VkInstance instance; ///< Vulkan instance. |
| 271 | vk::DeviceDispatch dld; ///< Device function pointers. | 274 | vk::DeviceDispatch dld; ///< Device function pointers. |
| 272 | vk::PhysicalDevice physical; ///< Physical device. | 275 | vk::PhysicalDevice physical; ///< Physical device. |
| 273 | VkPhysicalDeviceProperties properties; ///< Device properties. | 276 | VkPhysicalDeviceProperties properties; ///< Device properties. |
| 274 | vk::Device logical; ///< Logical device. | 277 | VkPhysicalDeviceFloatControlsPropertiesKHR float_controls{}; ///< Float control properties. |
| 275 | vk::Queue graphics_queue; ///< Main graphics queue. | 278 | vk::Device logical; ///< Logical device. |
| 276 | vk::Queue present_queue; ///< Main present queue. | 279 | vk::Queue graphics_queue; ///< Main graphics queue. |
| 277 | u32 instance_version{}; ///< Vulkan onstance version. | 280 | vk::Queue present_queue; ///< Main present queue. |
| 281 | u32 instance_version{}; ///< Vulkan onstance version. | ||
| 278 | u32 graphics_family{}; ///< Main graphics queue family index. | 282 | u32 graphics_family{}; ///< Main graphics queue family index. |
| 279 | u32 present_family{}; ///< Main present queue family index. | 283 | u32 present_family{}; ///< Main present queue family index. |
| 280 | VkDriverIdKHR driver_id{}; ///< Driver ID. | 284 | VkDriverIdKHR driver_id{}; ///< Driver ID. |
| @@ -301,9 +305,6 @@ private: | |||
| 301 | bool has_renderdoc{}; ///< Has RenderDoc attached | 305 | bool has_renderdoc{}; ///< Has RenderDoc attached |
| 302 | bool has_nsight_graphics{}; ///< Has Nsight Graphics attached | 306 | bool has_nsight_graphics{}; ///< Has Nsight Graphics attached |
| 303 | 307 | ||
| 304 | // Asynchronous Graphics Pipeline setting | ||
| 305 | bool use_asynchronous_shaders{}; ///< Setting to use asynchronous shaders/graphics pipeline | ||
| 306 | |||
| 307 | // Telemetry parameters | 308 | // Telemetry parameters |
| 308 | std::string vendor_name; ///< Device's driver name. | 309 | std::string vendor_name; ///< Device's driver name. |
| 309 | std::vector<std::string> reported_extensions; ///< Reported Vulkan extensions. | 310 | std::vector<std::string> reported_extensions; ///< Reported Vulkan extensions. |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 2aa0ffbe6..33fb74bfb 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -311,8 +311,6 @@ const char* ToString(VkResult result) noexcept { | |||
| 311 | return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT"; | 311 | return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT"; |
| 312 | case VkResult::VK_ERROR_UNKNOWN: | 312 | case VkResult::VK_ERROR_UNKNOWN: |
| 313 | return "VK_ERROR_UNKNOWN"; | 313 | return "VK_ERROR_UNKNOWN"; |
| 314 | case VkResult::VK_ERROR_INCOMPATIBLE_VERSION_KHR: | ||
| 315 | return "VK_ERROR_INCOMPATIBLE_VERSION_KHR"; | ||
| 316 | case VkResult::VK_THREAD_IDLE_KHR: | 314 | case VkResult::VK_THREAD_IDLE_KHR: |
| 317 | return "VK_THREAD_IDLE_KHR"; | 315 | return "VK_THREAD_IDLE_KHR"; |
| 318 | case VkResult::VK_THREAD_DONE_KHR: | 316 | case VkResult::VK_THREAD_DONE_KHR: |