Hi,

    I did a small patch to fix minor issues with i830 gfxdriver. Now the
driver can more nicely live with the linux intelfb driver. Now it can be
used even when intelfb has accel set to 1, just in configuring in
/etc/fb.modes "accel false" to disable console acceleration when
DirectFB is working. To work, the last intelfb patch is needed. I just
sended it to linux-fbdev mailing list and Andrew Morton and it should be
in the next mm series of linux kernels.
    I also fixed the ovlSetColorAdjustment function and now brightness,
contrast and saturation settings are enabled.

Regards
Sylvain
Common subdirectories: gfxdrivers/i830.ori/.deps and gfxdrivers/i830/.deps
Common subdirectories: gfxdrivers/i830.ori/CVS and gfxdrivers/i830/CVS
diff -puN gfxdrivers/i830.ori/i830.c gfxdrivers/i830/i830.c
--- gfxdrivers/i830.ori/i830.c  2005-05-31 19:37:53.000000000 +0200
+++ gfxdrivers/i830/i830.c      2005-05-31 00:39:57.000000000 +0200
@@ -92,44 +92,60 @@ static inline void
 i830_wait_for_blit_idle( I830DriverData *idrv,
                          I830DeviceData *idev )
 {
-/*     __u32 count = 0;
+     __u32 count = 0;
+     __u32 head , tail;
 
      if (idev != NULL)
           idev->idle_calls++;
-
-     while ((i830_readw(idrv->mmio_base, INST_DONE) & 0x7b) != 0x7b &&
-            count++ < TIMER_LOOP) {
+     
+     head = i830_readl(idrv->mmio_base, LP_RING + RING_HEAD) & I830_HEAD_MASK;
+     tail = i830_readl(idrv->mmio_base, LP_RING + RING_TAIL) & I830_TAIL_MASK;
+     while ((head != tail) && (count++ < TIMER_LOOP)) {
           if (idev != NULL)
                idev->idle_waitcycles++;
+          head = i830_readl(idrv->mmio_base, LP_RING + RING_HEAD) & 
I830_HEAD_MASK;
+          tail = i830_readl(idrv->mmio_base, LP_RING + RING_TAIL) & 
I830_TAIL_MASK;
      }
 
      if (count >= TIMER_LOOP) {
           if (idev != NULL)
                idev->idle_timeoutsum++;
           D_BUG("warning: idle timeout exceeded");
-     }*/
+     }
 }
 
 static void
 i830_init_ringbuffer( I830DriverData *idrv,
                       I830DeviceData *idev )
 {
+     __u32 ring_enabled;
+
      D_DEBUG_AT( I830_Ring, "Previous lp ring config: 0x%08x, 0x%08x, 0x%08x, 
0x%08x\n",
                  i830_readl(idrv->mmio_base, LP_RING),
                  i830_readl(idrv->mmio_base, LP_RING + RING_HEAD),
                  i830_readl(idrv->mmio_base, LP_RING + RING_START),
                  i830_readl(idrv->mmio_base, LP_RING + RING_LEN) );
 
+     ring_enabled = i830_readl(idrv->mmio_base, LP_RING + RING_LEN) & 1;
+     if (ring_enabled)
+         i830_wait_for_blit_idle(idrv, idev);
+     i830_lring_enable(idrv, 0);
+
+     idev->lring1 = i830_readl(idrv->mmio_base, LP_RING);
+     idev->lring2 = i830_readl(idrv->mmio_base, LP_RING + RING_HEAD);
+     idev->lring3 = i830_readl(idrv->mmio_base, LP_RING + RING_START);
+     idev->lring4 = i830_readl(idrv->mmio_base, LP_RING + RING_LEN);
+
+     D_FLAGS_SET( idrv->flags, I830RES_STATE_SAVE );
+
      i830_writel(idrv->mmio_base, LP_RING + RING_LEN, 0);
      i830_writel(idrv->mmio_base, LP_RING + RING_HEAD, 0);
      i830_writel(idrv->mmio_base, LP_RING + RING_TAIL, 0);
+     i830_writel(idrv->mmio_base, LP_RING + RING_START, 0);
 
      D_DEBUG_AT( I830_Ring, "INST_DONE: 0x%04x\n", i830_readw(idrv->mmio_base, 
INST_DONE) );
 
 
-     i830_wait_for_blit_idle(idrv, idev);
-     i830_lring_enable(idrv, 0);
-
      idev->lp_ring.size      = RINGBUFFER_SIZE;
      idev->lp_ring.tail_mask = idev->lp_ring.size - 1;
 
@@ -434,15 +450,14 @@ i830_agp_setup( GraphicsDevice *device,
      idrv->pattern_base = idrv->ovl_base + 1024;
 
      if (!idev->initialized) {
+          memset((void *) idrv->lring_base, 0x00, RINGBUFFER_SIZE);
           memset((void *) idrv->ovl_base, 0xff, 1024);
           memset((void *) idrv->pattern_base, 0xff, 4096 - 1024);
-
+ 
           idev->lring1 = 0;//i830_readl(idrv->mmio_base, LP_RING);
           idev->lring2 = 0;//i830_readl(idrv->mmio_base, LP_RING + RING_HEAD);
           idev->lring3 = 0;//i830_readl(idrv->mmio_base, LP_RING + RING_START);
           idev->lring4 = 0;//i830_readl(idrv->mmio_base, LP_RING + RING_LEN);
-
-          D_FLAGS_SET( idrv->flags, I830RES_STATE_SAVE );
      }
 
      idev->initialized = true;
diff -puN gfxdrivers/i830.ori/i830_overlay.c gfxdrivers/i830/i830_overlay.c
--- gfxdrivers/i830.ori/i830_overlay.c  2005-05-31 19:37:53.000000000 +0200
+++ gfxdrivers/i830/i830_overlay.c      2005-05-31 18:38:40.000000000 +0200
@@ -317,17 +317,32 @@ ovlSetColorAdjustment( CoreLayer        
                        void               *layer_data,
                        DFBColorAdjustment *adj )
 {
-/*     I830DriverData       *idrv = driver_data;
+     I830DriverData       *idrv = driver_data;
      I830DeviceData       *idev = idrv->idev;
      I830OverlayLayerData *iovl = layer_data;
+     __u16 b, c, s;
 
-     iovl->regs->OCLRC0 = (((adj->brightness >> 8) - 128) & 0xFF) |
-                          ((adj->contrast >> 9) << 8);
-     iovl->regs->OCLRC1 = (adj->saturation >> 8) & 0xFF;
+     if (adj->flags & DCAF_BRIGHTNESS)
+        b = ((adj->brightness >> 8) - 128) & 0xFF;
+     else
+        b = idrv->oregs->OCLRC0 & 0xFF;
+
+     if (adj->flags & DCAF_CONTRAST)
+        c = (adj->contrast >> 8) & 0xFF;
+     else
+        c = (idrv->oregs->OCLRC0 >> 18) & 0xFF;
+
+     if (adj->flags & DCAF_SATURATION)
+        s = (adj->saturation >> 8) & 0xFF;
+     else
+        s = idrv->oregs->OCLRC1 & 0xFF;
+
+     idrv->oregs->OCLRC0 = b | (c << 18);
+     idrv->oregs->OCLRC1 = s;
 
-     update_overlay( idrv, idev, iovl );*/
+     update_overlay( idrv, idev );
 
-     return DFB_UNIMPLEMENTED;
+     return DFB_OK;
 }
 
 static DFBResult

_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to