summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pipeline.cpp7
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp15
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp26
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h33
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.cpp2
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
133void ComputePipeline::ConfigureBufferCache(BufferCache& buffer_cache) { 133void 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
433Device::~Device() = default; 433Device::~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
808void Device::SetupFeatures() { 808void 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
816void 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
816void Device::CollectTelemetryParameters() { 826void 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: