vulkan: add vk_x11_strict_image_count option
This option strictly allocate the minImageCount given by the application at swapchain creation. This works around application that do not deal with the fact that the implementation allocates more images than the minimum specified. v2: Add values in default drirc (Bas) v3: specify engine name/version (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111522 Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Reviewed-by: Eric Engestrom <eric.engestrom@intel.com> Cc: 19.2 <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
04dc6074cf
commit
0616b7ac90
|
@ -559,6 +559,7 @@ DRI_CONF_BEGIN
|
|||
DRI_CONF_SECTION_PERFORMANCE
|
||||
DRI_CONF_ADAPTIVE_SYNC("true")
|
||||
DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
|
||||
DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false")
|
||||
DRI_CONF_SECTION_END
|
||||
DRI_CONF_END;
|
||||
|
||||
|
|
|
@ -52,6 +52,7 @@ static const char anv_dri_options_xml[] =
|
|||
DRI_CONF_BEGIN
|
||||
DRI_CONF_SECTION_PERFORMANCE
|
||||
DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
|
||||
DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false")
|
||||
DRI_CONF_SECTION_END
|
||||
DRI_CONF_END;
|
||||
|
||||
|
|
|
@ -469,6 +469,15 @@ TODO: document the other workarounds.
|
|||
<application name="Rayman Legends" executable="Rayman Legends.exe">
|
||||
<option name="dynamic_texture_workaround" value="true" />
|
||||
</application>
|
||||
|
||||
<!-- Vulkan workarounds: -->
|
||||
|
||||
<!-- Works around the game not starting (does not deal with
|
||||
the implementation returning more images than the minimum
|
||||
specified by the application. -->
|
||||
<engine engine_name_match="UnrealEngine4.*" engine_versions="0:21">
|
||||
<option name="vk_x11_strict_image_count" value="true" />
|
||||
</engine>
|
||||
</device>
|
||||
<!-- vmwgfx doesn't like full buffer swaps and can't sync to vertical retraces.-->
|
||||
<device driver="vmwgfx">
|
||||
|
|
|
@ -225,6 +225,11 @@ DRI_CONF_OPT_BEGIN_V(vk_x11_override_min_image_count, int, def, "0:999") \
|
|||
DRI_CONF_DESC(en,gettext("Override the VkSurfaceCapabilitiesKHR::minImageCount (0 = no override)")) \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(def) \
|
||||
DRI_CONF_OPT_BEGIN_B(vk_x11_strict_image_count, def) \
|
||||
DRI_CONF_DESC(en,gettext("Force the X11 WSI to create exactly the number of image specified by the application in VkSwapchainCreateInfoKHR::minImageCount")) \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_MESA_GLTHREAD(def) \
|
||||
DRI_CONF_OPT_BEGIN_B(mesa_glthread, def) \
|
||||
DRI_CONF_DESC(en,gettext("Enable offloading GL driver work to a separate thread")) \
|
||||
|
|
|
@ -113,6 +113,11 @@ struct wsi_device {
|
|||
/* Override the minimum number of images on the swapchain.
|
||||
* 0 = no override */
|
||||
uint32_t override_minImageCount;
|
||||
|
||||
/* Forces strict number of image on the swapchain using application
|
||||
* provided VkSwapchainCreateInfoKH::RminImageCount.
|
||||
*/
|
||||
bool strict_imageCount;
|
||||
} x11;
|
||||
|
||||
uint64_t (*image_get_modifier)(VkImage image);
|
||||
|
|
|
@ -1413,7 +1413,9 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
|
|||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR);
|
||||
|
||||
unsigned num_images = pCreateInfo->minImageCount;
|
||||
if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR)
|
||||
if (wsi_device->x11.strict_imageCount)
|
||||
num_images = pCreateInfo->minImageCount;
|
||||
else if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR)
|
||||
num_images = MAX2(num_images, 5);
|
||||
|
||||
xcb_connection_t *conn = x11_surface_get_connection(icd_surface);
|
||||
|
@ -1630,6 +1632,10 @@ wsi_x11_init_wsi(struct wsi_device *wsi_device,
|
|||
wsi_device->x11.override_minImageCount =
|
||||
driQueryOptioni(dri_options, "vk_x11_override_min_image_count");
|
||||
}
|
||||
if (driCheckOption(dri_options, "vk_x11_strict_image_count", DRI_BOOL)) {
|
||||
wsi_device->x11.strict_imageCount =
|
||||
driQueryOptionb(dri_options, "vk_x11_strict_image_count");
|
||||
}
|
||||
}
|
||||
|
||||
wsi->base.get_support = x11_surface_get_support;
|
||||
|
|
Loading…
Reference in New Issue