xf86-video-intel: 3 commits - src/sna/compiler.h src/sna/gen7_render.c src/sna/kgem.h src/sna/sna_driver.c src/sna/sna.h src/sna/sna_video.c src/sna/sna_video_hwmc.c src/sna/sna_video_hwmc.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Apr 10 05:48:16 PDT 2013


 src/sna/compiler.h       |    2 +
 src/sna/gen7_render.c    |   12 +++++--
 src/sna/kgem.h           |    6 +--
 src/sna/sna.h            |    3 +
 src/sna/sna_driver.c     |    4 +-
 src/sna/sna_video.c      |   10 +-----
 src/sna/sna_video_hwmc.c |   73 +++++++++++++++++++++++++----------------------
 src/sna/sna_video_hwmc.h |    4 --
 8 files changed, 60 insertions(+), 54 deletions(-)

New commits:
commit afe61281d8f92d6eb841e2522ab18e0d2fe73773
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 10 12:13:37 2013 +0100

    sna/gen7: Cache our kernels in L3
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 74b0cba..fd1cbd3 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -458,6 +458,10 @@ gen7_emit_urb(struct sna *sna)
 static void
 gen7_emit_state_base_address(struct sna *sna)
 {
+	uint32_t mocs;
+
+	mocs = sna->kgem.gen == 075 ?  5 << 8 : 3 << 8;
+
 	OUT_BATCH(GEN7_STATE_BASE_ADDRESS | (10 - 2));
 	OUT_BATCH(0); /* general */
 	OUT_BATCH(kgem_add_reloc(&sna->kgem, /* surface */
@@ -465,17 +469,17 @@ gen7_emit_state_base_address(struct sna *sna)
 				 NULL,
 				 I915_GEM_DOMAIN_INSTRUCTION << 16,
 				 BASE_ADDRESS_MODIFY));
-	OUT_BATCH(kgem_add_reloc(&sna->kgem, /* instruction */
+	OUT_BATCH(kgem_add_reloc(&sna->kgem, /* dynamic */
 				 sna->kgem.nbatch,
 				 sna->render_state.gen7.general_bo,
 				 I915_GEM_DOMAIN_INSTRUCTION << 16,
-				 BASE_ADDRESS_MODIFY));
+				 mocs | BASE_ADDRESS_MODIFY));
 	OUT_BATCH(0); /* indirect */
-	OUT_BATCH(kgem_add_reloc(&sna->kgem,
+	OUT_BATCH(kgem_add_reloc(&sna->kgem, /* instruction */
 				 sna->kgem.nbatch,
 				 sna->render_state.gen7.general_bo,
 				 I915_GEM_DOMAIN_INSTRUCTION << 16,
-				 BASE_ADDRESS_MODIFY));
+				 mocs | BASE_ADDRESS_MODIFY));
 
 	/* upper bounds, disable */
 	OUT_BATCH(0);
commit caf3118f90bad7f88f5f08e49177a1696bf97ccb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Apr 10 12:16:34 2013 +0100

    sna: Align uploads to start on page boundaries
    
    This reduces the number of loops and restarts required in the kernel.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/compiler.h b/src/sna/compiler.h
index 62f51f0..75e691a 100644
--- a/src/sna/compiler.h
+++ b/src/sna/compiler.h
@@ -39,6 +39,7 @@
 #define pure __attribute__((pure))
 #define __packed__ __attribute__((__packed__))
 #define flatten __attribute__((flatten))
+#define page_aligned __attribute__((aligned(4096)))
 #else
 #define likely(expr) (expr)
 #define unlikely(expr) (expr)
@@ -50,6 +51,7 @@
 #define pure
 #define __packed__
 #define flatten
+#define page_aligned
 #endif
 
 #define HAS_GCC(major, minor) defined(__GNUC__) && (__GNUC__ > (major) || __GNUC__ == (major) && __GNUC_MINOR__ >= (minor))
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index f2b1c98..e486292 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -194,9 +194,9 @@ struct kgem {
 	void (*retire)(struct kgem *kgem);
 	void (*expire)(struct kgem *kgem);
 
-	uint32_t batch[64*1024-8];
-	struct drm_i915_gem_exec_object2 exec[256];
-	struct drm_i915_gem_relocation_entry reloc[4096];
+	uint32_t batch[64*1024-8] page_aligned;
+	struct drm_i915_gem_exec_object2 exec[256] page_aligned;
+	struct drm_i915_gem_relocation_entry reloc[4096] page_aligned;
 	uint16_t reloc__self[256];
 
 #ifdef DEBUG_MEMORY
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 61f2672..20981b3 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -198,6 +198,8 @@ enum {
 };
 
 struct sna {
+	struct kgem kgem;
+
 	ScrnInfoPtr scrn;
 
 	unsigned flags;
@@ -289,7 +291,6 @@ struct sna {
 	InputHandlerProc uevent_handler;
 #endif
 
-	struct kgem kgem;
 	struct sna_render render;
 
 #if DEBUG_MEMORY
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 5c8ba2d..1cfba5b 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -515,10 +515,10 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	sna_selftest();
 
 	if (((uintptr_t)scrn->driverPrivate) & 1) {
-		sna = xnfcalloc(sizeof(struct sna), 1);
-		if (sna == NULL)
+		if (posix_memalign((void **)&sna, 4096, sizeof(*sna)))
 			return FALSE;
 
+		memset(sna, 0, sizeof(*sna)); /* should be unnecessary */
 		sna->info = (void *)((uintptr_t)scrn->driverPrivate & ~1);
 		scrn->driverPrivate = sna;
 
commit 092e30de8a3476ab99446264edaf9b250a41736b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Apr 9 20:43:19 2013 +0100

    sna/xvmc: Wrap each output adaptor
    
    Each of the overlay, sprite and textured video can support XvMC
    passthrough, so we need to setup an XvMC adaptor for each of our Xv
    adaptors.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index a0eb0f4..6d067c7 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -66,11 +66,8 @@
 #define _SNA_XVMC_SERVER_
 #include "sna_video_hwmc.h"
 #else
-static inline bool sna_video_xvmc_setup(struct sna *sna,
-					ScreenPtr ptr,
-					XF86VideoAdaptorPtr target)
+static inline void sna_video_xvmc_setup(struct sna *sna, ScreenPtr ptr)
 {
-	return false;
 }
 #endif
 
@@ -574,9 +571,8 @@ void sna_video_init(struct sna *sna, ScreenPtr screen)
 		adaptors[num_adaptors++] = overlay;
 
 	if (num_adaptors) {
-		Bool ok = xf86XVScreenInit(screen, adaptors, num_adaptors);
-		if (ok && textured)
-			sna_video_xvmc_setup(sna, screen, textured);
+		if (xf86XVScreenInit(screen, adaptors, num_adaptors))
+			sna_video_xvmc_setup(sna, screen);
 	} else
 		xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
 			   "Disabling Xv because no adaptors could be initialized.\n");
diff --git a/src/sna/sna_video_hwmc.c b/src/sna/sna_video_hwmc.c
index b3e065d..573fda5 100644
--- a/src/sna/sna_video_hwmc.c
+++ b/src/sna/sna_video_hwmc.c
@@ -197,14 +197,13 @@ static XvMCSurfaceInfoPtr surface_info_vld[] = {
 
 /* check chip type and load xvmc driver */
 Bool sna_video_xvmc_setup(struct sna *sna,
-			  ScreenPtr screen,
-			  XF86VideoAdaptorPtr target)
+			  ScreenPtr screen)
 {
 	XvMCAdaptorRec *adaptors;
 	XvScreenPtr xv;
 	const char *name;
 	char bus[64];
-	int i;
+	int i, j;
 
 	if (!xf86LoaderCheckSymbol("XvMCScreenInit"))
 		return FALSE;
@@ -217,43 +216,42 @@ Bool sna_video_xvmc_setup(struct sna *sna,
 	if (sna->kgem.gen >= 060)
 		return FALSE;
 
-	adaptors = calloc(1, sizeof(XvMCAdaptorRec));
+	xv = dixLookupPrivate(&screen->devPrivates, XF86XvScreenKey);
+
+	adaptors = calloc(xv->nAdaptors, sizeof(XvMCAdaptorRec));
 	if (adaptors == NULL)
 		return FALSE;
 
-	xv = dixLookupPrivate(&screen->devPrivates, XF86XvScreenKey);
-	for (i = 0; i< xv->nAdaptors;i++) {
-		if (strcmp(xv->pAdaptors[i].name, target->name) == 0) {
-			adaptors->xv_adaptor = &xv->pAdaptors[i];
-			break;
+	for (i = j = 0; i< xv->nAdaptors;i++) {
+		if (strncmp(xv->pAdaptors[i].name, "Intel(R)", 8))
+			continue;
+
+		adaptors[j].xv_adaptor = &xv->pAdaptors[i];
+
+		adaptors[j].num_subpictures = 0;
+		adaptors[j].subpictures = NULL;
+		adaptors[j].CreateContext = create_context;
+		adaptors[j].DestroyContext = destroy_context;
+		adaptors[j].CreateSurface = create_surface;
+		adaptors[j].DestroySurface = destroy_surface;
+		adaptors[j].CreateSubpicture = create_subpicture;
+		adaptors[j].DestroySubpicture = destroy_subpicture;
+
+		if (sna->kgem.gen >= 045) {
+			adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_vld);
+			adaptors[j].surfaces = surface_info_vld;
+		} else if (sna->kgem.gen >= 040) {
+			adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_i965);
+			adaptors[j].surfaces = surface_info_i965;
+		} else {
+			adaptors[j].num_surfaces = ARRAY_SIZE(surface_info_i915);
+			adaptors[j].surfaces = surface_info_i915;
 		}
-	}
-	assert(adaptors->xv_adaptor);
-
-	adaptors->num_subpictures = 0;
-	adaptors->subpictures = NULL;
-	adaptors->CreateContext = create_context;
-	adaptors->DestroyContext = destroy_context;
-	adaptors->CreateSurface = create_surface;
-	adaptors->DestroySurface = destroy_surface;
-	adaptors->CreateSubpicture =  create_subpicture;
-	adaptors->DestroySubpicture = destroy_subpicture;
-
-	if (sna->kgem.gen >= 045) {
-		name = "xvmc_vld",
-		adaptors->num_surfaces = ARRAY_SIZE(surface_info_vld);
-		adaptors->surfaces = surface_info_vld;
-	} else if (sna->kgem.gen >= 040) {
-		name = "i965_xvmc",
-		adaptors->num_surfaces = ARRAY_SIZE(surface_info_i965);
-		adaptors->surfaces = surface_info_i965;
-	} else {
-		name = "i915_xvmc",
-		adaptors->num_surfaces = ARRAY_SIZE(surface_info_i915);
-		adaptors->surfaces = surface_info_i915;
+
+		j++;
 	}
 
-	if (XvMCScreenInit(screen, 1, adaptors) != Success) {
+	if (XvMCScreenInit(screen, j, adaptors) != Success) {
 		xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
 			   "[XvMC] Failed to initialize XvMC.\n");
 		free(adaptors);
@@ -268,8 +266,15 @@ Bool sna_video_xvmc_setup(struct sna *sna,
 			       SNA_XVMC_MAJOR, SNA_XVMC_MINOR,
 			       SNA_XVMC_PATCHLEVEL);
 
+	if (sna->kgem.gen >= 045)
+		name = "xvmc_vld";
+	else if (sna->kgem.gen >= 040)
+		name = "i965_xvmc";
+	else
+		name = "i915_xvmc";
 	xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
 		   "[XvMC] %s driver initialized.\n",
 		   name);
+
 	return TRUE;
 }
diff --git a/src/sna/sna_video_hwmc.h b/src/sna/sna_video_hwmc.h
index 44de456..8b0d2cd 100644
--- a/src/sna/sna_video_hwmc.h
+++ b/src/sna/sna_video_hwmc.h
@@ -40,9 +40,7 @@
 
 #ifdef _SNA_XVMC_SERVER_
 #include <xf86xvmc.h>
-Bool sna_video_xvmc_setup(struct sna *sna,
-			  ScreenPtr screen,
-			  XF86VideoAdaptorPtr target);
+Bool sna_video_xvmc_setup(struct sna *sna, ScreenPtr screen);
 #endif
 
 #endif


More information about the xorg-commit mailing list