WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] vnc client, 16 bit, strange colors when viewing a PV guest

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, "Daniel P. Berrange" <berrange@xxxxxxxxxx>
Subject: [Xen-devel] vnc client, 16 bit, strange colors when viewing a PV guest
From: Pat Campbell <plc@xxxxxxxxxx>
Date: Tue, 26 Feb 2008 10:06:13 -0700
Delivery-date: Tue, 26 Feb 2008 09:09:01 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.6 (X11/20070801)
Using tightVNC, the colors are messed up when viewing a PV guest running
on a 3.2 hypervisor from a client system with a 16 bit deep display.
virt-manager --> viewer works OK.
Standalone virt-viewer and other VNC clients have bad colors.  

This problem is new with Xen 3.2 and the qemu xenfb code.

As a short term fix I added a second macro in tools/ioemu/hw/xenfb.c to
munge the colors from 32 bit  to 16 bit based on an algorithm used by
RealVNC.  Patch I used is attached, not suggesting it be merged.

Is anybody else seeing this problem?

By the way, while looking at the original macro I think the last shift
for blue should of used BRS instead if GRS.  ( Changing that did not
make the colors better. )

#define BLT(SRC_T,DST_T,RLS,GLS,BLS,RRS,GRS,BRS,RM,GM,BM)               \
    for (line = y ; line < h ; line++) {                                \
        SRC_T *src = (SRC_T *)(xenfb->pixels                            \
                               + (line * xenfb->row_stride)             \
                               + (x * xenfb->depth / 8));               \
        DST_T *dst = (DST_T
*)(xenfb->ds->data                                 \
                               + (line *
xenfb->ds->linesize)                  \
                               + (x * xenfb->ds->depth /
8));                  \
        int col;                                                        \
        for (col = x ; col < w ; col++) {                               \
            *dst = (((*src >> RRS) & RM) << RLS) |                      \
                (((*src >> GRS) & GM) << GLS) |                         \
-                (((*src >> GRS) & BM) << BLS);                          \
+               (((*src >> BRS) & BM) << BLS);                          \
            src++;                                                      \
            dst++;                                                      \
        }                                                               \
    }


Index: xen-3.2-testing/tools/ioemu/hw/xenfb.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/xenfb.c 2008-02-26 07:38:20.000000000 
-0700
+++ xen-3.2-testing/tools/ioemu/hw/xenfb.c      2008-02-26 07:43:56.000000000 
-0700
@@ -1103,6 +1103,25 @@
         }                                                               \
     }
 
+/* 32 bit to 16 bit pixel munging, dst algo came from RealVNC transInitTempl.h 
*/
+#define BLT_32_16(SRC_T,DST_T,RRS,GRS,BRS,RLS,GLS,BLS,RIM,GIM,BIM,ROM,GOM,BOM) 
              \
+    for (line = y ; line < h ; line++) {                                   \
+        SRC_T *src = (SRC_T *)(xenfb->pixels                               \
+                               + (line * xenfb->row_stride)                \
+                               + (x * xenfb->depth / 8));                  \
+        DST_T *dst = (DST_T *)(xenfb->ds->data                             \
+                               + (line * xenfb->ds->linesize)              \
+                               + (x * xenfb->ds->depth / 8));              \
+        int col;                                                           \
+        for (col = x ; col < w ; col++) {                                  \
+            *dst = ((((*src >> RRS & RIM) * ROM + RIM/2) / RIM) << RLS) |  \
+                ((((*src >> GRS & GIM) * GOM + GIM/2) / GIM) << GLS ) |    \
+                ((((*src >> BRS & BIM) * BOM + BIM/2) / BIM) << BLS);      \
+            src++;                                                         \
+            dst++;                                                         \
+        }                                                                  \
+    }
+
 
 /* This copies data from the guest framebuffer region, into QEMU's copy
  * NB. QEMU's copy is stored in the pixel format of a) the local X 
@@ -1139,7 +1158,7 @@
             if (xenfb->ds->depth == 8) {
                 BLT(uint32_t, uint8_t,    16, 8, 0,   5, 2, 0,    255, 255, 
255);
             } else if (xenfb->ds->depth == 16) {
-                BLT(uint32_t, uint16_t,   16, 8, 0,   11, 5, 0,   255, 255, 
255);
+                BLT_32_16(uint32_t, uint16_t,   16, 8, 0,   11, 5, 0,   255, 
255, 255,   31, 63, 31);
             }
         }
     }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>