From 0a6a137eb27129e17298cfe9dd620205588ee4f6 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 17 Nov 2017 16:52:09 -0800 Subject: [PATCH] i965: Mark BOs as external when we export their handle Almost all of our BO export paths were already properly marked the BO as external and added it to the handle table. Most export use-cases go through a prime fd or flink where we have a brw_bo export helper that does the right thing. The one missing one happens when you call queryImage and ask for __DRI_IMAGE_ATTRIB_HANDLE. We just grabbed the gem handle out of the BO (because it's really easy to do that) and handed it off to the client; what could go wrong? As it turns out, this path is used by basically every compositor that wants to turn around and call drmModeAddFB2 on it so it can hand it off to display. The result, as of 4b1e70cc57d7ff5f465544644b2180dee1490cee, is that we no longer set MOCS_PTE on those surfaces and the kernel's attempts to disable caching fail and we scanout gets corruption. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103759 Fixes: 4b1e70cc57d7ff5f465544644b2180dee1490cee Reviewed-by: Kenneth Graunke Cc: mesa-stable@lists.freedesktop.org --- src/mesa/drivers/dri/i965/brw_bufmgr.c | 8 ++++++++ src/mesa/drivers/dri/i965/brw_bufmgr.h | 2 ++ src/mesa/drivers/dri/i965/intel_screen.c | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c index 60b0dad..2e5e0aa 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c @@ -1208,6 +1208,14 @@ brw_bo_gem_export_to_prime(struct brw_bo *bo, int *prime_fd) return 0; } +uint32_t +brw_bo_export_gem_handle(struct brw_bo *bo) +{ + brw_bo_make_external(bo); + + return bo->gem_handle; +} + int brw_bo_flink(struct brw_bo *bo, uint32_t *name) { diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h index ee91324..0ae541c 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h @@ -337,6 +337,8 @@ int brw_bo_gem_export_to_prime(struct brw_bo *bo, int *prime_fd); struct brw_bo *brw_bo_gem_create_from_prime(struct brw_bufmgr *bufmgr, int prime_fd); +uint32_t brw_bo_export_gem_handle(struct brw_bo *bo); + int brw_reg_read(struct brw_bufmgr *bufmgr, uint32_t offset, uint64_t *result); diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 4e48a85..38769ba 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -835,7 +835,7 @@ intel_query_image(__DRIimage *image, int attrib, int *value) *value = image->pitch; return true; case __DRI_IMAGE_ATTRIB_HANDLE: - *value = image->bo->gem_handle; + *value = brw_bo_export_gem_handle(image->bo); return true; case __DRI_IMAGE_ATTRIB_NAME: return !brw_bo_flink(image->bo, (uint32_t *) value); -- 2.7.4