[Spice-devel] [common PATCH 1/9 v4] ppc: Always convert surface on BE machine

Lukas Venhoda lvenhoda at redhat.com
Wed Nov 25 08:14:27 PST 2015


The newly created surface can be converted, if saved_want_original
equals TRUE.

On BE machine we want to always convert, in order to properly byteswap
colors from LE order to BE order.

This is done by first creating BGRA/X surface with LE order data, and
then copying the data into a new A/XRGB surface. The copy process will
automatically byteswap the colors into A/XRGB format.
---
Changes since v3:
 - New file
---
 common/canvas_base.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/common/canvas_base.c b/common/canvas_base.c
index 6747465..30baa22 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -1116,7 +1116,9 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
     SpiceImageDescriptor *descriptor = &image->descriptor;
     pixman_image_t *surface, *converted;
     pixman_format_code_t wanted_format, surface_format;
+#ifndef WORDS_BIGENDIAN
     int saved_want_original;
+#endif

     /* When touching, only really allocate if we need to cache, or
      * if we're loading a GLZ stream (since those need inter-thread communication
@@ -1132,7 +1134,9 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
         return NULL;
     }

+#ifndef WORDS_BIGENDIAN
     saved_want_original = want_original;
+#endif
     if (descriptor->flags & SPICE_IMAGE_FLAGS_CACHE_ME
 #ifdef SW_CANVAS_CACHE
         || descriptor->flags & SPICE_IMAGE_FLAGS_CACHE_REPLACE_ME
@@ -1257,12 +1261,15 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
         return NULL;
     }

+#ifndef WORDS_BIGENDIAN
     if (!saved_want_original) {
         /* Conversion to canvas format was requested, but maybe it didn't
            happen above (due to save/load to cache for instance, or
            maybe the reader didn't support conversion).
            If so we convert here. */
+#endif

+        /* On BE machines, we want to explicitly convert the surface all the time */
         wanted_format = canvas_get_target_format(canvas,
                                                  surface_format == PIXMAN_a8r8g8b8);

@@ -1285,7 +1292,9 @@ static pixman_image_t *canvas_get_image_internal(CanvasBase *canvas, SpiceImage
             pixman_image_unref (surface);
             surface = converted;
         }
+#ifndef WORDS_BIGENDIAN
     }
+#endif

     return surface;
 }
--
2.5.0



More information about the Spice-devel mailing list