[xorg-x11-drv-intel/f18] snapshot upstream + add prime support for now

Dave Airlie airlied at fedoraproject.org
Thu Aug 16 00:39:18 UTC 2012


commit a9acf6333d4d2ae81016a6528cd6ccbea750e2fd
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Aug 16 10:37:45 2012 +1000

    snapshot upstream + add prime support for now

 .gitignore                |    1 +
 intel-prime-support.patch |  483 +++++++++++++++++++++++++++++++++++++++++++++
 sources                   |    1 +
 xorg-x11-drv-intel.spec   |   12 +-
 4 files changed, 494 insertions(+), 3 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 7ddf69c..d1ff06f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@ xf86-video-intel-2.10.0.tar.bz2
 /xf86-video-intel-2.20.1.tar.bz2
 /xf86-video-intel-2.20.2.tar.bz2
 /xf86-video-intel-2.20.3.tar.bz2
+/xf86-video-intel-20120816.tar.bz2
diff --git a/intel-prime-support.patch b/intel-prime-support.patch
new file mode 100644
index 0000000..64f4ead
--- /dev/null
+++ b/intel-prime-support.patch
@@ -0,0 +1,483 @@
+diff --git a/src/intel.h b/src/intel.h
+index 0b57aaf..ba4139f 100644
+--- a/src/intel.h
++++ b/src/intel.h
+@@ -80,6 +80,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ #define MONITOR_EDID_COMPLETE_RAWDATA EDID_COMPLETE_RAWDATA
+ #endif
+ 
++#if XF86_CRTC_VERSION >= 5
++#define INTEL_PIXMAP_SHARING 1
++#endif
++
+ struct intel_pixmap {
+ 	dri_bo *bo;
+ 
+@@ -347,8 +351,13 @@ typedef struct intel_screen_private {
+ 	struct udev_monitor *uevent_monitor;
+ 	InputHandlerProc uevent_handler;
+ #endif
++	Bool has_prime_vmap_flush;
+ } intel_screen_private;
+ 
++#ifndef I915_PARAM_HAS_PRIME_VMAP_FLUSH
++#define I915_PARAM_HAS_PRIME_VMAP_FLUSH 19
++#endif
++
+ enum {
+ 	DEBUG_FLUSH_BATCHES = 0x1,
+ 	DEBUG_FLUSH_CACHES = 0x2,
+diff --git a/src/intel_display.c b/src/intel_display.c
+index 6580c8c..cdf3be6 100644
+--- a/src/intel_display.c
++++ b/src/intel_display.c
+@@ -85,6 +85,8 @@ struct intel_crtc {
+ 	uint32_t rotate_fb_id;
+ 	xf86CrtcPtr crtc;
+ 	struct list link;
++	PixmapPtr scanout_pixmap;
++	uint32_t scanout_fb_id;
+ };
+ 
+ struct intel_property {
+@@ -360,6 +362,7 @@ intel_crtc_apply(xf86CrtcPtr crtc)
+ 	ScrnInfoPtr scrn = crtc->scrn;
+ 	struct intel_crtc *intel_crtc = crtc->driver_private;
+ 	struct intel_mode *mode = intel_crtc->mode;
++	intel_screen_private *intel = intel_get_screen_private(scrn);
+ 	xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+ 	uint32_t *output_ids;
+ 	int output_count = 0;
+@@ -383,13 +386,15 @@ intel_crtc_apply(xf86CrtcPtr crtc)
+ 		output_count++;
+ 	}
+ 
++	if (!intel_crtc->scanout_fb_id) {
+ #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,5,99,0,0)
+-	if (!xf86CrtcRotate(crtc, mode, rotation))
+-		goto done;
++		if (!xf86CrtcRotate(crtc, mode, rotation))
++			goto done;
+ #else
+-	if (!xf86CrtcRotate(crtc))
+-		goto done;
++		if (!xf86CrtcRotate(crtc))
++			goto done;
+ #endif
++	}
+ 
+ #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,0,0,0)
+ 	crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
+@@ -403,6 +408,10 @@ intel_crtc_apply(xf86CrtcPtr crtc)
+ 		fb_id = intel_crtc->rotate_fb_id;
+ 		x = 0;
+ 		y = 0;
++	} else if (intel_crtc->scanout_fb_id && intel_crtc->scanout_pixmap->drawable.width >= crtc->mode.HDisplay && intel_crtc->scanout_pixmap->drawable.height >= crtc->mode.VDisplay) {
++		fb_id = intel_crtc->scanout_fb_id;
++		x = 0;
++		y = 0;
+ 	}
+ 	ret = drmModeSetCrtc(mode->fd, crtc_id(intel_crtc),
+ 			     fb_id, x, y, output_ids, output_count,
+@@ -666,6 +675,42 @@ intel_crtc_destroy(xf86CrtcPtr crtc)
+ 	crtc->driver_private = NULL;
+ }
+ 
++#ifdef INTEL_PIXMAP_SHARING
++static Bool
++intel_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
++{
++	struct intel_crtc *intel_crtc = crtc->driver_private;
++	ScrnInfoPtr scrn = crtc->scrn;
++	intel_screen_private *intel = intel_get_screen_private(scrn);
++	dri_bo *bo;
++	int ret;
++
++	if (ppix == intel_crtc->scanout_pixmap)
++		return TRUE;
++
++	if (!ppix) {
++		intel_crtc->scanout_pixmap = NULL;
++		if (intel_crtc->scanout_fb_id) {
++			drmModeRmFB(intel->drmSubFD, intel_crtc->scanout_fb_id);
++			intel_crtc->scanout_fb_id = 0;
++		}
++		return TRUE;
++	}
++
++	bo = intel_get_pixmap_bo(ppix);
++	if (intel->front_buffer) {
++		ErrorF("have front buffer\n");
++	}
++
++	intel_crtc->scanout_pixmap = ppix;
++	ret = drmModeAddFB(intel->drmSubFD, ppix->drawable.width,
++			   ppix->drawable.height, ppix->drawable.depth,
++			   ppix->drawable.bitsPerPixel, ppix->devKind,
++			   bo->handle, &intel_crtc->scanout_fb_id);
++	return TRUE;
++}
++#endif
++
+ static const xf86CrtcFuncsRec intel_crtc_funcs = {
+ 	.dpms = intel_crtc_dpms,
+ 	.set_mode_major = intel_crtc_set_mode_major,
+@@ -679,6 +724,9 @@ static const xf86CrtcFuncsRec intel_crtc_funcs = {
+ 	.shadow_destroy = intel_crtc_shadow_destroy,
+ 	.gamma_set = intel_crtc_gamma_set,
+ 	.destroy = intel_crtc_destroy,
++#ifdef INTEL_PIXMAP_SHARING
++	.set_scanout_pixmap = intel_set_scanout_pixmap,
++#endif
+ };
+ 
+ static void
+@@ -1644,6 +1692,10 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
+ 	for (i = 0; i < mode->mode_res->count_connectors; i++)
+ 		intel_output_init(scrn, mode, i);
+ 
++#ifdef INTEL_PIXMAP_SHARING
++	xf86ProviderSetup(scrn, NULL, "Intel");
++#endif
++
+ 	xf86InitialConfiguration(scrn, TRUE);
+ 
+ 	mode->event_context.version = DRM_EVENT_CONTEXT_VERSION;
+diff --git a/src/intel_driver.c b/src/intel_driver.c
+index 1ef06fb..df8e5d0 100644
+--- a/src/intel_driver.c
++++ b/src/intel_driver.c
+@@ -385,6 +385,11 @@ static Bool has_relaxed_fencing(struct intel_screen_private *intel)
+ 	return drm_has_boolean_param(intel, I915_PARAM_HAS_RELAXED_FENCING);
+ }
+ 
++static Bool has_prime_vmap_flush(struct intel_screen_private *intel)
++{
++	return drm_has_boolean_param(intel, I915_PARAM_HAS_PRIME_VMAP_FLUSH);
++}
++
+ static Bool can_accelerate_blt(struct intel_screen_private *intel)
+ {
+ 	if (INTEL_INFO(intel)->gen == -1)
+@@ -427,6 +432,25 @@ static Bool can_accelerate_blt(struct intel_screen_private *intel)
+ 	return TRUE;
+ }
+ 
++static void intel_setup_capabilities(ScrnInfoPtr scrn)
++{
++#ifdef INTEL_PIXMAP_SHARING
++	intel_screen_private *intel = intel_get_screen_private(scrn);
++	uint64_t value;
++	int ret;
++
++	scrn->capabilities = 0;
++
++	ret = drmGetCap(intel->drmSubFD, DRM_CAP_PRIME, &value);
++	if (ret == 0) {
++		if (value & DRM_PRIME_CAP_EXPORT)
++			scrn->capabilities |= RR_Capability_SourceOutput | RR_Capability_SinkOffload;
++		if (value & DRM_PRIME_CAP_IMPORT)
++			scrn->capabilities |= RR_Capability_SinkOutput;
++	}
++#endif
++}
++
+ /**
+  * This is called before ScreenInit to do any require probing of screen
+  * configuration.
+@@ -452,7 +476,14 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
+ 		return FALSE;
+ 
+ 	pEnt = xf86GetEntityInfo(scrn->entityList[0]);
+-	if (pEnt == NULL || pEnt->location.type != BUS_PCI)
++	if (pEnt == NULL)
++		return NULL;
++
++	if (pEnt->location.type != BUS_PCI
++#ifdef XSERVER_PLATFORM_BUS
++	    && pEnt->location.type != BUS_PLATFORM
++#endif
++		)
+ 		return FALSE;
+ 
+ 	if (flags & PROBE_DETECT)
+@@ -512,6 +543,7 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
+ 	if (!I830GetEarlyOptions(scrn))
+ 		return FALSE;
+ 
++	intel_setup_capabilities(scrn);
+ 	intel_check_chipset_option(scrn);
+ 	intel_check_dri_option(scrn);
+ 
+@@ -538,6 +570,8 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags)
+ 
+ 	intel->has_kernel_flush = has_kernel_flush(intel);
+ 
++	intel->has_prime_vmap_flush = has_prime_vmap_flush(intel);
++
+ 	intel->has_relaxed_fencing =
+ 		xf86ReturnOptValBool(intel->Options,
+ 				     OPTION_RELAXED_FENCING,
+@@ -638,6 +672,51 @@ void IntelEmitInvarientState(ScrnInfoPtr scrn)
+ 		I915EmitInvarientState(scrn);
+ }
+ 
++#ifdef INTEL_PIXMAP_SHARING
++static Bool
++redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
++{
++	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
++	intel_screen_private *intel = intel_get_screen_private(scrn);
++	RegionRec pixregion;
++	int was_blocked;
++
++	PixmapRegionInit(&pixregion, dirty->slave_dst->master_pixmap);
++
++	PixmapSyncDirtyHelper(dirty, &pixregion);
++	intel_batch_submit(scrn);
++	if (!intel->has_prime_vmap_flush) {
++		drm_intel_bo *bo = intel_get_pixmap_bo(dirty->slave_dst->master_pixmap);
++		was_blocked = xf86BlockSIGIO();
++		drm_intel_bo_map(bo, FALSE);
++		drm_intel_bo_unmap(bo);
++		xf86UnblockSIGIO(was_blocked);
++        }
++        DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion);
++        RegionUninit(&pixregion);
++	return 0;
++}
++
++static void
++intel_dirty_update(ScreenPtr screen)
++{
++	RegionPtr region;
++	PixmapDirtyUpdatePtr ent;
++
++	if (xorg_list_is_empty(&screen->pixmap_dirty_list))
++	    return;
++
++	ErrorF("list is not empty\n");
++	xorg_list_for_each_entry(ent, &screen->pixmap_dirty_list, ent) {
++		region = DamageRegion(ent->damage);
++		if (RegionNotEmpty(region)) {
++			redisplay_dirty(screen, ent);
++			DamageEmpty(ent->damage);
++		}
++	}
++}
++#endif
++
+ static void
+ I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
+ {
+@@ -654,6 +733,9 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
+ 
+ 	intel_uxa_block_handler(intel);
+ 	intel_video_block_handler(intel);
++#ifdef INTEL_PIXMAP_SHARING
++	intel_dirty_update(screen);
++#endif
+ }
+ 
+ static Bool
+@@ -899,6 +981,11 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
+ 	intel->BlockHandler = screen->BlockHandler;
+ 	screen->BlockHandler = I830BlockHandler;
+ 
++#ifdef INTEL_PIXMAP_SHARING
++	screen->StartPixmapTracking = PixmapStartDirtyTracking;
++	screen->StopPixmapTracking = PixmapStopDirtyTracking;
++#endif
++
+ 	if (!AddCallback(&FlushCallback, intel_flush_callback, scrn))
+ 		return FALSE;
+ 
+diff --git a/src/intel_module.c b/src/intel_module.c
+index c0403ca..9d97896 100644
+--- a/src/intel_module.c
++++ b/src/intel_module.c
+@@ -44,6 +44,10 @@
+ #include "legacy/legacy.h"
+ #include "sna/sna_module.h"
+ 
++#ifdef XSERVER_PLATFORM_BUS
++#include <xf86platformBus.h>
++#endif
++
+ static const struct intel_device_info intel_generic_info = {
+ 	.gen = -1,
+ };
+@@ -499,6 +503,47 @@ static Bool intel_pci_probe(DriverPtr		driver,
+ 	}
+ }
+ 
++#ifdef XSERVER_PLATFORM_BUS
++static Bool
++intel_platform_probe(DriverPtr driver,
++		     int entity_num, int flags,
++		     struct xf86_platform_device *dev,
++		     intptr_t match_data)
++{
++	ScrnInfoPtr scrn = NULL;
++	char *path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH);
++
++	if (!dev->pdev)
++		return FALSE;
++	/* if we get any flags we don't understand fail to probe for now */
++	if (flags)
++		return FALSE;
++
++	scrn = xf86AllocateScreen(driver, 0);
++	xf86AddEntityToScreen(scrn, entity_num);
++
++	scrn->driverVersion = INTEL_VERSION;
++	scrn->driverName = INTEL_DRIVER_NAME;
++	scrn->name = INTEL_NAME;
++	scrn->driverPrivate = (void *)(match_data | 1);
++	scrn->Probe = NULL;
++	switch (get_accel_method()) {
++#if USE_SNA
++        case SNA: sna_init_scrn(scrn, entity_num); break;
++#endif
++
++#if USE_UXA
++        case UXA: intel_init_scrn(scrn); break;
++#endif
++	default: break;
++	}
++
++	xf86DrvMsg(scrn->scrnIndex, X_INFO,
++		   "using drv %s\n", path ? path : "Default device");
++	return scrn != NULL;
++}
++#endif
++
+ #ifdef XFree86LOADER
+ 
+ static MODULESETUPPROTO(intel_setup);
+@@ -543,7 +588,10 @@ static DriverRec intel = {
+ 	0,
+ 	intel_driver_func,
+ 	intel_device_match,
+-	intel_pci_probe
++	intel_pci_probe,
++#ifdef XSERVER_PLATFORM_BUS
++	intel_platform_probe
++#endif
+ };
+ 
+ static pointer intel_setup(pointer module,
+diff --git a/src/intel_uxa.c b/src/intel_uxa.c
+index 5aad062..1a34a2e 100644
+--- a/src/intel_uxa.c
++++ b/src/intel_uxa.c
+@@ -36,6 +36,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ #include <xaarop.h>
+ #include <string.h>
+ #include <errno.h>
++#include <unistd.h>
+ 
+ #include "intel.h"
+ #include "intel_glamor.h"
+@@ -1040,6 +1041,10 @@ intel_uxa_create_pixmap(ScreenPtr screen, int w, int h, int depth,
+ 		if (usage == UXA_CREATE_PIXMAP_FOR_MAP || usage & INTEL_CREATE_PIXMAP_TILING_NONE)
+ 			tiling = I915_TILING_NONE;
+ 
++#ifdef CREATE_PIXMAP_USAGE_SHARED
++		if (usage == CREATE_PIXMAP_USAGE_SHARED)
++			tiling = I915_TILING_NONE;
++#endif
+ 		/* if tiling is off force to none */
+ 		if (!intel->tiling)
+ 			tiling = I915_TILING_NONE;
+@@ -1138,7 +1143,7 @@ static Bool intel_uxa_destroy_pixmap(PixmapPtr pixmap)
+ Bool intel_uxa_create_screen_resources(ScreenPtr screen)
+ {
+ 	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+-	PixmapPtr pixmap = screen->GetScreenPixmap(screen);
++	PixmapPtr pixmap;
+ 	intel_screen_private *intel = intel_get_screen_private(scrn);
+ 	dri_bo *bo = intel->front_buffer;
+ 
+@@ -1164,6 +1169,69 @@ Bool intel_uxa_create_screen_resources(ScreenPtr screen)
+ 	return TRUE;
+ }
+ 
++#ifdef CREATE_PIXMAP_USAGE_SHARED
++static Bool
++intel_uxa_share_pixmap_backing(PixmapPtr ppix, ScreenPtr slave, void **fd_handle)
++{
++	ScrnInfoPtr scrn = xf86ScreenToScrn(ppix->drawable.pScreen);
++	intel_screen_private *intel = intel_get_screen_private(scrn);
++	struct intel_pixmap *priv = intel_get_pixmap_private(ppix);
++	unsigned int size, tiling, swizzle;
++	dri_bo *bo = intel_get_pixmap_bo(ppix), *newbo;
++	int stride;
++	int handle;
++
++	if (drm_intel_bo_references(intel->batch_bo, bo))
++		intel_batch_submit(intel->scrn);
++
++	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
++
++	if (tiling == I915_TILING_X) {
++	        tiling = I915_TILING_NONE;
++
++		size = intel_uxa_pixmap_compute_size(ppix, ppix->drawable.width, ppix->drawable.height, &tiling, &stride, INTEL_CREATE_PIXMAP_DRI2);
++
++		newbo = drm_intel_bo_alloc_for_render(intel->bufmgr,
++						      "pixmap",
++						      size, 0);
++
++		if (tiling != I915_TILING_NONE)
++			drm_intel_bo_set_tiling(newbo, &tiling, stride);
++		priv->stride = stride;
++		priv->tiling = tiling;
++		intel_set_pixmap_bo(ppix, newbo);
++
++		ppix->drawable.pScreen->ModifyPixmapHeader(ppix, ppix->drawable.width,
++					   ppix->drawable.height, 0, 0,
++					   stride, NULL);
++		bo = newbo;
++	}
++	drm_intel_bo_get_tiling(bo, &tiling, &swizzle);
++	drm_intel_bo_gem_export_to_prime(bo, &handle);
++
++	*fd_handle = (void *)(long)handle;
++	return TRUE;
++}
++
++static Bool
++intel_uxa_set_shared_pixmap_backing(PixmapPtr ppix, void *fd_handle)
++{
++	ScrnInfoPtr scrn = xf86ScreenToScrn(ppix->drawable.pScreen);
++	intel_screen_private *intel = intel_get_screen_private(scrn);
++	dri_bo *bo;
++	int ihandle = (int)(long)fd_handle;
++
++	/* force untiled for now */
++	bo = drm_intel_bo_gem_create_from_prime(intel->bufmgr, ihandle, 0);
++	if (!bo)
++		return FALSE;
++
++	intel_set_pixmap_bo(ppix, bo);
++	close(ihandle);
++	return TRUE;
++}
++#endif
++
+ static void
+ intel_limits_init(intel_screen_private *intel)
+ {
+@@ -1313,6 +1381,11 @@ Bool intel_uxa_init(ScreenPtr screen)
+ 	screen->CreatePixmap = intel_uxa_create_pixmap;
+ 	screen->DestroyPixmap = intel_uxa_destroy_pixmap;
+ 
++#ifdef CREATE_PIXMAP_USAGE_SHARED
++	screen->SharePixmapBacking = intel_uxa_share_pixmap_backing;
++	screen->SetSharedPixmapBacking = intel_uxa_set_shared_pixmap_backing;
++#endif
++
+ 	if (!uxa_driver_init(screen, intel->uxa_driver)) {
+ 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ 			   "UXA initialization failed\n");
diff --git a/sources b/sources
index 6c99d2c..69baf7b 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,3 @@
 3ad323489a5a8b821fd24811242a9eea  intel-gpu-tools-20110817.tar.bz2
 10c317605f49631bc24697d392ef68d9  xf86-video-intel-2.20.3.tar.bz2
+7ed6eefcb4981fa0092e9b1ef8cbcd99  xf86-video-intel-20120816.tar.bz2
diff --git a/xorg-x11-drv-intel.spec b/xorg-x11-drv-intel.spec
index 3936701..ec03104 100644
--- a/xorg-x11-drv-intel.spec
+++ b/xorg-x11-drv-intel.spec
@@ -1,8 +1,8 @@
 %define moduledir %(pkg-config xorg-server --variable=moduledir )
 %define driverdir	%{moduledir}/drivers
 %define gputoolsdate 20110817
-#define gitdate 20120718
-#define gitrev .%{gitdate}
+%define gitdate 20120816
+%define gitrev .%{gitdate}
 
 %if 0%{?rhel} == 7
 %define rhel7 1
@@ -14,7 +14,7 @@
 Summary:   Xorg X11 Intel video driver
 Name:      xorg-x11-drv-intel
 Version:   2.20.3
-Release:   1%{?gitrev}%{?dist}
+Release:   2%{?gitrev}%{?dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X Hardware Support
@@ -28,6 +28,8 @@ Source1:    make-intel-gpu-tools-snapshot.sh
 Source3:    intel-gpu-tools-%{gputoolsdate}.tar.bz2
 Source4:    make-git-snapshot.sh
 
+Patch0: intel-prime-support.patch
+
 ExclusiveArch: %{ix86} x86_64 ia64
 
 BuildRequires: autoconf automake libtool
@@ -70,6 +72,7 @@ Debugging tools for Intel graphics chips
 
 %prep
 %setup -q -n xf86-video-intel-%{?gitdate:%{gitdate}}%{!?gitdate:%{dirsuffix}} -b3
+%patch0 -p1 -b .prime
 
 %build
  
@@ -126,6 +129,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_mandir}/man1/intel_*.1*
 
 %changelog
+* Thu Aug 16 2012 Dave Airlie <airlied at redhat.com> 2.20.3-2
+- snapshot upstream + add prime support for now
+
 * Wed Aug 15 2012 Adam Jackson <ajax at redhat.com> 2.20.3-1
 - intel 2.20.3
 


More information about the scm-commits mailing list