OSDN Git Service

On I965, use correct 3DSTATE_DRAWING_RECTANGLE command in vblank
authorKeith Packard <keithp@keithp.com>
Sun, 20 Apr 2008 08:55:57 +0000 (01:55 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 20 Apr 2008 08:56:02 +0000 (01:56 -0700)
The batchbuffer submission paths were fixed to use the 965-specific command,
but the vblank tasklet was not. When the older version is sent, the 965 will
lock up.

shared-core/i915_irq.c

index a9b67a9..2aa0d45 100644 (file)
@@ -279,16 +279,29 @@ static void i915_vblank_tasklet(struct drm_device *dev)
                        }
 
                        if (init_drawrect) {
-                               BEGIN_LP_RING(6);
-
-                               OUT_RING(GFX_OP_DRAWRECT_INFO);
-                               OUT_RING(0);
-                               OUT_RING(0);
-                               OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-                               OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-                               OUT_RING(0);
-
-                               ADVANCE_LP_RING();
+                               int width  = sarea_priv->width;
+                               int height = sarea_priv->height;
+                               if (IS_I965G(dev)) {
+                                       BEGIN_LP_RING(4);
+
+                                       OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
+                                       OUT_RING(0);
+                                       OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
+                                       OUT_RING(0);
+                                       
+                                       ADVANCE_LP_RING();
+                               } else {
+                                       BEGIN_LP_RING(6);
+       
+                                       OUT_RING(GFX_OP_DRAWRECT_INFO);
+                                       OUT_RING(0);
+                                       OUT_RING(0);
+                                       OUT_RING(((width - 1) & 0xffff) | ((height - 1) << 16));
+                                       OUT_RING(0);
+                                       OUT_RING(0);
+                                       
+                                       ADVANCE_LP_RING();
+                               }
 
                                sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;