i915tex: Only wait for vblank when really necessary.

This avoids superfluous waits for vblank timing out under some circumstances.
This commit is contained in:
Michel Dänzer 2007-07-10 10:54:51 +02:00
parent b53659452c
commit 2079df8527
2 changed files with 27 additions and 10 deletions

View file

@ -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;

View file

@ -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;