summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJorgen Lind <jorgen.lind@digia.com>2013-12-20 14:34:16 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-06 10:19:53 +0100
commit445cf0105544eb0002971b652460efc6b841e671 (patch)
tree8caae6c04918583cfcafff8591c52e34394e6ae5
parent76bb668aee8be5e8e1f022c4d09603d957e8e7e7 (diff)
update DrmEglServerIntegration to handle experimental 8 bit support
Change-Id: I8fa4ecf8b0848ca681f944a5fa56a4f6bb0a76be Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
-rw-r--r--src/3rdparty/patches/0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch112
-rw-r--r--src/hardwareintegration/client/drm-egl-server/drmeglserverbufferintegration.cpp44
-rw-r--r--src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp18
3 files changed, 155 insertions, 19 deletions
diff --git a/src/3rdparty/patches/0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch b/src/3rdparty/patches/0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch
new file mode 100644
index 000000000..46fac7144
--- /dev/null
+++ b/src/3rdparty/patches/0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch
@@ -0,0 +1,112 @@
+From 52dbed7516b79459d1c8f2ed3ea4a5e71734c969 Mon Sep 17 00:00:00 2001
+From: Jorgen Lind <jorgen.lind@digia.com>
+Date: Thu, 2 Jan 2014 12:28:54 +0100
+Subject: [PATCH] Add a EGL_DRM_BUFFER_FORMAT_A8_MESA
+
+This is to allow us to share A8 DRM buffers between processes
+---
+ include/EGL/eglext.h | 1 +
+ include/GL/internal/dri_interface.h | 1 +
+ src/egl/drivers/dri2/egl_dri2.c | 7 +++++++
+ src/mesa/drivers/dri/i915/intel_screen.c | 5 +++++
+ src/mesa/drivers/dri/i965/intel_screen.c | 5 +++++
+ 5 files changed, 19 insertions(+)
+
+diff --git a/include/EGL/eglext.h b/include/EGL/eglext.h
+index 1d68178..6c4fb7e 100644
+--- a/include/EGL/eglext.h
++++ b/include/EGL/eglext.h
+@@ -271,6 +271,7 @@ typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dp
+ #define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 /* CreateDRMImageMESA attribute */
+ #define EGL_DRM_BUFFER_USE_MESA 0x31D1 /* CreateDRMImageMESA attribute */
+ #define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 /* EGL_IMAGE_FORMAT_MESA attribute value */
++#define EGL_DRM_BUFFER_FORMAT_A8_MESA 0x31D5 /* EGL_IMAGE_FORMAT_MESA attribute value */
+ #define EGL_DRM_BUFFER_MESA 0x31D3 /* eglCreateImageKHR target */
+ #define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4
+ #define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 /* EGL_DRM_BUFFER_USE_MESA bits */
+diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
+index 5c99d55..565f1fb 100644
+--- a/include/GL/internal/dri_interface.h
++++ b/include/GL/internal/dri_interface.h
+@@ -964,6 +964,7 @@ struct __DRIdri2ExtensionRec {
+ #define __DRI_IMAGE_FORMAT_R8 0x1006 /* Since version 5 */
+ #define __DRI_IMAGE_FORMAT_GR88 0x1007
+ #define __DRI_IMAGE_FORMAT_NONE 0x1008
++#define __DRI_IMAGE_FORMAT_A8 0x1009 /* Patch */
+
+ #define __DRI_IMAGE_USE_SHARE 0x0001
+ #define __DRI_IMAGE_USE_SCANOUT 0x0002
+diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
+index a8584b7..1cb6967 100644
+--- a/src/egl/drivers/dri2/egl_dri2.c
++++ b/src/egl/drivers/dri2/egl_dri2.c
+@@ -1152,6 +1152,10 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
+ format = __DRI_IMAGE_FORMAT_ARGB8888;
+ pitch = attrs.DRMBufferStrideMESA;
+ break;
++ case EGL_DRM_BUFFER_FORMAT_A8_MESA:
++ format = __DRI_IMAGE_FORMAT_A8;
++ pitch = attrs.DRMBufferStrideMESA;
++ break;
+ default:
+ _eglError(EGL_BAD_PARAMETER,
+ "dri2_create_image_khr: unsupported pixmap depth");
+@@ -1427,6 +1431,9 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
+ case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
+ format = __DRI_IMAGE_FORMAT_ARGB8888;
+ break;
++ case EGL_DRM_BUFFER_FORMAT_A8_MESA:
++ format = __DRI_IMAGE_FORMAT_A8;
++ break;
+ default:
+ _eglLog(_EGL_WARNING, "bad image format value 0x%04x",
+ attrs.DRMBufferFormatMESA);
+diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
+index 30a867e..3e1909b 100644
+--- a/src/mesa/drivers/dri/i915/intel_screen.c
++++ b/src/mesa/drivers/dri/i915/intel_screen.c
+@@ -261,6 +261,9 @@ intel_allocate_image(int dri_format, void *loaderPrivate)
+ case __DRI_IMAGE_FORMAT_R8:
+ image->format = MESA_FORMAT_R8;
+ break;
++ case __DRI_IMAGE_FORMAT_A8:
++ image->format = MESA_FORMAT_A8;
++ break;
+ case __DRI_IMAGE_FORMAT_GR88:
+ image->format = MESA_FORMAT_GR88;
+ break;
+@@ -330,6 +333,8 @@ intel_dri_format(GLuint format)
+ return __DRI_IMAGE_FORMAT_ABGR8888;
+ case MESA_FORMAT_R8:
+ return __DRI_IMAGE_FORMAT_R8;
++ case MESA_FORMAT_A8:
++ return __DRI_IMAGE_FORMAT_A8;
+ case MESA_FORMAT_RG88:
+ return __DRI_IMAGE_FORMAT_GR88;
+ }
+diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
+index f913c42..68ee33b 100644
+--- a/src/mesa/drivers/dri/i965/intel_screen.c
++++ b/src/mesa/drivers/dri/i965/intel_screen.c
+@@ -262,6 +262,9 @@ intel_allocate_image(int dri_format, void *loaderPrivate)
+ case __DRI_IMAGE_FORMAT_R8:
+ image->format = MESA_FORMAT_R8;
+ break;
++ case __DRI_IMAGE_FORMAT_A8:
++ image->format = MESA_FORMAT_A8;
++ break;
+ case __DRI_IMAGE_FORMAT_GR88:
+ image->format = MESA_FORMAT_GR88;
+ break;
+@@ -334,6 +337,8 @@ intel_dri_format(GLuint format)
+ return __DRI_IMAGE_FORMAT_ABGR8888;
+ case MESA_FORMAT_R8:
+ return __DRI_IMAGE_FORMAT_R8;
++ case MESA_FORMAT_A8:
++ return __DRI_IMAGE_FORMAT_A8;
+ case MESA_FORMAT_RG88:
+ return __DRI_IMAGE_FORMAT_GR88;
+ }
+--
+1.8.5.1
+
diff --git a/src/hardwareintegration/client/drm-egl-server/drmeglserverbufferintegration.cpp b/src/hardwareintegration/client/drm-egl-server/drmeglserverbufferintegration.cpp
index 7edfa2c90..999347fbd 100644
--- a/src/hardwareintegration/client/drm-egl-server/drmeglserverbufferintegration.cpp
+++ b/src/hardwareintegration/client/drm-egl-server/drmeglserverbufferintegration.cpp
@@ -54,31 +54,43 @@ DrmServerBuffer::DrmServerBuffer(DrmEglServerBufferIntegration *integration
, int32_t height
, int32_t stride
, int32_t format)
- : m_integration(integration)
+ : QWaylandServerBuffer()
+ , m_integration(integration)
{
- EGLint attribs[] = {
- EGL_WIDTH, width,
- EGL_HEIGHT, height,
- EGL_DRM_BUFFER_STRIDE_MESA, stride /4,
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_NONE
- };
-
- qintptr name_pointer = name;
- m_image = integration->eglCreateImageKHR(EGL_NO_CONTEXT, EGL_DRM_BUFFER_MESA, (EGLClientBuffer) name_pointer, attribs);
-
+ m_size = QSize(width, height);
+ EGLint egl_format;
+ int32_t format_stride;
switch (format) {
case QtWayland::qt_drm_egl_server_buffer::format_RGBA32:
m_format = QWaylandServerBuffer::RGBA32;
+ egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
+ format_stride = stride / 4;
break;
+#ifdef EGL_DRM_BUFFER_FORMAT_A8_MESA
case QtWayland::qt_drm_egl_server_buffer::format_A8:
m_format = QWaylandServerBuffer::A8;
+ egl_format = EGL_DRM_BUFFER_FORMAT_A8_MESA;
+ format_stride = stride;
break;
+#endif
default:
qWarning("DrmServerBuffer: unknown format");
m_format = QWaylandServerBuffer::RGBA32;
+ egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
+ format_stride = stride / 4;
break;
}
+ EGLint attribs[] = {
+ EGL_WIDTH, width,
+ EGL_HEIGHT, height,
+ EGL_DRM_BUFFER_STRIDE_MESA, format_stride,
+ EGL_DRM_BUFFER_FORMAT_MESA, egl_format,
+ EGL_NONE
+ };
+
+ qintptr name_pointer = name;
+ m_image = integration->eglCreateImageKHR(EGL_NO_CONTEXT, EGL_DRM_BUFFER_MESA, (EGLClientBuffer) name_pointer, attribs);
+
}
DrmServerBuffer::~DrmServerBuffer()
@@ -96,10 +108,10 @@ GLuint DrmServerBuffer::createTexture()
glBindTexture(GL_TEXTURE_2D, texture_id);
m_integration->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
return texture_id;
}
diff --git a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
index 3a7986ede..d43fc70b4 100644
--- a/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
+++ b/src/hardwareintegration/compositor/drm-egl-server/drmeglserverbufferintegration.cpp
@@ -48,24 +48,30 @@ DrmEglServerBuffer::DrmEglServerBuffer(DrmEglServerBufferIntegration *integratio
: QWaylandServerBuffer(size,format)
, m_integration(integration)
{
- m_format = RGBA32;
+ m_format = format;
+ EGLint egl_format;
switch (m_format) {
case RGBA32:
m_drm_format = QtWaylandServer::qt_drm_egl_server_buffer::format_RGBA32;
+ egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
break;
+#ifdef EGL_DRM_BUFFER_FORMAT_A8_MESA
case A8:
m_drm_format = QtWaylandServer::qt_drm_egl_server_buffer::format_A8;
+ egl_format = EGL_DRM_BUFFER_FORMAT_A8_MESA;
break;
+#endif
default:
- qWarning("DrmEglServerBuffer: invalid format");
+ qWarning("DrmEglServerBuffer: unsupported format");
m_drm_format = QtWaylandServer::qt_drm_egl_server_buffer::format_RGBA32;
+ egl_format = EGL_DRM_BUFFER_FORMAT_ARGB32_MESA;
break;
}
EGLint imageAttribs[] = {
EGL_WIDTH, m_size.width(),
EGL_HEIGHT, m_size.height(),
- EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
+ EGL_DRM_BUFFER_FORMAT_MESA, egl_format,
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA,
EGL_NONE
};
@@ -106,8 +112,14 @@ GLuint DrmEglServerBuffer::createTexture()
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
+
m_integration->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, m_image);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
return texture;
}