mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-11 09:18:40 +12:00
vk: Improve driver compatibility
- Add workarounds to disable compression on mesa drivers - Separate intel proprietary vs mesa into two enumerants
This commit is contained in:
parent
47e784d5d0
commit
8848dc6673
7 changed files with 46 additions and 9 deletions
|
@ -75,6 +75,7 @@ namespace vk
|
||||||
{
|
{
|
||||||
case vk::driver_vendor::unknown:
|
case vk::driver_vendor::unknown:
|
||||||
case vk::driver_vendor::INTEL:
|
case vk::driver_vendor::INTEL:
|
||||||
|
case vk::driver_vendor::ANV:
|
||||||
// Intel hw has 8 threads, but LDS allocation behavior makes optimal group size between 64 and 256
|
// Intel hw has 8 threads, but LDS allocation behavior makes optimal group size between 64 and 256
|
||||||
// Based on intel's own OpenCL recommended settings
|
// Based on intel's own OpenCL recommended settings
|
||||||
unroll_loops = true;
|
unroll_loops = true;
|
||||||
|
|
|
@ -583,7 +583,7 @@ VKGSRender::VKGSRender() : GSRender()
|
||||||
case vk::driver_vendor::AMD:
|
case vk::driver_vendor::AMD:
|
||||||
#if !defined(__linux__)
|
#if !defined(__linux__)
|
||||||
// Intel chipsets would fail on BSD in most cases and DRM_IOCTL_i915_GEM_USERPTR unimplemented
|
// Intel chipsets would fail on BSD in most cases and DRM_IOCTL_i915_GEM_USERPTR unimplemented
|
||||||
case vk::driver_vendor::INTEL:
|
case vk::driver_vendor::ANV:
|
||||||
#endif
|
#endif
|
||||||
if (backend_config.supports_passthrough_dma)
|
if (backend_config.supports_passthrough_dma)
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,6 +121,9 @@ namespace vk
|
||||||
g_drv_sanitize_fp_values = true;
|
g_drv_sanitize_fp_values = true;
|
||||||
break;
|
break;
|
||||||
case driver_vendor::INTEL:
|
case driver_vendor::INTEL:
|
||||||
|
case driver_vendor::ANV:
|
||||||
|
// INTEL vulkan drivers are mostly OK, workarounds are applied when creating the device
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
rsx_log.warning("Unsupported device: %s", gpu_name);
|
rsx_log.warning("Unsupported device: %s", gpu_name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,35 @@ namespace vk
|
||||||
using download_buffer_object = void*;
|
using download_buffer_object = void*;
|
||||||
using barrier_descriptor_t = rsx::deferred_clipped_region<vk::render_target*>;
|
using barrier_descriptor_t = rsx::deferred_clipped_region<vk::render_target*>;
|
||||||
|
|
||||||
|
static VkFlags get_attachment_compression_usage_flags()
|
||||||
|
{
|
||||||
|
if (g_cfg.video.strict_rendering_mode)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (vk::get_driver_vendor())
|
||||||
|
{
|
||||||
|
case driver_vendor::NVIDIA:
|
||||||
|
case driver_vendor::INTEL:
|
||||||
|
case driver_vendor::AMD: // TODO
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Workaround to force transition to GENERAL to decompress.
|
||||||
|
// Fixes corruption in FBO loops for ANV and RADV.
|
||||||
|
case driver_vendor::ANV:
|
||||||
|
return VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
|
case driver_vendor::RADV:
|
||||||
|
// Only needed for GFX10+
|
||||||
|
return (vk::get_chip_family() >= chip_class::AMD_navi1x) ?
|
||||||
|
VK_IMAGE_USAGE_STORAGE_BIT : 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rsx_log.error("Unknown driver vendor!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static std::unique_ptr<vk::render_target> create_new_surface(
|
static std::unique_ptr<vk::render_target> create_new_surface(
|
||||||
u32 address,
|
u32 address,
|
||||||
rsx::surface_color_format format,
|
rsx::surface_color_format format,
|
||||||
|
@ -115,7 +144,7 @@ namespace vk
|
||||||
VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
if (samples == 1) [[likely]]
|
if (samples == 1) [[likely]]
|
||||||
{
|
{
|
||||||
usage_flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
|
usage_flags |= get_attachment_compression_usage_flags() | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -180,7 +209,7 @@ namespace vk
|
||||||
|
|
||||||
if (samples == 1) [[likely]]
|
if (samples == 1) [[likely]]
|
||||||
{
|
{
|
||||||
usage_flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
usage_flags |= get_attachment_compression_usage_flags() | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<vk::render_target> ds;
|
std::unique_ptr<vk::render_target> ds;
|
||||||
|
|
|
@ -29,7 +29,8 @@ namespace vk
|
||||||
AMD,
|
AMD,
|
||||||
NVIDIA,
|
NVIDIA,
|
||||||
RADV,
|
RADV,
|
||||||
INTEL
|
INTEL,
|
||||||
|
ANV
|
||||||
};
|
};
|
||||||
|
|
||||||
driver_vendor get_driver_vendor();
|
driver_vendor get_driver_vendor();
|
||||||
|
|
|
@ -128,7 +128,11 @@ namespace vk
|
||||||
|
|
||||||
if (gpu_name.find("Intel") != umax)
|
if (gpu_name.find("Intel") != umax)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
return driver_vendor::INTEL;
|
return driver_vendor::INTEL;
|
||||||
|
#else
|
||||||
|
return driver_vendor::ANV;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return driver_vendor::unknown;
|
return driver_vendor::unknown;
|
||||||
|
@ -145,10 +149,11 @@ namespace vk
|
||||||
case VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR:
|
case VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR:
|
||||||
return driver_vendor::NVIDIA;
|
return driver_vendor::NVIDIA;
|
||||||
case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR:
|
case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR:
|
||||||
case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR:
|
|
||||||
return driver_vendor::INTEL;
|
return driver_vendor::INTEL;
|
||||||
|
case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR:
|
||||||
|
return driver_vendor::ANV;
|
||||||
default:
|
default:
|
||||||
// Mobile
|
// Mobile?
|
||||||
return driver_vendor::unknown;
|
return driver_vendor::unknown;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -520,11 +520,9 @@ namespace vk
|
||||||
switch (gpu.get_driver_vendor())
|
switch (gpu.get_driver_vendor())
|
||||||
{
|
{
|
||||||
case driver_vendor::AMD:
|
case driver_vendor::AMD:
|
||||||
break;
|
|
||||||
case driver_vendor::INTEL:
|
case driver_vendor::INTEL:
|
||||||
#ifdef _WIN32
|
|
||||||
break;
|
break;
|
||||||
#endif
|
case driver_vendor::ANV:
|
||||||
case driver_vendor::NVIDIA:
|
case driver_vendor::NVIDIA:
|
||||||
case driver_vendor::RADV:
|
case driver_vendor::RADV:
|
||||||
m_wm_reports_flag = true;
|
m_wm_reports_flag = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue