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

Christophe Fergeau cfergeau at redhat.com
Fri Dec 11 05:07:37 PST 2015


Hey,

On Wed, Nov 25, 2015 at 05:14:27PM +0100, Lukas Venhoda wrote:
> 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

Rather than having #ifndef everywhere, I think this bit could be changed
to
+#ifndef WORDS_BIGENDIAN
      saved_want_original = want_original;
+#else
+        /* On BE machines, we want to explicitly convert the surface all the time */
+     saved_want_original = TRUE;
+#endif

I'm wondering if this could cause issues when blitting transparent
surfaces to a 16bpp canvas, as the canvas_get_image_internal documentation
mentions this as a usecase (and the only caller with want_original =
TRUE is canvas_draw_alpha_blend)
(NB: my understanding is that "want_original" really means
"keep_original_image_format")

Christophe

>      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
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20151211/aeb852f6/attachment.sig>


More information about the Spice-devel mailing list