diff --git a/rpcs3/Emu/RSX/VK/VKCompute.h b/rpcs3/Emu/RSX/VK/VKCompute.h index c2da2a52bd..43ed34347c 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.h +++ b/rpcs3/Emu/RSX/VK/VKCompute.h @@ -73,7 +73,7 @@ namespace vk switch (vk::get_driver_vendor()) { case vk::driver_vendor::unknown: - // Probably intel + case vk::driver_vendor::INTEL: case vk::driver_vendor::NVIDIA: unroll_loops = true; optimal_group_size = 32; diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index 9e0b9611a3..a85ab39080 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -235,7 +235,7 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) properties2.require_wpos = properties.has_wpos_input; properties2.require_texture_ops = properties.has_tex_op; properties2.emulate_shadow_compare = device_props.emulate_depth_compare; - properties2.low_precision_tests = vk::get_current_renderer()->gpu().get_driver_vendor() == vk::driver_vendor::NVIDIA; + properties2.low_precision_tests = vk::get_driver_vendor() == vk::driver_vendor::NVIDIA; glsl::insert_glsl_legacy_function(OS, properties2); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index a43656ac1b..629b610db5 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1067,6 +1067,13 @@ void VKGSRender::check_descriptors() void VKGSRender::check_window_status() { + if (m_swapchain->supports_automatic_wm_reports()) + { + // This driver will report window events as VK_ERROR_OUT_OF_DATE_KHR + m_frame->clear_wm_events(); + return; + } + #ifdef _WIN32 if (LIKELY(!m_frame->has_wm_events())) @@ -2032,8 +2039,11 @@ void VKGSRender::on_init_thread() m_frame->enable_wm_event_queue(); #ifdef _WIN32 - // On windows switching to fullscreen is done by the renderer, not the UI - m_frame->disable_wm_fullscreen(); + if (!m_swapchain->supports_automatic_wm_reports()) + { + // If the renderer does not handle WM events itself, switching to fullscreen is done by the renderer, not the UI + m_frame->disable_wm_fullscreen(); + } #endif } } @@ -2355,6 +2365,7 @@ void VKGSRender::present(frame_context_t *ctx) switch (VkResult error = m_swapchain->present(ctx->present_image)) { case VK_SUCCESS: + break; case VK_SUBOPTIMAL_KHR: break; case VK_ERROR_OUT_OF_DATE_KHR: diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index b9d8ee976c..1b8d8aea83 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -313,6 +313,7 @@ namespace vk // Nvidia cards are easily susceptible to NaN poisoning g_drv_sanitize_fp_values = true; break; + case driver_vendor::INTEL: default: LOG_WARNING(RSX, "Unsupported device: %s", gpu_name); } diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index f694579bf6..fdd0ec5f2e 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -78,7 +78,8 @@ namespace vk unknown, AMD, NVIDIA, - RADV + RADV, + INTEL }; class context; @@ -448,6 +449,11 @@ namespace vk return driver_vendor::RADV; } + if (gpu_name.find("Intel") != std::string::npos) + { + return driver_vendor::INTEL; + } + return driver_vendor::unknown; } @@ -1627,6 +1633,11 @@ public: virtual VkResult present(u32 index) = 0; virtual VkImageLayout get_optimal_present_layout() = 0; + virtual bool supports_automatic_wm_reports() const + { + return false; + } + virtual bool init(u32 w, u32 h) { m_width = w; @@ -1972,6 +1983,8 @@ public: PFN_vkAcquireNextImageKHR acquireNextImageKHR = nullptr; PFN_vkQueuePresentKHR queuePresentKHR = nullptr; + bool m_wm_reports_flag = false; + protected: void init_swapchain_images(render_device& dev, u32 /*preferred_count*/ = 0) override { @@ -2003,6 +2016,26 @@ public: m_surface = surface; m_color_space = color_space; + + switch (gpu.get_driver_vendor()) + { + case driver_vendor::NVIDIA: +#ifndef _WIN32 + m_wm_reports_flag = true; +#endif + break; + case driver_vendor::AMD: +#ifdef _WIN32 + break; +#endif + case driver_vendor::INTEL: + // Untested + case driver_vendor::RADV: + m_wm_reports_flag = true; + break; + default: + break; + } } ~swapchain_WSI() @@ -2165,6 +2198,11 @@ public: return true; } + bool supports_automatic_wm_reports() const override + { + return m_wm_reports_flag; + } + VkResult acquire_next_swapchain_image(VkSemaphore semaphore, u64 timeout, u32* result) override { return vkAcquireNextImageKHR(dev, m_vk_swapchain, timeout, semaphore, VK_NULL_HANDLE, result);