Synchronize drawable to the pipe where the bigger part can be visible.
authorMichel Dänzer <michel@daenzer.net>
Thu, 28 Sep 2006 14:10:47 +0000 (14:10 +0000)
committerMichel Dänzer <michel@daenzer.net>
Thu, 28 Sep 2006 14:10:47 +0000 (14:10 +0000)
This requires the DDX driver to set the corresponding fields in the SAREA,
so check its minor version.

src/mesa/drivers/dri/i915/intel_context.c

index 45d8fb32616110272cce0e94e6ca175ba73b4de0..480b442211df84bed8067db1a16e54418a7f4b18 100644 (file)
@@ -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 );