summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac14
-rw-r--r--src/Makefile.am7
-rw-r--r--src/intel.h1
-rw-r--r--src/intel_display.c5
-rw-r--r--src/intel_driver.c17
-rw-r--r--src/intel_glamor.c226
-rw-r--r--src/intel_glamor.h63
-rw-r--r--src/intel_uxa.c34
8 files changed, 358 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac
index 8afe25b0..2b25ee59 100644
--- a/configure.ac
+++ b/configure.ac
@@ -148,6 +148,20 @@ if test "x$UXA" != "xno"; then
fi
AC_MSG_RESULT([$UXA])
+AC_MSG_CHECKING([whether to include GLAMOR support])
+AC_ARG_ENABLE(glamor,
+ AS_HELP_STRING([--enable-glamor],
+ [Enable glamor, a new GL-based acceleration [default=no]]),
+ [GLAMOR="$enableval"],
+ [GLAMOR=no])
+AC_MSG_RESULT([$GLAMOR])
+AM_CONDITIONAL(GLAMOR, test x$GLAMOR != xno)
+if test "x$GLAMOR" != "xno"; then
+ PKG_CHECK_MODULES(LIBGLAMOR, [glamor])
+ PKG_CHECK_MODULES(LIBGLAMOR_EGL, [glamor-egl])
+ AC_DEFINE(USE_GLAMOR, 1, [Enable glamor acceleration])
+fi
+
AC_ARG_ENABLE(vmap,
AS_HELP_STRING([--enable-vmap],
[Enable use of vmap [default=no]]),
diff --git a/src/Makefile.am b/src/Makefile.am
index e5097daf..e821b94b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -58,6 +58,7 @@ intel_drv_la_SOURCES += \
intel_display.c \
intel_driver.c \
intel_driver.h \
+ intel_glamor.h \
intel_memory.c \
intel_shadow.c \
intel_uxa.c \
@@ -77,6 +78,12 @@ intel_drv_la_SOURCES += \
i965_render.c \
$(NULL)
+if GLAMOR
+intel_drv_la_SOURCES += \
+ intel_glamor.c \
+ $(NULL)
+endif
+
if DRI
intel_drv_la_SOURCES += \
intel_dri.c \
diff --git a/src/intel.h b/src/intel.h
index 1a002e2c..1f004a86 100644
--- a/src/intel.h
+++ b/src/intel.h
@@ -316,6 +316,7 @@ typedef struct intel_screen_private {
void (*batch_commit_notify) (struct intel_screen_private *intel);
struct _UxaDriver *uxa_driver;
+ int uxa_flags;
Bool need_sync;
int accel_pixmap_offset_alignment;
int accel_max_x;
diff --git a/src/intel_display.c b/src/intel_display.c
index 6fec8b0e..95a9488f 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -45,6 +45,8 @@
#include "X11/extensions/dpmsconst.h"
#include "xf86DDC.h"
+#include "intel_glamor.h"
+
struct intel_mode {
int fd;
uint32_t fb_id;
@@ -453,6 +455,7 @@ intel_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
crtc->y = y;
crtc->rotation = rotation;
+ intel_glamor_flush(intel);
intel_batch_submit(crtc->scrn);
mode_to_kmode(crtc->scrn, &intel_crtc->kmode, mode);
@@ -1365,6 +1368,7 @@ intel_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
if (scrn->virtualX == width && scrn->virtualY == height)
return TRUE;
+ intel_glamor_flush(intel);
intel_batch_submit(scrn);
old_width = scrn->virtualX;
@@ -1454,6 +1458,7 @@ intel_do_pageflip(intel_screen_private *intel,
new_front->handle, &mode->fb_id))
goto error_out;
+ intel_glamor_flush(intel);
intel_batch_submit(scrn);
/*
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 188c5125..451bebd9 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -76,6 +76,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "i915_drm.h"
#include <xf86drmMode.h>
+#include "intel_glamor.h"
+
/* *INDENT-OFF* */
/*
* Note: "ColorKey" is provided for compatibility with the i810 driver.
@@ -713,6 +715,13 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
return FALSE;
}
+ if (!intel_glamor_pre_init(scrn)) {
+ PreInitCleanup(scrn);
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to pre init glamor display.\n");
+ return FALSE;
+ }
+
/* Load the dri2 module if requested. */
if (intel->directRenderingType != DRI_DISABLED)
xf86LoadSubModule(scrn, "dri2");
@@ -814,8 +823,10 @@ intel_flush_callback(CallbackListPtr *list,
pointer user_data, pointer call_data)
{
ScrnInfoPtr scrn = user_data;
- if (scrn->vtSema)
+ if (scrn->vtSema) {
intel_batch_submit(scrn);
+ intel_glamor_flush(intel_get_screen_private(scrn));
+ }
}
#if HAVE_UDEV
@@ -1111,6 +1122,8 @@ static void I830FreeScreen(int scrnIndex, int flags)
ScrnInfoPtr scrn = xf86Screens[scrnIndex];
intel_screen_private *intel = intel_get_screen_private(scrn);
+ intel_glamor_free_screen(scrnIndex, flags);
+
if (intel) {
intel_mode_fini(intel);
intel_close_drm_master(intel);
@@ -1187,6 +1200,8 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
DeleteCallback(&FlushCallback, intel_flush_callback, scrn);
+ intel_glamor_close_screen(screen);
+
if (intel->uxa_driver) {
uxa_driver_fini(screen);
free(intel->uxa_driver);
diff --git a/src/intel_glamor.c b/src/intel_glamor.c
new file mode 100644
index 00000000..7b19d5d0
--- /dev/null
+++ b/src/intel_glamor.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright © 2011 Intel Corporation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including
+ * the next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ * Zhigang Gong <zhigang.gong@linux.intel.com>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <xf86.h>
+#define GLAMOR_FOR_XORG 1
+#include <glamor.h>
+
+#include "intel.h"
+#include "intel_glamor.h"
+#include "uxa.h"
+
+Bool
+intel_glamor_create_screen_resources(ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ if (!(intel->uxa_flags & UXA_USE_GLAMOR))
+ return TRUE;
+
+ if (!glamor_glyphs_init(screen))
+ return FALSE;
+ if (!glamor_egl_create_textured_screen(screen,
+ intel->front_buffer->handle,
+ intel->front_pitch))
+ return FALSE;
+ return TRUE;
+}
+
+Bool
+intel_glamor_pre_init(ScrnInfoPtr scrn)
+{
+ intel_screen_private *intel;
+ intel = intel_get_screen_private(scrn);
+
+ /* Load glamor module */
+ if (xf86LoadSubModule(scrn, "glamor_egl") &&
+ glamor_egl_init(scrn, intel->drmSubFD)) {
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "glamor detected, initialising\n");
+ intel->uxa_flags |= UXA_USE_GLAMOR;
+ } else {
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "glamor not available\n");
+ intel->uxa_flags &= ~UXA_USE_GLAMOR;
+ }
+
+ return TRUE;
+}
+
+Bool
+intel_glamor_create_textured_pixmap(PixmapPtr pixmap)
+{
+ ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ struct intel_pixmap *priv;
+
+ if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
+ return TRUE;
+
+ priv = intel_get_pixmap_private(pixmap);
+ if (glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle,
+ priv->stride)) {
+ priv->pinned = 1;
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+void
+intel_glamor_destroy_pixmap(PixmapPtr pixmap)
+{
+ ScrnInfoPtr scrn = xf86Screens[pixmap->drawable.pScreen->myNum];
+ intel_screen_private * intel;
+
+ intel = intel_get_screen_private(scrn);
+ if (intel->uxa_flags & UXA_USE_GLAMOR)
+ glamor_egl_destroy_textured_pixmap(pixmap);
+}
+
+static void
+intel_glamor_need_flush(DrawablePtr pDrawable)
+{
+ ScrnInfoPtr scrn = xf86Screens[pDrawable->pScreen->myNum];
+ intel_screen_private * intel;
+
+ intel = intel_get_screen_private(scrn);
+ intel->needs_flush = TRUE;
+}
+
+static void
+intel_glamor_finish_access(PixmapPtr pixmap, uxa_access_t access)
+{
+ switch(access) {
+ case UXA_ACCESS_RO:
+ case UXA_ACCESS_RW:
+ case UXA_GLAMOR_ACCESS_RO:
+ break;
+ case UXA_GLAMOR_ACCESS_RW:
+ intel_glamor_need_flush(&pixmap->drawable);
+ glamor_block_handler(pixmap->drawable.pScreen);
+ break;
+ default:
+ ErrorF("Invalid access mode %d\n", access);
+ }
+
+ return;
+}
+
+
+Bool
+intel_glamor_init(ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+
+ if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
+ return TRUE;
+
+ if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to initialize glamor\n");
+ goto fail;
+ }
+
+ if (!glamor_egl_init_textured_pixmap(screen)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to initialize textured pixmap.\n");
+ goto fail;
+ }
+
+ intel->uxa_driver->flags |= UXA_USE_GLAMOR;
+ intel->uxa_flags = intel->uxa_driver->flags;
+
+ intel->uxa_driver->finish_access = intel_glamor_finish_access;
+
+ xf86DrvMsg(scrn->scrnIndex, X_INFO,
+ "Use GLAMOR acceleration.\n");
+ return TRUE;
+
+ fail:
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "Use standard UXA acceleration.");
+ return FALSE;
+}
+
+void
+intel_glamor_flush(intel_screen_private * intel)
+{
+ ScreenPtr screen;
+
+ screen = screenInfo.screens[intel->scrn->scrnIndex];
+ if (intel->uxa_flags & UXA_USE_GLAMOR)
+ glamor_block_handler(screen);
+}
+
+Bool
+intel_glamor_create_screen_image(ScreenPtr screen, int handle, int stride)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ intel_screen_private *intel;
+ PixmapPtr pixmap;
+
+ intel = intel_get_screen_private(scrn);
+ if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
+ return TRUE;
+
+ if (!glamor_egl_create_textured_screen(screen, handle, stride))
+ return FALSE;
+
+ pixmap = screen->GetScreenPixmap(screen);
+ return TRUE;
+}
+
+Bool
+intel_glamor_close_screen(ScreenPtr screen)
+{
+ ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+ intel_screen_private * intel;
+
+ intel = intel_get_screen_private(scrn);
+ if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
+ return glamor_egl_close_screen(screen);
+ return TRUE;
+}
+
+void
+intel_glamor_free_screen(int scrnIndex, int flags)
+{
+ ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+ intel_screen_private * intel;
+
+ intel = intel_get_screen_private(scrn);
+ if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
+ glamor_egl_free_screen(scrnIndex, GLAMOR_EGL_EXTERNAL_BUFFER);
+}
diff --git a/src/intel_glamor.h b/src/intel_glamor.h
new file mode 100644
index 00000000..1ba17c03
--- /dev/null
+++ b/src/intel_glamor.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2011 Intel Corporation.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including
+ * the next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ * Zhigang Gong <zhigang.gong@linux.intel.com>
+ *
+ */
+
+#ifndef INTEL_GLAMOR_H
+#define INTEL_GLAMOR_H
+
+#ifdef USE_GLAMOR
+
+Bool intel_glamor_pre_init(ScrnInfoPtr scrn);
+Bool intel_glamor_init(ScreenPtr screen);
+Bool intel_glamor_create_screen_resources(ScreenPtr screen);
+Bool intel_glamor_create_screen_image(ScreenPtr screen, int handle, int stride);
+Bool intel_glamor_close_screen(ScreenPtr screen);
+void intel_glamor_free_screen(int scrnIndex, int flags);
+
+void intel_glamor_flush(intel_screen_private * intel);
+
+Bool intel_glamor_create_textured_pixmap(PixmapPtr pixmap);
+void intel_glamor_destroy_pixmap(PixmapPtr pixmap);
+
+#else
+
+static inline Bool intel_glamor_pre_init(ScrnInfoPtr scrn) { return TRUE; }
+static inline Bool intel_glamor_init(ScreenPtr screen) { return TRUE; }
+static inline Bool intel_glamor_create_screen_resources(ScreenPtr screen) { return TRUE; }
+static inline Bool intel_glamor_create_screen_image(ScreenPtr screen, int handle, int stride) { return TRUE; }
+static inline Bool intel_glamor_close_screen(ScreenPtr screen) { return TRUE; }
+static inline void intel_glamor_free_screen(int scrnIndex, int flags) { }
+
+static inline void intel_glamor_flush(intel_screen_private * intel) { }
+
+static inline Bool intel_glamor_create_textured_pixmap(PixmapPtr pixmap) { return TRUE; }
+static inline void intel_glamor_destroy_pixmap(PixmapPtr pixmap) { }
+
+#endif
+
+#endif /* INTEL_GLAMOR_H */
diff --git a/src/intel_uxa.c b/src/intel_uxa.c
index 94dfb86f..114a43ed 100644
--- a/src/intel_uxa.c
+++ b/src/intel_uxa.c
@@ -31,17 +31,19 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "config.h"
#endif
-#include "xf86.h"
-#include "xaarop.h"
-#include "intel.h"
-#include "i830_reg.h"
-#include "i915_drm.h"
-#include "brw_defines.h"
+#include <xf86.h>
+#include <xaarop.h>
#include <string.h>
#include <errno.h>
+#include "intel.h"
+#include "intel_glamor.h"
#include "uxa.h"
+#include "i830_reg.h"
+#include "i915_drm.h"
+#include "brw_defines.h"
+
static const int I830CopyROP[16] = {
ROP_0, /* GXclear */
ROP_DSa, /* GXand */
@@ -705,9 +707,15 @@ static Bool intel_uxa_prepare_access(PixmapPtr pixmap, uxa_access_t access)
int ret;
if (!list_is_empty(&priv->batch) &&
- (access == UXA_ACCESS_RW || priv->batch_write))
+ ((access == UXA_ACCESS_RW || access == UXA_GLAMOR_ACCESS_RW)
+ || priv->batch_write))
intel_batch_submit(scrn);
+ if (access == UXA_GLAMOR_ACCESS_RW || access == UXA_GLAMOR_ACCESS_RO)
+ return TRUE;
+
+ intel_glamor_flush(intel);
+
if (priv->tiling || bo->size <= intel->max_gtt_map_size)
ret = drm_intel_gem_bo_map_gtt(bo);
else
@@ -966,6 +974,7 @@ void intel_uxa_block_handler(intel_screen_private *intel)
* and beyond rendering results may not hit the
* framebuffer until significantly later.
*/
+ intel_glamor_flush(intel);
intel_flush_rendering(intel);
}
@@ -1097,6 +1106,8 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
list_init(&priv->batch);
list_init(&priv->flush);
intel_set_pixmap_private(pixmap, priv);
+
+ intel_glamor_create_textured_pixmap(pixmap);
}
return pixmap;
@@ -1104,8 +1115,10 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
static Bool intel_uxa_destroy_pixmap(PixmapPtr pixmap)
{
- if (pixmap->refcnt == 1)
+ if (pixmap->refcnt == 1) {
+ intel_glamor_destroy_pixmap(pixmap);
intel_set_pixmap_bo(pixmap, NULL);
+ }
fbDestroyPixmap(pixmap);
return TRUE;
}
@@ -1136,6 +1149,9 @@ Bool intel_uxa_create_screen_resources(ScreenPtr screen)
scrn->displayWidth = intel->front_pitch / intel->cpp;
}
+ if (!intel_glamor_create_screen_resources(screen))
+ return FALSE;
+
return TRUE;
}
@@ -1298,5 +1314,7 @@ Bool intel_uxa_init(ScreenPtr screen)
uxa_set_fallback_debug(screen, intel->fallback_debug);
uxa_set_force_fallback(screen, intel->force_fallback);
+ intel_glamor_init(screen);
+
return TRUE;
}