forked from 12to11/12to11
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:
parent
168ce048be
commit
8eebb04502
2 changed files with 43 additions and 7 deletions
3
egl.c
3
egl.c
|
@ -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:
|
||||||
|
|
|
@ -184,15 +184,18 @@ enum
|
||||||
{
|
{
|
||||||
/* This means that the view and all its inferiors should be
|
/* This means that the view and all its inferiors should be
|
||||||
skipped in bounds computation, input tracking, et cetera. */
|
skipped in bounds computation, input tracking, et cetera. */
|
||||||
ViewIsUnmapped = 1,
|
ViewIsUnmapped = 1,
|
||||||
/* This means that the view itself (not including its inferiors)
|
/* This means that the view itself (not including its inferiors)
|
||||||
should be skipped for bounds computation and input
|
should be skipped for bounds computation and input
|
||||||
tracking, etc. */
|
tracking, etc. */
|
||||||
ViewIsSkipped = 1 << 2,
|
ViewIsSkipped = 1 << 2,
|
||||||
/* This means that the view has a viewport specifying its size,
|
/* This means that the view has a viewport specifying its size,
|
||||||
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, ¶ms);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Compute the transform. */
|
/* Compute the transform. */
|
||||||
ViewComputeTransform (view, ¶ms, False);
|
ViewComputeTransform (view, ¶ms, False);
|
||||||
buffer = XLRenderBufferFromBuffer (view->buffer);
|
|
||||||
|
|
||||||
/* Upload the buffer contents. */
|
/* Upload the buffer contents. */
|
||||||
RenderUpdateBufferForDamage (buffer, damage, ¶ms);
|
RenderUpdateBufferForDamage (buffer, damage, ¶ms);
|
||||||
|
@ -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, ¶ms);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Upload the buffer contents. */
|
/* Upload the buffer contents. */
|
||||||
RenderUpdateBufferForDamage (buffer, buffer_damage, ¶ms);
|
RenderUpdateBufferForDamage (buffer, buffer_damage, ¶ms);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue