diff options
| author | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2014-11-04 01:21:59 +0800 | 
|---|---|---|
| committer | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2014-11-04 01:21:59 +0800 | 
| commit | 3700cde36048b87198d7f234af99097e3f39613c (patch) | |
| tree | 6193130148ece33c72a21ce3441f3f71b6c99c4c | |
| parent | d90c69a2233feb37d52b32b6e47e6da086b46bfe (diff) | |
| download | marcuscom-ports-3700cde36048b87198d7f234af99097e3f39613c.tar.gz marcuscom-ports-3700cde36048b87198d7f234af99097e3f39613c.tar.zst marcuscom-ports-3700cde36048b87198d7f234af99097e3f39613c.zip | |
Add code (copied from libGL) for detecting if Mesa is 9.1.7 or 10.3+.
If Mesa 9.1.7 is found remove the gbm version from configure and rollback
the commit that caused the version to be bumped.
This allows 9.x and 10.0-R to have GNOME 3.
git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@20040 df743ca5-7f9a-e211-a948-0013205c9059
| -rw-r--r-- | x11-wm/mutter/Makefile | 23 | ||||
| -rw-r--r-- | x11-wm/mutter/files/extra-488dd0b | 245 | 
2 files changed, 268 insertions, 0 deletions
| diff --git a/x11-wm/mutter/Makefile b/x11-wm/mutter/Makefile index 0fe326237..55e139770 100644 --- a/x11-wm/mutter/Makefile +++ b/x11-wm/mutter/Makefile @@ -38,8 +38,31 @@ GLIB_SCHEMAS=	org.gnome.mutter.gschema.xml \  PLIST_SUB=	VERSION=${PORTVERSION:R} +.include <bsd.port.options.mk> + +# borrowed from graphics/libGL to see where Mesa 10.3 is available. +# hw context support in the i915kms driver +.if ${OPSYS} == FreeBSD && \ + (${OSVERSION} >= 1100000 && ${OSVERSION} < 1100035 || \ +  ${OSVERSION} < 1000717) +_OLD_MESA=1 +.endif + +.if ${OPSYS} == DragonFly && ${DFLYVERSION} >= 300901 +_OLD_MESA=1 +.endif + +.if defined(_OLD_MESA) +EXTRA_PATCHES+=	${FILESDIR}/extra-488dd0b +.endif + +# remove the gbm sed line if gbm 10.3 is more widespread.  post-patch:  	@${REINPLACE_CMD} -e 's|-Wcast-align||g' \  		${WRKSRC}/configure +.if defined(_OLD_MESA) +	@${REINPLACE_CMD} -e 's|gbm >= 10.3|gbm|g' \ +		${WRKSRC}/configure +.endif  .include <bsd.port.mk> diff --git a/x11-wm/mutter/files/extra-488dd0b b/x11-wm/mutter/files/extra-488dd0b new file mode 100644 index 000000000..ccf95b149 --- /dev/null +++ b/x11-wm/mutter/files/extra-488dd0b @@ -0,0 +1,245 @@ +Revert the following commit, so we can lower the gbm requirements. +Because it needs gbm 10.3+ + +This exposes a bug that the cursor isn't rendered correctly on newer +Radeon cards that support 256x256 cursors. But we don't support those +really yet. + +From 488dd0b402dc8c56a70f995a7456c2ff511a818b Mon Sep 17 00:00:00 2001 +From: "Jasper St. Pierre" <jstpierre@mecheye.net> +Date: Wed, 24 Sep 2014 15:40:09 -0600 +Subject: Support for hardware cursor sizes other than 64x64 on wayland +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use the new DRM capabilities to figure out the correct cursor size, and +make sure that matches instead of hardcoding 64x64. This fixes incorrect +rendering on some newer AMD cards that support 256x256 cursors. + +Based heavily on a patch by: +Alvaro Fernando GarcĂa <alvarofernandogarcia@gmail.com> + + +--- ./src/backends/native/meta-cursor-renderer-native.c.orig	2014-10-02 16:29:20.000000000 +0200 ++++ ./src/backends/native/meta-cursor-renderer-native.c	2014-11-03 17:38:11.528443462 +0100 +@@ -27,27 +27,16 @@ + #include "meta-cursor-renderer-native.h" +  + #include <gbm.h> +-#include <xf86drm.h> +  + #include "meta-cursor-private.h" + #include "meta-monitor-manager.h" +  +-#ifndef DRM_CAP_CURSOR_WIDTH +-#define DRM_CAP_CURSOR_WIDTH 0x8 +-#endif +-#ifndef DRM_CAP_CURSOR_HEIGHT +-#define DRM_CAP_CURSOR_HEIGHT 0x9 +-#endif +- + struct _MetaCursorRendererNativePrivate + { +   gboolean has_hw_cursor; +  +   int drm_fd; +   struct gbm_device *gbm; +- +-  uint64_t cursor_width; +-  uint64_t cursor_height; + }; + typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate; +  +@@ -82,13 +71,17 @@ set_crtc_cursor (MetaCursorRendererNativ +     { +       struct gbm_bo *bo; +       union gbm_bo_handle handle; ++      int width, height; +       int hot_x, hot_y; +  +       bo = meta_cursor_reference_get_gbm_bo (cursor, &hot_x, &hot_y); +  +       handle = gbm_bo_get_handle (bo); ++      width = gbm_bo_get_width (bo); ++      height = gbm_bo_get_height (bo); ++ +       drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32, +-                         priv->cursor_width, priv->cursor_height, hot_x, hot_y); ++                         width, height, hot_x, hot_y); +     } +   else +     { +@@ -193,19 +186,6 @@ meta_cursor_renderer_native_init (MetaCu +       CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx)); +       priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer); +       priv->gbm = gbm_create_device (priv->drm_fd); +- +-      uint64_t width, height; +-      if (drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_WIDTH, &width) == 0 && +-          drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_HEIGHT, &height) == 0) +-        { +-          priv->cursor_width = width; +-          priv->cursor_height = height; +-        } +-      else +-        { +-          priv->cursor_width = 64; +-          priv->cursor_height = 64; +-        } +     } + #endif + } +@@ -219,16 +199,6 @@ meta_cursor_renderer_native_get_gbm_devi + } +  + void +-meta_cursor_renderer_native_get_cursor_size (MetaCursorRendererNative *native, +-                                             uint64_t *width, uint64_t *height) +-{ +-  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native); +- +-  *width = priv->cursor_width; +-  *height = priv->cursor_height; +-} +- +-void + meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native) + { +   update_hw_cursor (native, TRUE); +--- ./src/backends/native/meta-cursor-renderer-native.h.orig	2014-10-02 16:29:20.000000000 +0200 ++++ ./src/backends/native/meta-cursor-renderer-native.h	2014-11-03 17:38:11.529443324 +0100 +@@ -50,7 +50,6 @@ struct _MetaCursorRendererNativeClass + GType meta_cursor_renderer_native_get_type (void) G_GNUC_CONST; +  + struct gbm_device * meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *renderer); +-void meta_cursor_renderer_native_get_cursor_size (MetaCursorRendererNative *native, uint64_t *width, uint64_t *height); + void meta_cursor_renderer_native_force_update (MetaCursorRendererNative *renderer); +  + #endif /* META_CURSOR_RENDERER_NATIVE_H */ +--- ./src/backends/meta-cursor.c.orig	2014-10-30 11:57:01.000000000 +0100 ++++ ./src/backends/meta-cursor.c	2014-11-03 17:38:11.526443521 +0100 +@@ -140,55 +140,34 @@ load_cursor_on_client (MetaCursor cursor + } +  + static void +-get_hardware_cursor_size (uint64_t *cursor_width, uint64_t *cursor_height) +-{ +-#ifdef HAVE_NATIVE_BACKEND +-  MetaBackend *meta_backend = meta_get_backend (); +-  MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend); +- +-  if (META_IS_CURSOR_RENDERER_NATIVE (renderer)) +-    { +-      meta_cursor_renderer_native_get_cursor_size (META_CURSOR_RENDERER_NATIVE (renderer), cursor_width, cursor_height); +-      return; +-    } +-#endif +- +-  g_assert_not_reached (); +-} +- +-static void + meta_cursor_image_load_gbm_buffer (struct gbm_device *gbm, +                                    MetaCursorImage   *image, +                                    uint8_t           *pixels, +-                                   uint               width, +-                                   uint               height, ++                                   int                width, ++                                   int                height, +                                    int                rowstride, +                                    uint32_t           gbm_format) + { +-  uint64_t cursor_width, cursor_height; +-  get_hardware_cursor_size (&cursor_width, &cursor_height); +- +-  if (width > cursor_width || height > cursor_height) ++  if (width > 64 || height > 64) +     { +-      meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n", +-                    (unsigned int)cursor_width, (unsigned int)cursor_height); ++      meta_warning ("Invalid theme cursor size (must be at most 64x64)\n"); +       return; +     } +  +   if (gbm_device_is_format_supported (gbm, gbm_format, +-                                      GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE)) ++                                      GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE)) +     { +-      uint8_t buf[4 * cursor_width * cursor_height]; +-      uint i; ++      uint8_t buf[4 * 64 * 64]; ++      int i; +  +-      image->bo = gbm_bo_create (gbm, cursor_width, cursor_height, +-                                 gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE); ++      image->bo = gbm_bo_create (gbm, 64, 64, ++                                 gbm_format, GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE); +  +       memset (buf, 0, sizeof(buf)); +       for (i = 0; i < height; i++) +-        memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4); ++        memcpy (buf + i * 4 * 64, pixels + i * rowstride, width * 4); +  +-      gbm_bo_write (image->bo, buf, cursor_width * cursor_height * 4); ++      gbm_bo_write (image->bo, buf, 64 * 64 * 4); +     } +   else +     meta_warning ("HW cursor for format %d not supported\n", gbm_format); +@@ -212,7 +191,7 @@ static void + meta_cursor_image_load_from_xcursor_image (MetaCursorImage   *image, +                                            XcursorImage      *xc_image) + { +-  uint width, height, rowstride; ++  int width, height, rowstride; +   CoglPixelFormat cogl_format; +   uint32_t gbm_format; +   ClutterBackend *clutter_backend; +@@ -283,8 +262,7 @@ meta_cursor_image_load_from_buffer (Meta +   CoglContext *cogl_context; +   struct wl_shm_buffer *shm_buffer; +   uint32_t gbm_format; +-  uint64_t cursor_width, cursor_height; +-  uint width, height; ++  int width, height; +  +   image->hot_x = hot_x; +   image->hot_y = hot_y; +@@ -335,23 +313,22 @@ meta_cursor_image_load_from_buffer (Meta +     } +   else +     { +-      if (gbm) ++      /* HW cursors must be 64x64, but 64x64 is huge, and no cursor theme actually uses ++         that, so themed cursors must be padded with transparent pixels to fill the ++         overlay. This is trivial if we have CPU access to the data, but it's not ++         possible if the buffer is in GPU memory (and possibly tiled too), so if we ++         don't get the right size, we fallback to GL. ++      */ ++      if (width != 64 || height != 64) +         { +-          /* HW cursors have a predefined size (at least 64x64), which usually is bigger than cursor theme +-             size, so themed cursors must be padded with transparent pixels to fill the +-             overlay. This is trivial if we have CPU access to the data, but it's not +-             possible if the buffer is in GPU memory (and possibly tiled too), so if we +-             don't get the right size, we fallback to GL. +-          */ +-          get_hardware_cursor_size (&cursor_width, &cursor_height); +- +-          if (width != cursor_width || height != cursor_height) +-            { +-              meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n"); +-              return; +-            } ++          meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n"); ++          return; ++        } +  +-          image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER, buffer, GBM_BO_USE_CURSOR); ++      if (gbm) ++        { ++          image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER, ++                                     buffer, GBM_BO_USE_CURSOR_64X64); +           if (!image->bo) +             meta_warning ("Importing HW cursor from wl_buffer failed\n"); +         } | 
