modesetting: Fix damage tracking auto-disable code
dispatch_dirty_region was only returning -EINVAL error codes, otherwise it would return 0. The kernel returns -ENOSYS when the driver doesn't support damage tracking, so dispatch_dirty would never see the error and never disable damage tracking. Pass all errors back from dispatch_dirty_region and let dispatch_dirty deal with them. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
826e7c2b36
commit
7804305673
|
@ -453,11 +453,12 @@ dispatch_dirty_region(ScrnInfoPtr scrn,
|
||||||
modesettingPtr ms = modesettingPTR(scrn);
|
modesettingPtr ms = modesettingPTR(scrn);
|
||||||
RegionPtr dirty = DamageRegion(damage);
|
RegionPtr dirty = DamageRegion(damage);
|
||||||
unsigned num_cliprects = REGION_NUM_RECTS(dirty);
|
unsigned num_cliprects = REGION_NUM_RECTS(dirty);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (num_cliprects) {
|
if (num_cliprects) {
|
||||||
drmModeClip *clip = malloc(num_cliprects * sizeof(drmModeClip));
|
drmModeClip *clip = malloc(num_cliprects * sizeof(drmModeClip));
|
||||||
BoxPtr rect = REGION_RECTS(dirty);
|
BoxPtr rect = REGION_RECTS(dirty);
|
||||||
int i, ret;
|
int i;
|
||||||
|
|
||||||
if (!clip)
|
if (!clip)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -474,13 +475,9 @@ dispatch_dirty_region(ScrnInfoPtr scrn,
|
||||||
ret = drmModeDirtyFB(ms->fd, fb_id, clip, num_cliprects);
|
ret = drmModeDirtyFB(ms->fd, fb_id, clip, num_cliprects);
|
||||||
free(clip);
|
free(clip);
|
||||||
DamageEmpty(damage);
|
DamageEmpty(damage);
|
||||||
if (ret) {
|
}
|
||||||
if (ret == -EINVAL)
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dispatch_dirty(ScreenPtr pScreen)
|
dispatch_dirty(ScreenPtr pScreen)
|
||||||
|
|
Loading…
Reference in New Issue