diff options
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/wsi/wsi_common.c | 2 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common.h | 6 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common_private.h | 3 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common_x11.c | 14 |
4 files changed, 22 insertions, 3 deletions
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 50304e773c9..b8f6c6d70de 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -101,7 +101,7 @@ wsi_device_init(struct wsi_device *wsi, #undef WSI_GET_CB #ifdef VK_USE_PLATFORM_XCB_KHR - result = wsi_x11_init_wsi(wsi, alloc); + result = wsi_x11_init_wsi(wsi, alloc, dri_options); if (result != VK_SUCCESS) goto fail; #endif diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 46e51286e09..b00fc3c1857 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -109,6 +109,12 @@ struct wsi_device { * available. Not all window systems might support this. */ bool enable_adaptive_sync; + struct { + /* Override the minimum number of images on the swapchain. + * 0 = no override */ + uint32_t override_minImageCount; + } x11; + uint64_t (*image_get_modifier)(VkImage image); #define WSI_CB(cb) PFN_vk##cb cb diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index 60d45bc5400..88c360a2409 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -138,7 +138,8 @@ struct wsi_interface { }; VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device, - const VkAllocationCallbacks *alloc); + const VkAllocationCallbacks *alloc, + const struct driOptionCache *dri_options); void wsi_x11_finish_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc); VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device, diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 91130432a3e..af61bb91dca 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -38,6 +38,7 @@ #include <xf86drm.h> #include "drm-uapi/drm_fourcc.h" #include "util/hash_table.h" +#include "util/xmlconfig.h" #include "vk_util.h" #include "wsi_common_private.h" @@ -523,6 +524,9 @@ x11_surface_get_capabilities(VkIcdSurfaceBase *icd_surface, /* There is no real maximum */ caps->maxImageCount = 0; + if (wsi_device->x11.override_minImageCount) + caps->minImageCount = wsi_device->x11.override_minImageCount; + caps->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->currentTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->maxImageArrayLayers = 1; @@ -1589,7 +1593,8 @@ fail_alloc: VkResult wsi_x11_init_wsi(struct wsi_device *wsi_device, - const VkAllocationCallbacks *alloc) + const VkAllocationCallbacks *alloc, + const struct driOptionCache *dri_options) { struct wsi_x11 *wsi; VkResult result; @@ -1620,6 +1625,13 @@ wsi_x11_init_wsi(struct wsi_device *wsi_device, goto fail_mutex; } + if (dri_options) { + if (driCheckOption(dri_options, "vk_x11_override_min_image_count", DRI_INT)) { + wsi_device->x11.override_minImageCount = + driQueryOptioni(dri_options, "vk_x11_override_min_image_count"); + } + } + wsi->base.get_support = x11_surface_get_support; wsi->base.get_capabilities2 = x11_surface_get_capabilities2; wsi->base.get_formats = x11_surface_get_formats; |