From 445cf0105544eb0002971b652460efc6b841e671 Mon Sep 17 00:00:00 2001 From: Jorgen Lind Date: Fri, 20 Dec 2013 14:34:16 +0100 Subject: update DrmEglServerIntegration to handle experimental 8 bit support Change-Id: I8fa4ecf8b0848ca681f944a5fa56a4f6bb0a76be Reviewed-by: Laszlo Agocs --- .../0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch | 112 +++++++++++++++++++++ .../drmeglserverbufferintegration.cpp | 44 +++++--- .../drmeglserverbufferintegration.cpp | 18 +++- 3 files changed, 155 insertions(+), 19 deletions(-) create mode 100644 src/3rdparty/patches/0001-Add-a-EGL_DRM_BUFFER_FORMAT_A8_MESA.patch 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 +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; } -- cgit v1.2.3