summaryrefslogtreecommitdiffstats
path: root/src/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'src/vulkan')
-rw-r--r--src/vulkan/wsi/wsi_common.c2
-rw-r--r--src/vulkan/wsi/wsi_common.h6
-rw-r--r--src/vulkan/wsi/wsi_common_private.h3
-rw-r--r--src/vulkan/wsi/wsi_common_x11.c14
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;