Mesa (staging/19.2): vulkan: add vk_x11_strict_image_count option

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Sep 16 15:55:50 UTC 2019


Module: Mesa
Branch: staging/19.2
Commit: 9d68cb64b0e44d283fde90ea825fb64693dd8b4b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d68cb64b0e44d283fde90ea825fb64693dd8b4b

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Thu Sep  5 23:54:53 2019 +0300

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 at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111522
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Eric Engestrom <eric.engestrom at intel.com>
Cc: 19.2 <mesa-stable at lists.freedesktop.org>
(cherry picked from commit 0616b7ac90cf4f86bb409d34101e3a3cceac8cbe)

---

 src/amd/vulkan/radv_device.c    | 1 +
 src/intel/vulkan/anv_device.c   | 1 +
 src/util/00-mesa-defaults.conf  | 9 +++++++++
 src/util/xmlpool/t_options.h    | 5 +++++
 src/vulkan/wsi/wsi_common.h     | 5 +++++
 src/vulkan/wsi/wsi_common_x11.c | 8 +++++++-
 6 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 974699387ac..f87e17527e0 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -592,6 +592,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;
 
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index bf14ebd7cdf..1425f5a398b 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -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;
 
diff --git a/src/util/00-mesa-defaults.conf b/src/util/00-mesa-defaults.conf
index 3deb8aee1a5..8f3e84788d9 100644
--- a/src/util/00-mesa-defaults.conf
+++ b/src/util/00-mesa-defaults.conf
@@ -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">
diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h
index 07eb4fdba2a..6e9c26a6c91 100644
--- a/src/util/xmlpool/t_options.h
+++ b/src/util/xmlpool/t_options.h
@@ -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")) \
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index b00fc3c1857..064b16a5e7a 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -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);
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index af61bb91dca..491bd8a3702 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -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;




More information about the mesa-commit mailing list