On 27.11.2017 23:05, Alex Deucher wrote:
On Mon, Nov 27, 2017 at 5:01 PM, Adam Jackson <a...@redhat.com> wrote:
On Thu, 2017-11-23 at 18:35 +0100, Marek Olšák wrote:
Hi everybody,

Mario, feel free to push your patches if you haven't yet. (except the
workaround)

For AMD, I applied Mario's patches (except Wayland - that didn't
apply) and added initial Gallium support:
https://cgit.freedesktop.org/~mareko/mesa/log/?h=10bit

What's the status of Glamor?

Probably not working at all:

https://cgit.freedesktop.org/xorg/xserver/tree/glamor/glamor_transfer.c#n26

I think we have a branch internally somewhere with support added to
glamor.  I though Nicolai had sent it out a while ago, but maybe I'm
mixing it up with something else.

The patches in question are attached. I thought I had a cleaned up version somewhere, but it doesn't really matter much either way since it needs to be cleaned up again for Mario's work anyway (not using MESA_drm_image, I suppose -- I haven't looked at this in quite some time). But with these patches it used to work at one point :)

Cheers,
Nicolai


Alex


At best I'd expect things to be largely unaccelerated. At the moment
glamor assumes pictures are either [ax]rgb8888 or a8 because it doesn't
know about ARB_texture_view/ARB_texture_storage/ARB_sampler_objects.
The last, at least, has a work-in-progress branch here:

https://github.com/anholt/xserver/tree/glamor-sampler-objects

- ajax
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
>From 9cf5e237e764bc05b6da190051f0f5b0e29b99c2 Mon Sep 17 00:00:00 2001
From: Hawking Zhang <hawking.zh...@amd.com>
Date: Sat, 16 Jul 2016 00:25:31 +0800
Subject: [PATCH xserver 1/3] [HYBRID] glamor: Add 30bit RGB color format
 support

Change-Id: I78cffe8638cc1c85006a8a1cc9d518855189a594
Signed-off-by: Hawking Zhang <hawking.zh...@amd.com>
Reviewed-by: Qiang Yu <qiang...@amd.com>
Reviewed-by: Jim Qu <jim...@amd.com>
---
 glamor/glamor_egl.c      | 11 ++++++++---
 glamor/glamor_fbo.c      |  5 ++++-
 glamor/glamor_transfer.c |  4 ++++
 glamor/glamor_utils.h    |  3 +++
 4 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 4bde637a0..d09ef16e6 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -42,20 +42,24 @@
 #include <gbm.h>
 #include <drm_fourcc.h>
 #endif
 
 #include "glamor_egl.h"
 
 #include "glamor.h"
 #include "glamor_priv.h"
 #include "dri3.h"
 
+#ifndef EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA
+#define EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA 0x31D9
+#endif
+
 static const char glamor_name[] = "glamor";
 
 static void
 glamor_identify(int flags)
 {
     xf86Msg(X_INFO, "%s: OpenGL accelerated X.org driver based.\n",
             glamor_name);
 }
 
 struct glamor_egl_screen_private {
@@ -112,30 +116,31 @@ glamor_egl_make_current(struct glamor_context *glamor_ctx)
 static EGLImageKHR
 _glamor_egl_create_image(struct glamor_egl_screen_private *glamor_egl,
                          int width, int height, int stride, int name, int depth)
 {
     EGLImageKHR image;
 
     EGLint attribs[] = {
         EGL_WIDTH, 0,
         EGL_HEIGHT, 0,
         EGL_DRM_BUFFER_STRIDE_MESA, 0,
-        EGL_DRM_BUFFER_FORMAT_MESA,
-        EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
+        EGL_DRM_BUFFER_FORMAT_MESA, 0,
         EGL_DRM_BUFFER_USE_MESA,
         EGL_DRM_BUFFER_USE_SHARE_MESA | EGL_DRM_BUFFER_USE_SCANOUT_MESA,
         EGL_NONE
     };
     attribs[1] = width;
     attribs[3] = height;
     attribs[5] = stride;
-    if (depth != 32 && depth != 24)
+    attribs[7] =
+        (depth == 30) ? EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA : EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
+    if (depth != 32 && depth != 24 && depth != 30)
         return EGL_NO_IMAGE_KHR;
     image = eglCreateImageKHR(glamor_egl->display,
                               glamor_egl->context,
                               EGL_DRM_BUFFER_MESA,
                               (void *) (uintptr_t) name,
                               attribs);
     if (image == EGL_NO_IMAGE_KHR)
         return EGL_NO_IMAGE_KHR;
 
     return image;
diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 988bb585b..421a4ceaa 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -116,30 +116,33 @@ glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv,
     }
 
     return fbo;
 }
 
 static int
 _glamor_create_tex(glamor_screen_private *glamor_priv,
                    int w, int h, GLenum format)
 {
     unsigned int tex;
+    GLenum iformat = format;
 
+    if (format == GL_RGB10_A2)
+        format = GL_RGBA;
     glamor_make_current(glamor_priv);
     glGenTextures(1, &tex);
     glBindTexture(GL_TEXTURE_2D, tex);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     if (format == glamor_priv->one_channel_format && format == GL_RED)
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
     glamor_priv->suppress_gl_out_of_memory_logging = true;
-    glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0,
+    glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0,
                  format, GL_UNSIGNED_BYTE, NULL);
     glamor_priv->suppress_gl_out_of_memory_logging = false;
 
     if (glGetError() == GL_OUT_OF_MEMORY) {
         if (!glamor_priv->logged_any_fbo_allocation_failure) {
             LogMessageVerb(X_WARNING, 0, "glamor: Failed to allocate %dx%d "
                            "FBO due to GL_OUT_OF_MEMORY.\n", w, h);
             LogMessageVerb(X_WARNING, 0,
                            "glamor: Expect reduced performance.\n");
             glamor_priv->logged_any_fbo_allocation_failure = true;
diff --git a/glamor/glamor_transfer.c b/glamor/glamor_transfer.c
index d788d06f4..ebb5101d1 100644
--- a/glamor/glamor_transfer.c
+++ b/glamor/glamor_transfer.c
@@ -26,20 +26,24 @@
 /* XXX a kludge for now */
 void
 glamor_format_for_pixmap(PixmapPtr pixmap, GLenum *format, GLenum *type)
 {
     switch (pixmap->drawable.depth) {
     case 24:
     case 32:
         *format = GL_BGRA;
         *type = GL_UNSIGNED_INT_8_8_8_8_REV;
         break;
+    case 30:
+        *format = GL_BGRA;
+        *type = GL_UNSIGNED_INT_2_10_10_10_REV;
+        break;
     case 16:
         *format = GL_RGB;
         *type = GL_UNSIGNED_SHORT_5_6_5;
         break;
     case 15:
         *format = GL_BGRA;
         *type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
         break;
     case 8:
         *format = glamor_get_screen_private(pixmap->drawable.pScreen)->one_channel_format;
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 6b88527e6..0ed9c9125 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -616,20 +616,23 @@ format_for_depth(int depth)
 
 static inline GLenum
 gl_iformat_for_pixmap(PixmapPtr pixmap)
 {
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private((pixmap)->drawable.pScreen);
 
     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 == 30) {
+        return GL_RGB10_A2;
     } else {
         return GL_RGBA;
     }
 }
 
 static inline CARD32
 format_for_pixmap(PixmapPtr pixmap)
 {
     return format_for_depth((pixmap)->drawable.depth);
 }
-- 
2.11.0

>From 356031ff84f252e528cfbdca39a2ca456c30f644 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolai=20H=C3=A4hnle?= <nicolai.haeh...@amd.com>
Date: Tue, 24 Jan 2017 14:28:22 +0100
Subject: [PATCH xserver 2/3] glamor: Update for latest draft of
 EGL_MESA_drm_image_formats
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Question: Should EGL_MESA_drm_image_formats be optional? It looks like Mesa
will be able to support EGL_MESA_drm_image_formats whenever
EGL_MESA_drm_image is present.

Signed-off-by: Nicolai Hähnle <nicolai.haeh...@amd.com>
---
 glamor/glamor_egl.c   | 30 ++++++++++++++++++++++++++----
 glamor/glamor_fbo.c   |  2 +-
 glamor/glamor_utils.h | 19 +++++++++++--------
 3 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index d09ef16e6..71f2b8f9d 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -43,21 +43,27 @@
 #include <drm_fourcc.h>
 #endif
 
 #include "glamor_egl.h"
 
 #include "glamor.h"
 #include "glamor_priv.h"
 #include "dri3.h"
 
 #ifndef EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA
-#define EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA 0x31D9
+#define EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA  0x3290
+#endif
+#ifndef EGL_DRM_BUFFER_FORMAT_ARGB1555_MESA
+#define EGL_DRM_BUFFER_FORMAT_ARGB1555_MESA     0x3291
+#endif
+#ifndef EGL_DRM_BUFFER_FORMAT_RGB565_MESA
+#define EGL_DRM_BUFFER_FORMAT_RGB565_MESA       0x3292
 #endif
 
 static const char glamor_name[] = "glamor";
 
 static void
 glamor_identify(int flags)
 {
     xf86Msg(X_INFO, "%s: OpenGL accelerated X.org driver based.\n",
             glamor_name);
 }
@@ -124,24 +130,39 @@ _glamor_egl_create_image(struct glamor_egl_screen_private *glamor_egl,
         EGL_HEIGHT, 0,
         EGL_DRM_BUFFER_STRIDE_MESA, 0,
         EGL_DRM_BUFFER_FORMAT_MESA, 0,
         EGL_DRM_BUFFER_USE_MESA,
         EGL_DRM_BUFFER_USE_SHARE_MESA | EGL_DRM_BUFFER_USE_SCANOUT_MESA,
         EGL_NONE
     };
     attribs[1] = width;
     attribs[3] = height;
     attribs[5] = stride;
-    attribs[7] =
-        (depth == 30) ? EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA : EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
-    if (depth != 32 && depth != 24 && depth != 30)
+
+    switch (depth) {
+    case 15:
+        attribs[7] = EGL_DRM_BUFFER_FORMAT_ARGB1555_MESA;
+        break;
+    case 16:
+        attribs[7] = EGL_DRM_BUFFER_FORMAT_RGB565_MESA;
+        break;
+    case 24:
+    case 32:
+        attribs[7] = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
+        break;
+    case 30:
+        attribs[7] = EGL_DRM_BUFFER_FORMAT_ARGB2101010_MESA;
+        break;
+    default:
         return EGL_NO_IMAGE_KHR;
+    }
+
     image = eglCreateImageKHR(glamor_egl->display,
                               glamor_egl->context,
                               EGL_DRM_BUFFER_MESA,
                               (void *) (uintptr_t) name,
                               attribs);
     if (image == EGL_NO_IMAGE_KHR)
         return EGL_NO_IMAGE_KHR;
 
     return image;
 }
@@ -807,20 +828,21 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
 	}
 
 #define GLAMOR_CHECK_EGL_EXTENSIONS(EXT1, EXT2)	 \
 	if (!epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT1) &&  \
 	    !epoxy_has_egl_extension(glamor_egl->display, "EGL_" #EXT2)) {  \
 		ErrorF("EGL_" #EXT1 " or EGL_" #EXT2 " required.\n");  \
 		goto error;  \
 	}
 
     GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
+    GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image_formats);
     GLAMOR_CHECK_EGL_EXTENSION(KHR_gl_renderbuffer_image);
 #ifdef GLAMOR_GLES2
     GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context, KHR_surfaceless_gles2);
 #else
     GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context,
                                 KHR_surfaceless_opengl);
 #endif
 
 #ifndef GLAMOR_GLES2
     glamor_egl->context = eglCreateContext(glamor_egl->display,
diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c
index 421a4ceaa..e7d209f52 100644
--- a/glamor/glamor_fbo.c
+++ b/glamor/glamor_fbo.c
@@ -118,21 +118,21 @@ glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv,
     return fbo;
 }
 
 static int
 _glamor_create_tex(glamor_screen_private *glamor_priv,
                    int w, int h, GLenum format)
 {
     unsigned int tex;
     GLenum iformat = format;
 
-    if (format == GL_RGB10_A2)
+    if (format == GL_RGB10_A2 || format == GL_RGB5_A1)
         format = GL_RGBA;
     glamor_make_current(glamor_priv);
     glGenTextures(1, &tex);
     glBindTexture(GL_TEXTURE_2D, tex);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     if (format == glamor_priv->one_channel_format && format == GL_RED)
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
     glamor_priv->suppress_gl_out_of_memory_logging = true;
     glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0,
diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h
index 0ed9c9125..bb6621703 100644
--- a/glamor/glamor_utils.h
+++ b/glamor/glamor_utils.h
@@ -613,29 +613,32 @@ format_for_depth(int depth)
         return PICT_a8r8g8b8;
     }
 }
 
 static inline GLenum
 gl_iformat_for_pixmap(PixmapPtr pixmap)
 {
     glamor_screen_private *glamor_priv =
         glamor_get_screen_private((pixmap)->drawable.pScreen);
 
-    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 == 30) {
-        return GL_RGB10_A2;
-    } else {
-        return GL_RGBA;
+    if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+        if ((pixmap)->drawable.depth == 1 || (pixmap)->drawable.depth == 8)
+            return glamor_priv->one_channel_format;
+        else if ((pixmap)->drawable.depth == 30)
+            return GL_RGB10_A2;
+        else if ((pixmap)->drawable.depth == 16)
+            return GL_RGB565;
+        else if ((pixmap)->drawable.depth == 15)
+            return GL_RGB5_A1;
     }
+
+    return GL_RGBA;
 }
 
 static inline CARD32
 format_for_pixmap(PixmapPtr pixmap)
 {
     return format_for_depth((pixmap)->drawable.depth);
 }
 
 #define REVERT_NONE       		0
 #define REVERT_NORMAL     		1
-- 
2.11.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to