diff --git a/src/imagination/vulkan/pvr_arch_device.c b/src/imagination/vulkan/pvr_arch_device.c index ee45f408fd5..a28179d6ccd 100644 --- a/src/imagination/vulkan/pvr_arch_device.c +++ b/src/imagination/vulkan/pvr_arch_device.c @@ -703,7 +703,7 @@ VkResult PVR_PER_ARCH(create_device)(struct pvr_physical_device *pdevice, assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO); result = pvr_winsys_create(pdevice->render_path, - pdevice->display_path, + pdevice->display_path, false, pAllocator ? pAllocator : &instance->vk.alloc, &ws); if (result != VK_SUCCESS) diff --git a/src/imagination/vulkan/pvr_physical_device.c b/src/imagination/vulkan/pvr_physical_device.c index 1fd79194d9b..219fd89b7c7 100644 --- a/src/imagination/vulkan/pvr_physical_device.c +++ b/src/imagination/vulkan/pvr_physical_device.c @@ -1031,7 +1031,8 @@ VkResult pvr_physical_device_init(struct pvr_physical_device *pdevice, pdevice->render_devid = render_stat.st_rdev; result = - pvr_winsys_create(render_path, display_path, &instance->vk.alloc, &ws); + pvr_winsys_create(render_path, display_path, true, + &instance->vk.alloc, &ws); if (result != VK_SUCCESS) goto err_vk_free_display_path; diff --git a/src/imagination/vulkan/winsys/pvr_winsys.c b/src/imagination/vulkan/winsys/pvr_winsys.c index 058823e8608..64c5c76b175 100644 --- a/src/imagination/vulkan/winsys/pvr_winsys.c +++ b/src/imagination/vulkan/winsys/pvr_winsys.c @@ -50,6 +50,7 @@ void pvr_winsys_destroy(struct pvr_winsys *ws) VkResult pvr_winsys_create(const char *render_path, const char *display_path, + bool keep_display_master, const VkAllocationCallbacks *alloc, struct pvr_winsys **const ws_out) { @@ -76,6 +77,12 @@ VkResult pvr_winsys_create(const char *render_path, display_path); goto err_close_render_fd; } + if (!keep_display_master) { + /* Try to drop master for the display FD if it's not meant to be + * kept, but not to fail if it's not the master at opening time. + */ + drmDropMaster(display_fd); + } } else { display_fd = -1; } diff --git a/src/imagination/vulkan/winsys/pvr_winsys.h b/src/imagination/vulkan/winsys/pvr_winsys.h index 616e67adc50..90b229244c6 100644 --- a/src/imagination/vulkan/winsys/pvr_winsys.h +++ b/src/imagination/vulkan/winsys/pvr_winsys.h @@ -476,6 +476,7 @@ struct pvr_winsys { void pvr_winsys_destroy(struct pvr_winsys *ws); VkResult pvr_winsys_create(const char *render_path, const char *display_path, + bool keep_display_master, const VkAllocationCallbacks *alloc, struct pvr_winsys **ws_out);