Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/gem-fb-helper: Add drm_gem_fb_create_with_dirty()

This adds a .fb_create helper that sets the .dirty callback to
drm_atomic_helper_dirtyfb().

v2: Improve docs (Daniel)

Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190115043643.2364-2-noralf@tronnes.org

+47 -6
+44 -6
drivers/gpu/drm/drm_gem_framebuffer_helper.c
··· 17 17 #include <drm/drmP.h> 18 18 #include <drm/drm_atomic.h> 19 19 #include <drm/drm_atomic_uapi.h> 20 + #include <drm/drm_damage_helper.h> 20 21 #include <drm/drm_fb_helper.h> 21 22 #include <drm/drm_fourcc.h> 22 23 #include <drm/drm_framebuffer.h> ··· 137 136 * @mode_cmd: Metadata from the userspace framebuffer creation request 138 137 * @funcs: vtable to be used for the new framebuffer object 139 138 * 140 - * This can be used to set &drm_framebuffer_funcs for drivers that need the 141 - * &drm_framebuffer_funcs.dirty callback. Use drm_gem_fb_create() if you don't 142 - * need to change &drm_framebuffer_funcs. 143 - * The function does buffer size validation. 139 + * This function can be used to set &drm_framebuffer_funcs for drivers that need 140 + * custom framebuffer callbacks. Use drm_gem_fb_create() if you don't need to 141 + * change &drm_framebuffer_funcs. The function does buffer size validation. 144 142 * 145 143 * Returns: 146 144 * Pointer to a &drm_framebuffer on success or an error pointer on failure. ··· 215 215 * 216 216 * If your hardware has special alignment or pitch requirements these should be 217 217 * checked before calling this function. The function does buffer size 218 - * validation. Use drm_gem_fb_create_with_funcs() if you need to set 219 - * &drm_framebuffer_funcs.dirty. 218 + * validation. Use drm_gem_fb_create_with_dirty() if you need framebuffer 219 + * flushing. 220 220 * 221 221 * Drivers can use this as their &drm_mode_config_funcs.fb_create callback. 222 222 * The ADDFB2 IOCTL calls into this callback. ··· 232 232 &drm_gem_fb_funcs); 233 233 } 234 234 EXPORT_SYMBOL_GPL(drm_gem_fb_create); 235 + 236 + static const struct drm_framebuffer_funcs drm_gem_fb_funcs_dirtyfb = { 237 + .destroy = drm_gem_fb_destroy, 238 + .create_handle = drm_gem_fb_create_handle, 239 + .dirty = drm_atomic_helper_dirtyfb, 240 + }; 241 + 242 + /** 243 + * drm_gem_fb_create_with_dirty() - Helper function for the 244 + * &drm_mode_config_funcs.fb_create callback 245 + * @dev: DRM device 246 + * @file: DRM file that holds the GEM handle(s) backing the framebuffer 247 + * @mode_cmd: Metadata from the userspace framebuffer creation request 248 + * 249 + * This function creates a new framebuffer object described by 250 + * &drm_mode_fb_cmd2. This description includes handles for the buffer(s) 251 + * backing the framebuffer. drm_atomic_helper_dirtyfb() is used for the dirty 252 + * callback giving framebuffer flushing through the atomic machinery. Use 253 + * drm_gem_fb_create() if you don't need the dirty callback. 254 + * The function does buffer size validation. 255 + * 256 + * Drivers should also call drm_plane_enable_fb_damage_clips() on all planes 257 + * to enable userspace to use damage clips also with the ATOMIC IOCTL. 258 + * 259 + * Drivers can use this as their &drm_mode_config_funcs.fb_create callback. 260 + * The ADDFB2 IOCTL calls into this callback. 261 + * 262 + * Returns: 263 + * Pointer to a &drm_framebuffer on success or an error pointer on failure. 264 + */ 265 + struct drm_framebuffer * 266 + drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file, 267 + const struct drm_mode_fb_cmd2 *mode_cmd) 268 + { 269 + return drm_gem_fb_create_with_funcs(dev, file, mode_cmd, 270 + &drm_gem_fb_funcs_dirtyfb); 271 + } 272 + EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty); 235 273 236 274 /** 237 275 * drm_gem_fb_prepare_fb() - Prepare a GEM backed framebuffer
+3
include/drm/drm_gem_framebuffer_helper.h
··· 25 25 struct drm_framebuffer * 26 26 drm_gem_fb_create(struct drm_device *dev, struct drm_file *file, 27 27 const struct drm_mode_fb_cmd2 *mode_cmd); 28 + struct drm_framebuffer * 29 + drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file, 30 + const struct drm_mode_fb_cmd2 *mode_cmd); 28 31 29 32 int drm_gem_fb_prepare_fb(struct drm_plane *plane, 30 33 struct drm_plane_state *state);