gbm/dri: Check dri extension version before flush after unmap
[mesa.git] / src / gbm / backends / dri / gbm_dri.c
index 84b4dd88530ae910ed04c424fd39b1ea9b657b41..8df6a6b64d0b44bf77da468a41b15e0bd0dc3e59 100644 (file)
@@ -710,22 +710,23 @@ gbm_dri_bo_get_stride(struct gbm_bo *_bo, int plane)
    return (uint32_t)stride;
 }
 
-static int64_t
+static uint32_t
 gbm_dri_bo_get_offset(struct gbm_bo *_bo, int plane)
 {
    struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
    struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
    int offset = 0;
 
-   if (!dri->image || dri->image->base.version < 13 || !dri->image->fromPlanar) {
-      errno = ENOSYS;
-      return -1;
-   }
+   /* These error cases do not actually return an error code, as the user
+    * will also fail to obtain the handle/FD from the BO. In that case, the
+    * offset is irrelevant, as they have no buffer to offset into, so
+    * returning 0 is harmless.
+    */
+   if (!dri->image || dri->image->base.version < 13 || !dri->image->fromPlanar)
+      return 0;
 
-   if (plane >= get_number_planes(dri, bo->image)) {
-      errno = EINVAL;
-      return -2;
-   }
+   if (plane >= get_number_planes(dri, bo->image))
+      return 0;
 
     /* Dumb images have no offset */
    if (bo->image == NULL) {
@@ -1238,6 +1239,14 @@ gbm_dri_bo_unmap(struct gbm_bo *_bo, void *map_data)
       return;
 
    dri->image->unmapImage(dri->context, bo->image, map_data);
+
+   /*
+    * Not all DRI drivers use direct maps. They may queue up DMA operations
+    * on the mapping context. Since there is no explicit gbm flush
+    * mechanism, we need to flush here.
+    */
+   if (dri->flush->base.version >= 4)
+      dri->flush->flush_with_flags(dri->context, NULL, __DRI2_FLUSH_CONTEXT, 0);
 }