diff --git a/docs/env_vars.md b/docs/env_vars.md index a2a86c84d..cf21a7231 100644 --- a/docs/env_vars.md +++ b/docs/env_vars.md @@ -49,6 +49,10 @@ wlroots reads these environment variables * *WLR_RENDERER_ALLOW_SOFTWARE*: allows the gles2 renderer to use software rendering +## Vulkan renderer + +* *WLR_VK_DIRECT_SHM_IMPORT*: Allow importing shm buffers directly as host memory + ## scenes * *WLR_SCENE_DEBUG_DAMAGE*: specifies debug options for screen damage related diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 17467a25f..d99b6f5a5 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -324,6 +324,8 @@ struct wlr_vk_renderer { VkImage dst_image; VkDeviceMemory dst_img_memory; } read_pixels_cache; + + bool direct_shm_import; }; // vertex shader push constant range data diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 3aa66e5c6..b78f62fca 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -27,6 +27,7 @@ #include "render/vulkan/shaders/output.frag.h" #include "types/wlr_buffer.h" #include "types/wlr_matrix.h" +#include "util/env.h" // TODO: // - simplify stage allocation, don't track allocations but use ringbuffer-like @@ -2417,6 +2418,8 @@ struct wlr_renderer *vulkan_renderer_create_for_device(struct wlr_vk_device *dev wl_list_init(&renderer->color_transforms); wl_list_init(&renderer->pipeline_layouts); + renderer->direct_shm_import = env_parse_bool("WLR_VK_DIRECT_SHM_IMPORT"); + if (!init_static_render_data(renderer)) { goto error; } diff --git a/render/vulkan/texture.c b/render/vulkan/texture.c index b7130bd9e..b4558bd60 100644 --- a/render/vulkan/texture.c +++ b/render/vulkan/texture.c @@ -456,7 +456,8 @@ static struct wlr_texture *vulkan_texture_from_pixels( img_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; } - if (renderer->dev->api.vkGetMemoryHostPointerPropertiesEXT) { + if (renderer->direct_shm_import && + renderer->dev->api.vkGetMemoryHostPointerPropertiesEXT) { img_info.tiling = VK_IMAGE_TILING_LINEAR; img_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;