aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-graphics/xorg-xserver/xserver-xorg/0002-glamor-add-support-for-GL_RG.patch
blob: 78988373bbbffc9c4af06b04990e4b1708bb9316 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
From 7f46b31e3d80ca769f68a4ffb201d0fc4801ea93 Mon Sep 17 00:00:00 2001
From: Julien Isorce <julien.isorce@gmail.com>
Date: Thu, 6 Sep 2018 15:38:14 -0700
Subject: [PATCH 2/8] glamor: add support for GL_RG

Allow to upload the CbCr plane of an NV12 image into a GL texture.

Upstream-Status: Backport
Signed-off-by: Julien Isorce <jisorce@oblong.com>
Tested-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
---
 glamor/glamor.c          |  2 ++
 glamor/glamor.h          |  1 +
 glamor/glamor_priv.h     |  4 +++-
 glamor/glamor_transfer.c | 10 ++++++++--
 glamor/glamor_utils.h    |  4 ++++
 5 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/glamor/glamor.c b/glamor/glamor.c
index abefef614..3e9cf284c 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -222,6 +222,8 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
 
     pixmap_priv = glamor_get_pixmap_private(pixmap);
 
+    pixmap_priv->is_cbcr = (usage == GLAMOR_CREATE_FORMAT_CBCR);
+
     format = gl_iformat_for_pixmap(pixmap);
 
     pitch = (((w * pixmap->drawable.bitsPerPixel + 7) / 8) + 3) & ~3;
diff --git a/glamor/glamor.h b/glamor/glamor.h
index be04bf858..e5992aa56 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -129,6 +129,7 @@ extern _X_EXPORT Bool glamor_destroy_pixmap(PixmapPtr pixmap);
 #define GLAMOR_CREATE_FBO_NO_FBO        0x103
 #define GLAMOR_CREATE_NO_LARGE          0x105
 #define GLAMOR_CREATE_PIXMAP_NO_TEXTURE 0x106
+#define GLAMOR_CREATE_FORMAT_CBCR       0x107
 
 /* @glamor_egl_exchange_buffers: Exchange the underlying buffers(KHR image,fbo).
  *
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 4353a99f1..a14aaf624 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -380,6 +380,8 @@ typedef struct glamor_pixmap_private {
      * names.
      */
     glamor_pixmap_fbo **fbo_array;
+
+    Bool is_cbcr;
 } glamor_pixmap_private;
 
 extern DevPrivateKeyRec glamor_pixmap_private_key;
@@ -902,7 +904,7 @@ int glamor_xv_put_image(glamor_port_private *port_priv,
                         Bool sync,
                         RegionPtr clipBoxes);
 void glamor_xv_core_init(ScreenPtr screen);
-void glamor_xv_render(glamor_port_private *port_priv);
+void glamor_xv_render(glamor_port_private *port_priv, int id);
 
 #include "glamor_utils.h"
 
diff --git a/glamor/glamor_transfer.c b/glamor/glamor_transfer.c
index ebb5101d1..421ed3a5f 100644
--- a/glamor/glamor_transfer.c
+++ b/glamor/glamor_transfer.c
@@ -27,6 +27,7 @@
 void
 glamor_format_for_pixmap(PixmapPtr pixmap, GLenum *format, GLenum *type)
 {
+    glamor_pixmap_private       *priv = glamor_get_pixmap_private(pixmap);
     switch (pixmap->drawable.depth) {
     case 24:
     case 32:
@@ -38,8 +39,13 @@ glamor_format_for_pixmap(PixmapPtr pixmap, GLenum *format, GLenum *type)
         *type = GL_UNSIGNED_INT_2_10_10_10_REV;
         break;
     case 16:
-        *format = GL_RGB;
-        *type = GL_UNSIGNED_SHORT_5_6_5;
+        if (priv->is_cbcr) {
+          *format = priv->fbo->format;
+          *type = GL_UNSIGNED_BYTE;
+        } else {
+          *format = GL_RGB;
+          *type = GL_UNSIGNED_SHORT_5_6_5;
+        }
         break;
     case 15:
         *format = GL_BGRA;
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 0d5674d63..1890c1fe5 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -613,10 +613,14 @@ gl_iformat_for_pixmap(PixmapPtr pixmap)
 {
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private((pixmap)->drawable.pScreen);
+    glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
 
     if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP &&
         ((pixmap)->drawable.depth == 1 || (pixmap)->drawable.depth == 8)) {
         return glamor_priv->one_channel_format;
+    } else if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP &&
+               (pixmap)->drawable.depth == 16 && pixmap_priv->is_cbcr) {
+        return GL_RG;
     } else if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP &&
                (pixmap)->drawable.depth == 30) {
         return GL_RGB10_A2;
-- 
2.17.1