mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 19:58:09 +02:00
i915tex: Only wait for vblank when really necessary.
This avoids superfluous waits for vblank timing out under some circumstances.
This commit is contained in:
parent
b53659452c
commit
2079df8527
2 changed files with 27 additions and 10 deletions
|
|
@ -316,7 +316,8 @@ intelWindowMoved(struct intel_context *intel)
|
||||||
flags = intel_fb->vblank_flags & ~VBLANK_FLAG_SECONDARY;
|
flags = intel_fb->vblank_flags & ~VBLANK_FLAG_SECONDARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags != intel_fb->vblank_flags) {
|
if (flags != intel_fb->vblank_flags && intel_fb->vblank_flags &&
|
||||||
|
!(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ)) {
|
||||||
drmVBlank vbl;
|
drmVBlank vbl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
@ -327,7 +328,9 @@ intelWindowMoved(struct intel_context *intel)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < intel_fb->pf_num_pages; i++) {
|
for (i = 0; i < intel_fb->pf_num_pages; i++) {
|
||||||
if (!intel_fb->color_rb[i])
|
if (!intel_fb->color_rb[i] ||
|
||||||
|
(intel_fb->vbl_waited - intel_fb->color_rb[i]->vbl_pending) <=
|
||||||
|
(1<<23))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
|
vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
|
||||||
|
|
@ -828,7 +831,8 @@ intelScheduleSwap(const __DRIdrawablePrivate * dPriv, GLboolean *missed_target)
|
||||||
drm_i915_vblank_swap_t swap;
|
drm_i915_vblank_swap_t swap;
|
||||||
GLboolean ret;
|
GLboolean ret;
|
||||||
|
|
||||||
if ((intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
|
if (!intel_fb->vblank_flags ||
|
||||||
|
(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
|
||||||
intelScreen->current_rotation != 0 ||
|
intelScreen->current_rotation != 0 ||
|
||||||
intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
|
intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
|
||||||
|
|
@ -607,12 +607,23 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
|
||||||
if (intel->ctx.DrawBuffer == &intel_fb->Base) {
|
if (intel->ctx.DrawBuffer == &intel_fb->Base) {
|
||||||
|
|
||||||
if (intel->driDrawable != driDrawPriv) {
|
if (intel->driDrawable != driDrawPriv) {
|
||||||
intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
|
if (driDrawPriv->pdraw->swap_interval == (unsigned)-1) {
|
||||||
? driGetDefaultVBlankFlags(&intel->optionCache)
|
int i;
|
||||||
: VBLANK_FLAG_NO_IRQ;
|
|
||||||
(*dri_interface->getUST) (&intel_fb->swap_ust);
|
intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
|
||||||
driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
|
? driGetDefaultVBlankFlags(&intel->optionCache)
|
||||||
&intel_fb->vbl_seq);
|
: VBLANK_FLAG_NO_IRQ;
|
||||||
|
|
||||||
|
(*dri_interface->getUST) (&intel_fb->swap_ust);
|
||||||
|
driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
|
||||||
|
&intel_fb->vbl_seq);
|
||||||
|
intel_fb->vbl_waited = intel_fb->vbl_seq;
|
||||||
|
|
||||||
|
for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) {
|
||||||
|
if (intel_fb->color_rb[i])
|
||||||
|
intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_seq;
|
||||||
|
}
|
||||||
|
}
|
||||||
intel->driDrawable = driDrawPriv;
|
intel->driDrawable = driDrawPriv;
|
||||||
intelWindowMoved(intel);
|
intelWindowMoved(intel);
|
||||||
}
|
}
|
||||||
|
|
@ -729,7 +740,9 @@ void LOCK_HARDWARE( struct intel_context *intel )
|
||||||
BUFFER_BACK_LEFT);
|
BUFFER_BACK_LEFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intel_rb && (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
|
if (intel_rb && intel_fb->vblank_flags &&
|
||||||
|
!(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) &&
|
||||||
|
(intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
|
||||||
drmVBlank vbl;
|
drmVBlank vbl;
|
||||||
|
|
||||||
vbl.request.type = DRM_VBLANK_ABSOLUTE;
|
vbl.request.type = DRM_VBLANK_ABSOLUTE;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue