From f93a11313ed443b4f13be376a3c32f95c423cdef Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Wed, 21 Sep 2022 16:22:14 -0600 Subject: [PATCH] update parallel rdp --- parallel-rdp-standalone/COMMIT | 2 +- .../parallel-rdp/video_interface.cpp | 8 ++-- .../parallel-rdp/video_interface.hpp | 2 +- parallel-rdp-standalone/vulkan/context.cpp | 43 ++++--------------- parallel-rdp-standalone/vulkan/context.hpp | 7 ++- parallel-rdp-standalone/vulkan/device.cpp | 43 +++++++++++++++++++ parallel-rdp-standalone/vulkan/quirks.hpp | 1 + 7 files changed, 61 insertions(+), 45 deletions(-) diff --git a/parallel-rdp-standalone/COMMIT b/parallel-rdp-standalone/COMMIT index fbb311a..6a59991 100644 --- a/parallel-rdp-standalone/COMMIT +++ b/parallel-rdp-standalone/COMMIT @@ -1 +1 @@ -93d77f713ba0fbcf6bb9e654924e89f808b04398 +0f7cc6c3a13494a575dbbb977ff4424743b688d7 diff --git a/parallel-rdp-standalone/parallel-rdp/video_interface.cpp b/parallel-rdp-standalone/parallel-rdp/video_interface.cpp index 453c0ad..f18f663 100644 --- a/parallel-rdp-standalone/parallel-rdp/video_interface.cpp +++ b/parallel-rdp-standalone/parallel-rdp/video_interface.cpp @@ -716,7 +716,7 @@ void VideoInterface::bind_horizontal_info_view(Vulkan::CommandBuffer &cmd, const cmd.set_buffer_view(0, 1, *scanout_parameters_view); } -Vulkan::ImageHandle VideoInterface::scale_stage(Vulkan::CommandBuffer &cmd, Vulkan::Image &divot_image, +Vulkan::ImageHandle VideoInterface::scale_stage(Vulkan::CommandBuffer &cmd, const Vulkan::Image *divot_image, Registers regs, const HorizontalInfoLines &lines, unsigned scaling_factor, bool degenerate, const ScanoutOptions &options, bool final_pass) const @@ -902,14 +902,14 @@ Vulkan::ImageHandle VideoInterface::scale_stage(Vulkan::CommandBuffer &cmd, Vulk rect.extent.height = 0; }; - if (!degenerate && regs.h_res > 0 && regs.v_res > 0) + if (!degenerate && divot_image && regs.h_res > 0 && regs.v_res > 0) { VkRect2D rect = {{ regs.h_start, regs.v_start }, { uint32_t(regs.h_res), uint32_t(regs.v_res) }}; shift_rect(rect, -int(crop_left), -int(crop_top)); if (rect.extent.width > 0 && rect.extent.height > 0) { - cmd.set_texture(0, 0, divot_image.get_view()); + cmd.set_texture(0, 0, divot_image->get_view()); cmd.set_scissor(rect); cmd.draw(3); } @@ -1357,7 +1357,7 @@ Vulkan::ImageHandle VideoInterface::scanout(VkImageLayout target_layout, const S bool is_final_pass = !downscale_steps || scaling_factor <= 1; bool serrate = (regs.status & VI_CONTROL_SERRATE_BIT) != 0; - auto scale_image = scale_stage(*cmd, *divot_image, + auto scale_image = scale_stage(*cmd, divot_image.get(), regs, lines, scaling_factor, degenerate, options, is_final_pass); diff --git a/parallel-rdp-standalone/parallel-rdp/video_interface.hpp b/parallel-rdp-standalone/parallel-rdp/video_interface.hpp index 6265ab2..98a75e0 100644 --- a/parallel-rdp-standalone/parallel-rdp/video_interface.hpp +++ b/parallel-rdp-standalone/parallel-rdp/video_interface.hpp @@ -218,7 +218,7 @@ private: const Registers ®isters, unsigned scaling_factor) const; Vulkan::ImageHandle scale_stage(Vulkan::CommandBuffer &cmd, - Vulkan::Image &divot_image, + const Vulkan::Image *divot_image, Registers registers, const HorizontalInfoLines &lines, unsigned scaling_factor, diff --git a/parallel-rdp-standalone/vulkan/context.cpp b/parallel-rdp-standalone/vulkan/context.cpp index d6efd21..11abba4 100644 --- a/parallel-rdp-standalone/vulkan/context.cpp +++ b/parallel-rdp-standalone/vulkan/context.cpp @@ -59,7 +59,7 @@ bool Context::init_instance_and_device(const char **instance_ext, uint32_t insta } VkPhysicalDeviceFeatures features = {}; - if (!create_device(VK_NULL_HANDLE, VK_NULL_HANDLE, device_ext, device_ext_count, nullptr, 0, &features, flags)) + if (!create_device(VK_NULL_HANDLE, VK_NULL_HANDLE, device_ext, device_ext_count, &features, flags)) { destroy(); LOGE("Failed to create Vulkan device.\n"); @@ -96,6 +96,8 @@ bool Context::init_loader(PFN_vkGetInstanceProcAddr addr) #ifdef __APPLE__ if (!module) module = dlopen("libvulkan.1.dylib", RTLD_LOCAL | RTLD_LAZY); + if (!module) + module = dlopen("libMoltenVK.dylib", RTLD_LOCAL | RTLD_LAZY); #else if (!module) module = dlopen("libvulkan.so.1", RTLD_LOCAL | RTLD_LAZY); @@ -161,7 +163,6 @@ bool Context::init_from_instance_and_device(VkInstance instance_, VkPhysicalDevi bool Context::init_device_from_instance(VkInstance instance_, VkPhysicalDevice gpu_, VkSurfaceKHR surface, const char **required_device_extensions, unsigned num_required_device_extensions, - const char **required_device_layers, unsigned num_required_device_layers, const VkPhysicalDeviceFeatures *required_features, ContextCreationFlags flags) { @@ -174,8 +175,7 @@ bool Context::init_device_from_instance(VkInstance instance_, VkPhysicalDevice g if (!create_instance(nullptr, 0)) return false; - if (!create_device(gpu_, surface, required_device_extensions, num_required_device_extensions, required_device_layers, - num_required_device_layers, required_features, flags)) + if (!create_device(gpu_, surface, required_device_extensions, num_required_device_extensions, required_features, flags)) { destroy(); LOGE("Failed to create Vulkan device.\n"); @@ -466,8 +466,7 @@ QueueInfo::QueueInfo() } bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const char **required_device_extensions, - unsigned num_required_device_extensions, const char **required_device_layers, - unsigned num_required_device_layers, const VkPhysicalDeviceFeatures *required_features, + unsigned num_required_device_extensions, const VkPhysicalDeviceFeatures *required_features, ContextCreationFlags flags) { gpu = gpu_; @@ -535,12 +534,6 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c if (ext_count) vkEnumerateDeviceExtensionProperties(gpu, nullptr, &ext_count, queried_extensions.data()); - uint32_t layer_count = 0; - vkEnumerateDeviceLayerProperties(gpu, &layer_count, nullptr); - std::vector queried_layers(layer_count); - if (layer_count) - vkEnumerateDeviceLayerProperties(gpu, &layer_count, queried_layers.data()); - const auto has_extension = [&](const char *name) -> bool { auto itr = find_if(begin(queried_extensions), end(queried_extensions), [name](const VkExtensionProperties &e) -> bool { return strcmp(e.extensionName, name) == 0; @@ -548,21 +541,10 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c return itr != end(queried_extensions); }; - const auto has_layer = [&](const char *name) -> bool { - auto itr = find_if(begin(queried_layers), end(queried_layers), [name](const VkLayerProperties &e) -> bool { - return strcmp(e.layerName, name) == 0; - }); - return itr != end(queried_layers); - }; - for (uint32_t i = 0; i < num_required_device_extensions; i++) if (!has_extension(required_device_extensions[i])) return false; - for (uint32_t i = 0; i < num_required_device_layers; i++) - if (!has_layer(required_device_layers[i])) - return false; - vkGetPhysicalDeviceProperties(gpu, &gpu_props); if (gpu_props.apiVersion < VK_API_VERSION_1_1) @@ -699,12 +681,9 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c device_info.queueCreateInfoCount = uint32_t(queue_infos.size()); std::vector enabled_extensions; - std::vector enabled_layers; for (uint32_t i = 0; i < num_required_device_extensions; i++) enabled_extensions.push_back(required_device_extensions[i]); - for (uint32_t i = 0; i < num_required_device_layers; i++) - enabled_layers.push_back(required_device_layers[i]); if (has_extension(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME)) { @@ -786,6 +765,9 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c ext.supports_shader_float_control = true; } + if (has_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME)) + ext.supports_tooling_info = true; + #ifdef GRANITE_VULKAN_BETA if (has_extension(VK_KHR_VIDEO_QUEUE_EXTENSION_NAME)) { @@ -1067,13 +1049,6 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c device_info.pNext = &features; -#ifdef VULKAN_DEBUG - if (!force_no_validation && has_layer("VK_LAYER_KHRONOS_validation")) - enabled_layers.push_back("VK_LAYER_KHRONOS_validation"); - else if (!force_no_validation && has_layer("VK_LAYER_LUNARG_standard_validation")) - enabled_layers.push_back("VK_LAYER_LUNARG_standard_validation"); -#endif - if (ext.supports_external && has_extension(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME)) { ext.supports_external_memory_host = true; @@ -1149,8 +1124,6 @@ bool Context::create_device(VkPhysicalDevice gpu_, VkSurfaceKHR surface, const c device_info.enabledExtensionCount = enabled_extensions.size(); device_info.ppEnabledExtensionNames = enabled_extensions.empty() ? nullptr : enabled_extensions.data(); - device_info.enabledLayerCount = enabled_layers.size(); - device_info.ppEnabledLayerNames = enabled_layers.empty() ? nullptr : enabled_layers.data(); for (auto *enabled_extension : enabled_extensions) LOGI("Enabling device extension: %s.\n", enabled_extension); diff --git a/parallel-rdp-standalone/vulkan/context.hpp b/parallel-rdp-standalone/vulkan/context.hpp index 6883ad2..9d2cb87 100644 --- a/parallel-rdp-standalone/vulkan/context.hpp +++ b/parallel-rdp-standalone/vulkan/context.hpp @@ -70,6 +70,7 @@ struct DeviceFeatures bool supports_external = false; bool supports_image_format_list = false; bool supports_shader_float_control = false; + bool supports_tooling_info = false; // Vulkan 1.1 core VkPhysicalDeviceFeatures enabled_features = {}; @@ -151,8 +152,7 @@ public: ContextCreationFlags flags = 0); bool init_from_instance_and_device(VkInstance instance, VkPhysicalDevice gpu, VkDevice device, VkQueue queue, uint32_t queue_family); bool init_device_from_instance(VkInstance instance, VkPhysicalDevice gpu, VkSurfaceKHR surface, const char **required_device_extensions, - unsigned num_required_device_extensions, const char **required_device_layers, - unsigned num_required_device_layers, const VkPhysicalDeviceFeatures *required_features, + unsigned num_required_device_extensions, const VkPhysicalDeviceFeatures *required_features, ContextCreationFlags flags = 0); Context() = default; @@ -268,8 +268,7 @@ private: bool create_instance(const char **instance_ext, uint32_t instance_ext_count); bool create_device(VkPhysicalDevice gpu, VkSurfaceKHR surface, const char **required_device_extensions, - unsigned num_required_device_extensions, const char **required_device_layers, - unsigned num_required_device_layers, const VkPhysicalDeviceFeatures *required_features, + unsigned num_required_device_extensions, const VkPhysicalDeviceFeatures *required_features, ContextCreationFlags flags); bool owned_instance = false; diff --git a/parallel-rdp-standalone/vulkan/device.cpp b/parallel-rdp-standalone/vulkan/device.cpp index 33e7684..3b1d2d4 100644 --- a/parallel-rdp-standalone/vulkan/device.cpp +++ b/parallel-rdp-standalone/vulkan/device.cpp @@ -807,6 +807,28 @@ void Device::init_workarounds() workarounds.broken_pipeline_cache_control = true; } #endif + + if (ext.supports_tooling_info && vkGetPhysicalDeviceToolPropertiesEXT) + { + uint32_t count = 0; + vkGetPhysicalDeviceToolPropertiesEXT(gpu, &count, nullptr); + Util::SmallVector tool_props(count); + for (auto &t : tool_props) + t = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT }; + vkGetPhysicalDeviceToolPropertiesEXT(gpu, &count, tool_props.data()); + for (auto &t : tool_props) + { + LOGI(" Detected attached tool:\n"); + LOGI(" Name: %s\n", t.name); + LOGI(" Description: %s\n", t.description); + LOGI(" Version: %s\n", t.version); + if ((t.purposes & VK_TOOL_PURPOSE_TRACING_BIT_EXT) != 0) + { + LOGI("Detected tracing tool, forcing host cached memory types for performance.\n"); + workarounds.force_host_cached = true; + } + } + } } void Device::set_context(const Context &context) @@ -2869,6 +2891,27 @@ uint32_t Device::find_memory_type(uint32_t required, uint32_t mask) const uint32_t Device::find_memory_type(BufferDomain domain, uint32_t mask) const { uint32_t prio[3] = {}; + + // Optimize for tracing apps by not allocating host memory that is uncached. + if (workarounds.force_host_cached) + { + switch (domain) + { + case BufferDomain::LinkedDeviceHostPreferDevice: + domain = BufferDomain::Device; + break; + + case BufferDomain::LinkedDeviceHost: + case BufferDomain::Host: + case BufferDomain::CachedCoherentHostPreferCoherent: + domain = BufferDomain::CachedCoherentHostPreferCached; + break; + + default: + break; + } + } + switch (domain) { case BufferDomain::Device: diff --git a/parallel-rdp-standalone/vulkan/quirks.hpp b/parallel-rdp-standalone/vulkan/quirks.hpp index 98f53a0..9d03b7a 100644 --- a/parallel-rdp-standalone/vulkan/quirks.hpp +++ b/parallel-rdp-standalone/vulkan/quirks.hpp @@ -49,5 +49,6 @@ struct ImplementationWorkarounds bool optimize_all_graphics_barrier = false; bool split_binary_timeline_semaphores = false; bool broken_pipeline_cache_control = false; + bool force_host_cached = false; }; }