mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
Synchronize drawable to the pipe where the bigger part can be visible.
This requires the DDX driver to set the corresponding fields in the SAREA, so check its minor version.
This commit is contained in:
parent
4abf2706e9
commit
af866291da
1 changed files with 30 additions and 0 deletions
|
|
@ -572,6 +572,36 @@ void intelWindowMoved( intelContextPtr intel )
|
|||
{
|
||||
GLcontext *ctx = &intel->ctx;
|
||||
|
||||
if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) {
|
||||
drmI830Sarea *sarea = intel->sarea;
|
||||
drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
|
||||
.y1 = dPriv->y, .y2 = dPriv->y + dPriv->h };
|
||||
drm_clip_rect_t pipeA_rect = { .x1 = sarea->pipeA_x,
|
||||
.x2 = sarea->pipeA_x + sarea->pipeA_w,
|
||||
.y1 = sarea->pipeA_y,
|
||||
.y2 = sarea->pipeA_y + sarea->pipeA_h };
|
||||
drm_clip_rect_t pipeB_rect = { .x1 = sarea->pipeB_x,
|
||||
.x2 = sarea->pipeB_x + sarea->pipeB_w,
|
||||
.y1 = sarea->pipeB_y,
|
||||
.y2 = sarea->pipeB_y + sarea->pipeB_h };
|
||||
GLint areaA = driIntersectArea( drw_rect, pipeA_rect );
|
||||
GLint areaB = driIntersectArea( drw_rect, pipeB_rect );
|
||||
GLuint flags = intel->vblank_flags;
|
||||
|
||||
if (areaB > areaA || (areaA > 0 && areaB > 0)) {
|
||||
flags = intel->vblank_flags | VBLANK_FLAG_SECONDARY;
|
||||
} else {
|
||||
flags = intel->vblank_flags & ~VBLANK_FLAG_SECONDARY;
|
||||
}
|
||||
|
||||
if (flags != intel->vblank_flags) {
|
||||
intel->vblank_flags = flags;
|
||||
driGetCurrentVBlank(dPriv, intel->vblank_flags, &intel->vbl_seq);
|
||||
}
|
||||
} else {
|
||||
intel->vblank_flags &= ~VBLANK_FLAG_SECONDARY;
|
||||
}
|
||||
|
||||
ctx->Driver.Scissor( ctx, ctx->Scissor.X, ctx->Scissor.Y,
|
||||
ctx->Scissor.Width, ctx->Scissor.Height );
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue