From: Dave Airlie Date: Tue, 26 Mar 2013 16:11:05 +0000 (-0400) Subject: drm: inform kernel about recently flushed areas X-Git-Tag: 0.9.0~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=32ae2addfb1955e0584f16299c745e23efd3a299;p=thirdparty%2Fplymouth.git drm: inform kernel about recently flushed areas Some drivers (QXL in particular) require to be notified when a part of the mapped frame buffer memory is changed. This commit adds a drmModeDirtyFB call after flushing changes to the frame buffer to accomplish that. --- diff --git a/src/plugins/renderers/drm/ply-renderer-generic-driver.c b/src/plugins/renderers/drm/ply-renderer-generic-driver.c index 50fde64f..45a8faab 100644 --- a/src/plugins/renderers/drm/ply-renderer-generic-driver.c +++ b/src/plugins/renderers/drm/ply-renderer-generic-driver.c @@ -71,6 +71,8 @@ struct _ply_renderer_driver { int device_fd; ply_hashtable_t *buffers; + + uint32_t requires_explicit_flushing : 1; }; static bool @@ -123,7 +125,7 @@ create_driver (int device_fd) driver = calloc (1, sizeof (ply_renderer_driver_t)); driver->device_fd = device_fd; - + driver->requires_explicit_flushing = true; driver->buffers = ply_hashtable_new (ply_hashtable_direct_hash, ply_hashtable_direct_compare); @@ -330,6 +332,22 @@ end_flush (ply_renderer_driver_t *driver, buffer = get_buffer_from_id (driver, buffer_id); assert (buffer != NULL); + + if (driver->requires_explicit_flushing) + { + struct drm_clip_rect flush_area; + int ret; + + flush_area.x1 = 0; + flush_area.y1 = 0; + flush_area.x2 = buffer->width; + flush_area.y2 = buffer->height; + + ret = drmModeDirtyFB (driver->device_fd, buffer->id, &flush_area, 1); + + if (ret == -ENOSYS) + driver->requires_explicit_flushing = false; + } } static void