Keith Packard <keithp@xxxxxxxxxx> writes: > GetScratchPixmapHeader should only be used for local memory pixmaps, > as used by PutImage and friends. That's because when you free the > scratch pixmap header, it doesn't actually free the pixmap; instead, > it gets stuffed in pScreen->pScratchPixmap and any private data stored > on it will be left hanging around forever. > > In the case of glamor, that private data includes all of the GL > state. Using that scratch pixmap later results in glamor getting > mightily confused as the pixmap and underlying objects do not match. > > Avoid this by allocating pixmap headers explicitly for this purpose. > > Signed-off-by: Keith Packard <keithp@xxxxxxxxxx> > --- > src/uxa/intel_display.c | 44 ++++++++++++++++++++++++++++++-------------- > 1 file changed, 30 insertions(+), 14 deletions(-) > > diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c > index 0b83140..bcaafaa 100644 > --- a/src/uxa/intel_display.c > +++ b/src/uxa/intel_display.c > @@ -545,13 +545,31 @@ intel_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) > return NULL; > } > > - drm_intel_bo_disable_reuse(intel_crtc->rotate_bo); > - > intel_crtc->rotate_pitch = rotate_pitch; > return intel_crtc->rotate_bo; > } See comment below... > @@ -602,8 +620,8 @@ intel_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) > struct intel_mode *mode = intel_crtc->mode; > > if (rotate_pixmap) { > - intel_set_pixmap_bo(rotate_pixmap, NULL); > - FreeScratchPixmapHeader(rotate_pixmap); > + intel_set_pixmap_bo(rotate_pixmap, NULL); > + rotate_pixmap->drawable.pScreen->DestroyPixmap(rotate_pixmap); > } > > if (data) { > @@ -1415,7 +1433,6 @@ intel_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) > int i, old_width, old_height, old_pitch; > int pitch; > uint32_t tiling; > - ScreenPtr screen; > > if (scrn->virtualX == width && scrn->virtualY == height) > return TRUE; > @@ -1430,8 +1447,7 @@ intel_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) > old_front = intel->front_buffer; > > if (intel->back_pixmap) { > - screen = intel->back_pixmap->drawable.pScreen; > - screen->DestroyPixmap(intel->back_pixmap); > + scrn->pScreen->DestroyPixmap(intel->back_pixmap); > intel->back_pixmap = NULL; > } > Grumble, unrelated noise in the patch. > @@ -1454,7 +1470,6 @@ intel_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) > if (ret) > goto fail; > > - drm_intel_bo_disable_reuse(intel->front_buffer); > intel->front_pitch = pitch; > intel->front_tiling = tiling; > This change appears to be unrelated, and possibly harmful (if X has dropped the last ref to the BO, but it's still the scanout buffer, a new allocation would now reuse the BO and scribble on scanout until the next modeset happens). > @@ -2204,6 +2219,7 @@ Bool intel_crtc_on(xf86CrtcPtr crtc) > return ret; > } > > + > static PixmapPtr > intel_create_pixmap_for_bo(ScreenPtr pScreen, dri_bo *bo, > int width, int height, Unrelated whitespace.
Attachment:
pgp3YxrgJQCps.pgp
Description: PGP signature
_______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx