From af6f6ce065bed69b08d18470b148f6ca6e035597 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 8 Jul 2022 16:21:25 -0500 Subject: [PATCH] vulkan/wsi: Add debug variables to force the SW and PRIME buffer blit paths Reviewed-by: Jesse Natalie Part-of: --- src/vulkan/wsi/wsi_common.c | 18 ++++++++++++++++-- src/vulkan/wsi/wsi_common_private.h | 7 +++++++ src/vulkan/wsi/wsi_common_wayland.c | 3 ++- src/vulkan/wsi/wsi_common_x11.c | 3 ++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 9be60dddf9c..7a8a95b109c 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -23,6 +23,7 @@ #include "wsi_common_private.h" #include "wsi_common_entrypoints.h" +#include "util/debug.h" #include "util/macros.h" #include "util/os_file.h" #include "util/xmlconfig.h" @@ -45,6 +46,16 @@ #include #endif +uint64_t WSI_DEBUG; + +static const struct debug_control debug_control[] = { + { "buffer", WSI_DEBUG_BUFFER }, + { "sw", WSI_DEBUG_SW }, + { "noshm", WSI_DEBUG_NOSHM }, + { "linear", WSI_DEBUG_LINEAR }, + { NULL, }, +}; + VkResult wsi_device_init(struct wsi_device *wsi, VkPhysicalDevice pdevice, @@ -57,11 +68,14 @@ wsi_device_init(struct wsi_device *wsi, const char *present_mode; UNUSED VkResult result; + WSI_DEBUG = parse_debug_string(getenv("MESA_VK_WSI_DEBUG"), debug_control); + memset(wsi, 0, sizeof(*wsi)); wsi->instance_alloc = *alloc; wsi->pdevice = pdevice; - wsi->sw = sw_device; + wsi->sw = sw_device || (WSI_DEBUG & WSI_DEBUG_SW); + wsi->wants_linear = (WSI_DEBUG & WSI_DEBUG_LINEAR) != 0; #define WSI_GET_CB(func) \ PFN_vk##func func = (PFN_vk##func)proc_addr(pdevice, "vk" #func) WSI_GET_CB(GetPhysicalDeviceExternalSemaphoreProperties); @@ -271,7 +285,7 @@ wsi_swapchain_init(const struct wsi_device *wsi, chain->device = _device; chain->alloc = *pAllocator; - chain->use_buffer_blit = use_buffer_blit; + chain->use_buffer_blit = use_buffer_blit || (WSI_DEBUG & WSI_DEBUG_BUFFER); if (wsi->sw && !wsi->wants_linear) chain->use_buffer_blit = true; diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index 0981d6cf06e..1d1d5a9efe6 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -30,6 +30,13 @@ struct wsi_image; struct wsi_swapchain; +#define WSI_DEBUG_BUFFER (1ull << 0) +#define WSI_DEBUG_SW (1ull << 1) +#define WSI_DEBUG_NOSHM (1ull << 2) +#define WSI_DEBUG_LINEAR (1ull << 3) + +extern uint64_t WSI_DEBUG; + struct wsi_image_info { VkImageCreateInfo create; struct wsi_image_create_info wsi; diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 0b9bc6a9814..2ba6cb1389c 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -1299,7 +1299,8 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->extent = pCreateInfo->imageExtent; chain->vk_format = pCreateInfo->imageFormat; if (wsi_device->sw) { - chain->buffer_type = chain->base.wsi->has_import_memory_host ? + chain->buffer_type = (chain->base.wsi->has_import_memory_host && + !(WSI_DEBUG & WSI_DEBUG_NOSHM)) ? WSI_WL_BUFFER_GPU_SHM : WSI_WL_BUFFER_SHM_MEMCPY; chain->shm_format = wl_shm_format_for_vk_format(chain->vk_format, alpha); } else { diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index baccc8ffe78..f0f3d784a81 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -196,7 +196,8 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev, xcb_query_extension_reply_t *dri3_reply, *pres_reply, *randr_reply, *amd_reply, *nv_reply, *shm_reply = NULL, *xfixes_reply; - bool wants_shm = wsi_dev->sw && wsi_dev->has_import_memory_host; + bool wants_shm = wsi_dev->sw && !(WSI_DEBUG & WSI_DEBUG_NOSHM) && + wsi_dev->has_import_memory_host; bool has_dri3_v1_2 = false; bool has_present_v1_2 = false;