[v8,3/9] ui/pixman: add qemu_drm_format_to_pixman()

Submitted by Gerd Hoffmann on March 6, 2018, 11:34 a.m.

Details

Message ID 20180306113442.15295-4-kraxel@redhat.com
State New
Headers show
Series "vfio: add display support" ( rev: 4 ) in Intel GVT devel

Not browsing as part of any series.

Commit Message

Gerd Hoffmann March 6, 2018, 11:34 a.m.
Map drm fourcc codes to pixman formats.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/qemu-pixman.h |  5 +++++
 ui/qemu-pixman.c         | 22 ++++++++++++++++++++++
 2 files changed, 27 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/ui/qemu-pixman.h b/include/ui/qemu-pixman.h
index 4a67e01232..b7c82d17fc 100644
--- a/include/ui/qemu-pixman.h
+++ b/include/ui/qemu-pixman.h
@@ -33,6 +33,8 @@ 
 # define PIXMAN_BE_r8g8b8a8   PIXMAN_r8g8b8a8
 # define PIXMAN_BE_x8b8g8r8   PIXMAN_x8b8g8r8
 # define PIXMAN_BE_a8b8g8r8   PIXMAN_a8b8g8r8
+# define PIXMAN_LE_r8g8b8     PIXMAN_b8g8r8
+# define PIXMAN_LE_a8r8g8b8   PIXMAN_b8g8r8a8
 # define PIXMAN_LE_x8r8g8b8   PIXMAN_b8g8r8x8
 #else
 # define PIXMAN_BE_r8g8b8     PIXMAN_b8g8r8
@@ -44,6 +46,8 @@ 
 # define PIXMAN_BE_r8g8b8a8   PIXMAN_a8b8g8r8
 # define PIXMAN_BE_x8b8g8r8   PIXMAN_r8g8b8x8
 # define PIXMAN_BE_a8b8g8r8   PIXMAN_r8g8b8a8
+# define PIXMAN_LE_r8g8b8     PIXMAN_r8g8b8
+# define PIXMAN_LE_a8r8g8b8   PIXMAN_a8r8g8b8
 # define PIXMAN_LE_x8r8g8b8   PIXMAN_x8r8g8b8
 #endif
 
@@ -51,6 +55,7 @@ 
 
 PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format);
 pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian);
+pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format);
 int qemu_pixman_get_type(int rshift, int gshift, int bshift);
 pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf);
 bool qemu_pixman_check_format(DisplayChangeListener *dcl,
diff --git a/ui/qemu-pixman.c b/ui/qemu-pixman.c
index 6e591ab821..3e52abd92d 100644
--- a/ui/qemu-pixman.c
+++ b/ui/qemu-pixman.c
@@ -6,6 +6,7 @@ 
 #include "qemu/osdep.h"
 #include "qemu-common.h"
 #include "ui/console.h"
+#include "standard-headers/drm/drm_fourcc.h"
 
 PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format)
 {
@@ -88,6 +89,27 @@  pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian)
     return 0;
 }
 
+/* Note: drm is little endian, pixman is native endian */
+pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format)
+{
+    static const struct {
+        uint32_t drm_format;
+        pixman_format_code_t pixman;
+    } map[] = {
+        { DRM_FORMAT_RGB888,   PIXMAN_LE_r8g8b8   },
+        { DRM_FORMAT_ARGB8888, PIXMAN_LE_a8r8g8b8 },
+        { DRM_FORMAT_XRGB8888, PIXMAN_LE_x8r8g8b8 }
+    };
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(map); i++) {
+        if (drm_format == map[i].drm_format) {
+            return map[i].pixman;
+        }
+    }
+    return 0;
+}
+
 int qemu_pixman_get_type(int rshift, int gshift, int bshift)
 {
     int type = PIXMAN_TYPE_OTHER;

Comments

Looks good.

Reviewed by: Kirti Wankhede <kwankhede@nvidia.com>

Thanks,
Kirti

On 3/6/2018 5:04 PM, Gerd Hoffmann wrote:
> Map drm fourcc codes to pixman formats.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  include/ui/qemu-pixman.h |  5 +++++
>  ui/qemu-pixman.c         | 22 ++++++++++++++++++++++
>  2 files changed, 27 insertions(+)
> 
> diff --git a/include/ui/qemu-pixman.h b/include/ui/qemu-pixman.h
> index 4a67e01232..b7c82d17fc 100644
> --- a/include/ui/qemu-pixman.h
> +++ b/include/ui/qemu-pixman.h
> @@ -33,6 +33,8 @@
>  # define PIXMAN_BE_r8g8b8a8   PIXMAN_r8g8b8a8
>  # define PIXMAN_BE_x8b8g8r8   PIXMAN_x8b8g8r8
>  # define PIXMAN_BE_a8b8g8r8   PIXMAN_a8b8g8r8
> +# define PIXMAN_LE_r8g8b8     PIXMAN_b8g8r8
> +# define PIXMAN_LE_a8r8g8b8   PIXMAN_b8g8r8a8
>  # define PIXMAN_LE_x8r8g8b8   PIXMAN_b8g8r8x8
>  #else
>  # define PIXMAN_BE_r8g8b8     PIXMAN_b8g8r8
> @@ -44,6 +46,8 @@
>  # define PIXMAN_BE_r8g8b8a8   PIXMAN_a8b8g8r8
>  # define PIXMAN_BE_x8b8g8r8   PIXMAN_r8g8b8x8
>  # define PIXMAN_BE_a8b8g8r8   PIXMAN_r8g8b8a8
> +# define PIXMAN_LE_r8g8b8     PIXMAN_r8g8b8
> +# define PIXMAN_LE_a8r8g8b8   PIXMAN_a8r8g8b8
>  # define PIXMAN_LE_x8r8g8b8   PIXMAN_x8r8g8b8
>  #endif
>  
> @@ -51,6 +55,7 @@
>  
>  PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format);
>  pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian);
> +pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format);
>  int qemu_pixman_get_type(int rshift, int gshift, int bshift);
>  pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf);
>  bool qemu_pixman_check_format(DisplayChangeListener *dcl,
> diff --git a/ui/qemu-pixman.c b/ui/qemu-pixman.c
> index 6e591ab821..3e52abd92d 100644
> --- a/ui/qemu-pixman.c
> +++ b/ui/qemu-pixman.c
> @@ -6,6 +6,7 @@
>  #include "qemu/osdep.h"
>  #include "qemu-common.h"
>  #include "ui/console.h"
> +#include "standard-headers/drm/drm_fourcc.h"
>  
>  PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format)
>  {
> @@ -88,6 +89,27 @@ pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian)
>      return 0;
>  }
>  
> +/* Note: drm is little endian, pixman is native endian */
> +pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format)
> +{
> +    static const struct {
> +        uint32_t drm_format;
> +        pixman_format_code_t pixman;
> +    } map[] = {
> +        { DRM_FORMAT_RGB888,   PIXMAN_LE_r8g8b8   },
> +        { DRM_FORMAT_ARGB8888, PIXMAN_LE_a8r8g8b8 },
> +        { DRM_FORMAT_XRGB8888, PIXMAN_LE_x8r8g8b8 }
> +    };
> +    int i;
> +
> +    for (i = 0; i < ARRAY_SIZE(map); i++) {
> +        if (drm_format == map[i].drm_format) {
> +            return map[i].pixman;
> +        }
> +    }
> +    return 0;
> +}
> +
>  int qemu_pixman_get_type(int rshift, int gshift, int bshift)
>  {
>      int type = PIXMAN_TYPE_OTHER;
>