Fix rotating transforms on EGL

* egl.c (UpdateBuffer): Fix coding style.
* subcompositor.c (IsPreviouslyTransformed)
(SetPreviouslyTransformed, ClearPreviouslyTransformed): New
macros.
(ViewSetTransform): Mark damage as untrusted until the next time
the buffer is uploaded.
(ApplyBufferDamage, ApplyUntransformedDamage): Upload entire
buffer upon untrusted damage.
This commit is contained in:
hujianwei 2022-11-02 02:46:43 +00:00
parent 168ce048be
commit 8eebb04502
2 changed files with 43 additions and 7 deletions

3
egl.c
View file

@ -2507,8 +2507,7 @@ UpdateBuffer (RenderBuffer buffer, pixman_region32_t *damage,
case ShmBuffer: case ShmBuffer:
/* Update the shared memory buffer incrementally, taking /* Update the shared memory buffer incrementally, taking
into account the damaged area and transform. */ into account the damaged area and transform. */
UpdateShmBufferIncrementally (egl_buffer, damage, UpdateShmBufferIncrementally (egl_buffer, damage, params);
params);
break; break;
case DmaBufBuffer: case DmaBufBuffer:

View file

@ -193,6 +193,9 @@ enum
effectively decoupling its relation to the buffer width and effectively decoupling its relation to the buffer width and
height. */ height. */
ViewIsViewported = 1 << 3, ViewIsViewported = 1 << 3,
/* Whether or not damage can be trusted. When set, non-buffer
damage cannot be trusted, as the view transform changed. */
ViewIsPreviouslyTransformed = 1 << 4,
}; };
#define IsViewUnmapped(view) \ #define IsViewUnmapped(view) \
@ -214,7 +217,14 @@ enum
#define SetViewported(view) \ #define SetViewported(view) \
((view)->flags |= ViewIsViewported) ((view)->flags |= ViewIsViewported)
#define ClearViewported(view) \ #define ClearViewported(view) \
((view)->flags &= ~ViewIsViewported) ((view)->flags &= ~ViewIsViewported) \
#define IsPreviouslyTransformed(view) \
((view)->flags & ViewIsPreviouslyTransformed)
#define SetPreviouslyTransformed(view) \
((view)->flags |= ViewIsPreviouslyTransformed)
#define ClearPreviouslyTransformed(view) \
((view)->flags &= ~ViewIsPreviouslyTransformed)
#endif #endif
@ -2021,6 +2031,9 @@ ViewSetTransform (View *view, BufferTransform transform)
old_transform = view->transform; old_transform = view->transform;
view->transform = transform; view->transform = transform;
/* Make subsequently applied damage untrusted. */
SetPreviouslyTransformed (view);
if (RotatesDimensions (transform) if (RotatesDimensions (transform)
!= RotatesDimensions (old_transform)) != RotatesDimensions (old_transform))
/* Subcompositor bounds may have changed. */ /* Subcompositor bounds may have changed. */
@ -2141,9 +2154,22 @@ ApplyBufferDamage (View *view, pixman_region32_t *damage)
DrawParams params; DrawParams params;
RenderBuffer buffer; RenderBuffer buffer;
buffer = XLRenderBufferFromBuffer (view->buffer);
/* If the view previously had a transform, then the damage cannot be
trusted. */
if (IsPreviouslyTransformed (view))
{
ClearPreviouslyTransformed (view);
/* Upload the entire buffer. */
params.flags = 0;
RenderUpdateBufferForDamage (buffer, NULL, &params);
return;
}
/* Compute the transform. */ /* Compute the transform. */
ViewComputeTransform (view, &params, False); ViewComputeTransform (view, &params, False);
buffer = XLRenderBufferFromBuffer (view->buffer);
/* Upload the buffer contents. */ /* Upload the buffer contents. */
RenderUpdateBufferForDamage (buffer, damage, &params); RenderUpdateBufferForDamage (buffer, damage, &params);
@ -2158,6 +2184,17 @@ ApplyUntransformedDamage (View *view, pixman_region32_t *buffer_damage)
buffer = XLRenderBufferFromBuffer (view->buffer); buffer = XLRenderBufferFromBuffer (view->buffer);
params.flags = 0; params.flags = 0;
/* If the view previously had a transform, then the damage cannot be
trusted. */
if (IsPreviouslyTransformed (view))
{
ClearPreviouslyTransformed (view);
/* Upload the entire buffer. */
RenderUpdateBufferForDamage (buffer, NULL, &params);
return;
}
/* Upload the buffer contents. */ /* Upload the buffer contents. */
RenderUpdateBufferForDamage (buffer, buffer_damage, &params); RenderUpdateBufferForDamage (buffer, buffer_damage, &params);
} }