xf86-video-intel: 2 commits - configure.ac src/intel_dri.c src/intel_driver.c src/intel_options.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_dri.c src/sna/sna_driver.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Nov 8 01:00:41 PST 2012


 configure.ac         |    9 +++++++++
 src/intel_dri.c      |   13 ++++++++++++-
 src/intel_driver.c   |   10 +++++++++-
 src/intel_options.c  |    2 +-
 src/sna/kgem.c       |   25 ++++++++++++++++++++++++-
 src/sna/kgem.h       |    1 +
 src/sna/sna_dri.c    |   15 +++++++++++++--
 src/sna/sna_driver.c |    8 +++++++-
 8 files changed, 76 insertions(+), 7 deletions(-)

New commits:
commit 120fa0ef8d04f5e82e5f7a0636033d3d96efa1e8
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Nov 7 17:41:20 2012 +0000

    sna: Support a fast no relocation changed path
    
    x11perf -copywinwin10 on gm45 with c2d L9400:
      before: 553,000 op/s
      after:  565,000 op/s
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index 8ddf40b..9ea1e3c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -292,6 +292,15 @@ if test "x$USERPTR" = xyes; then
 	AC_DEFINE(USE_USERPTR,1,[Assume USERPTR support])
 fi
 
+AC_ARG_ENABLE(fast-reloc,
+	      AS_HELP_STRING([--enable-fast-reloc],
+			     [Enable use of "fast reloc" (experimental) [default=no]]),
+	      [FASTRELOC="$enableval"],
+	      [FASTRELOC=no])
+if test "x$FASTRELOC" = xyes; then
+	AC_DEFINE(USE_FASTRELOC,1,[Assume "fast reloc" support])
+fi
+
 AC_ARG_ENABLE(async-swap,
 	      AS_HELP_STRING([--enable-async-swap],
 			     [Enable use of asynchronous swaps (experimental) [default=no]]),
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 9c01694..131a209 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -70,10 +70,16 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 #define DBG_NO_MAP_UPLOAD 0
 #define DBG_NO_RELAXED_FENCING 0
 #define DBG_NO_SECURE_BATCHES 0
+#define DBG_NO_FAST_RELOC 0
 #define DBG_DUMP 0
 
 #define SHOW_BATCH 0
 
+#ifndef USE_FASTRELOC
+#undef DBG_NO_FAST_RELOC
+#define DBG_NO_FAST_RELOC 1
+#endif
+
 /* Worst case seems to be 965gm where we cannot write within a cacheline that
  * is being simultaneously being read by the GPU, or within the sampler
  * prefetch. In general, the chipsets seem to have a requirement that sampler
@@ -96,6 +102,9 @@ search_snoop_cache(struct kgem *kgem, unsigned int num_pages, unsigned flags);
 
 #define LOCAL_I915_PARAM_HAS_SEMAPHORES		20
 #define LOCAL_I915_PARAM_HAS_SECURE_BATCHES	23
+#define LOCAL_I915_PARAM_HAS_NO_RELOC		24
+
+#define LOCAL_I915_EXEC_NO_RELOC		(1<<10)
 
 #define LOCAL_I915_GEM_USERPTR       0x32
 #define LOCAL_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + LOCAL_I915_GEM_USERPTR, struct local_i915_gem_userptr)
@@ -651,6 +660,14 @@ static bool test_has_execbuffer2(struct kgem *kgem)
 		errno == EFAULT);
 }
 
+static bool test_has_no_reloc(struct kgem *kgem)
+{
+	if (DBG_NO_FAST_RELOC)
+		return false;
+
+	return gem_param(kgem, LOCAL_I915_PARAM_HAS_NO_RELOC) > 0;
+}
+
 static bool test_has_semaphores_enabled(struct kgem *kgem)
 {
 	FILE *file;
@@ -838,6 +855,10 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
 	DBG(("%s: has userptr? %d\n", __FUNCTION__,
 	     kgem->has_userptr));
 
+	kgem->has_no_reloc = test_has_no_reloc(kgem);
+	DBG(("%s: has no-reloc? %d\n", __FUNCTION__,
+	     kgem->has_no_reloc));
+
 	kgem->has_semaphores = false;
 	if (kgem->has_blt && test_has_semaphores_enabled(kgem))
 		kgem->has_semaphores = true;
@@ -2177,8 +2198,10 @@ void kgem_reset(struct kgem *kgem)
 	kgem->nbatch = 0;
 	kgem->surface = kgem->batch_size;
 	kgem->mode = KGEM_NONE;
-	kgem->batch_flags = 0;
 	kgem->flush = 0;
+	kgem->batch_flags = 0;
+	if (kgem->has_no_reloc)
+		kgem->batch_flags |= LOCAL_I915_EXEC_NO_RELOC;
 
 	kgem->next_request = __kgem_request_alloc();
 
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 7e48db5..8789b55 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -164,6 +164,7 @@ struct kgem {
 	uint32_t has_secure_batches :1;
 	uint32_t has_cacheing :1;
 	uint32_t has_llc :1;
+	uint32_t has_no_reloc :1;
 
 	uint32_t can_blt_cpu :1;
 
commit b7d2fcf47a9569d0944097a8be60ca3be72b42f6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Nov 8 08:55:25 2012 +0000

    Remove reliance on hard-coded DRI name
    
    This provides for using the existing DDX with future DRI drivers which
    may break from the traditional names - but only with the help of the
    user/packager. This scheme needs to be replaced with a robust mechanism
    for driver loading if AIGLX and co are to be kept.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_dri.c b/src/intel_dri.c
index 867a465..17d9d50 100644
--- a/src/intel_dri.c
+++ b/src/intel_dri.c
@@ -1515,6 +1515,17 @@ out_complete:
 static int dri2_server_generation;
 #endif
 
+static const char *dri_driver_name(intel_screen_private *intel)
+{
+	const char *s = xf86GetOptValString(intel->Options, OPTION_DRI);
+	Bool dummy;
+
+	if (s == NULL || xf86getBoolValue(&dummy, s))
+		return INTEL_INFO(intel)->gen < 40 ? "i915" : "i965";
+
+	return s;
+}
+
 Bool I830DRI2ScreenInit(ScreenPtr screen)
 {
 	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
@@ -1564,7 +1575,7 @@ Bool I830DRI2ScreenInit(ScreenPtr screen)
 	intel->deviceName = drmGetDeviceNameFromFd(intel->drmSubFD);
 	memset(&info, '\0', sizeof(info));
 	info.fd = intel->drmSubFD;
-	info.driverName = INTEL_INFO(intel)->gen < 40 ? "i915" : "i965";
+	info.driverName = dri_driver_name(intel);
 	info.deviceName = intel->deviceName;
 
 #if DRI2INFOREC_VERSION == 1
diff --git a/src/intel_driver.c b/src/intel_driver.c
index 3029b22..254aafa 100644
--- a/src/intel_driver.c
+++ b/src/intel_driver.c
@@ -221,11 +221,19 @@ static Bool I830GetEarlyOptions(ScrnInfoPtr scrn)
 	return TRUE;
 }
 
+static Bool intel_option_cast_string_to_bool(intel_screen_private *intel,
+					     int id, Bool val)
+{
+	xf86getBoolValue(&val, xf86GetOptValString(intel->Options, id));
+	return val;
+}
+
 static void intel_check_dri_option(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
+
 	intel->directRenderingType = DRI_NONE;
-	if (!xf86ReturnOptValBool(intel->Options, OPTION_DRI, TRUE))
+	if (!intel_option_cast_string_to_bool(intel, OPTION_DRI, TRUE))
 		intel->directRenderingType = DRI_DISABLED;
 
 	if (scrn->depth != 16 && scrn->depth != 24 && scrn->depth != 30) {
diff --git a/src/intel_options.c b/src/intel_options.c
index dcab9e7..443e84d 100644
--- a/src/intel_options.c
+++ b/src/intel_options.c
@@ -8,7 +8,7 @@ const OptionInfoRec intel_options[] = {
 	{OPTION_ACCEL_DISABLE,	"NoAccel",	OPTV_BOOLEAN,	{0},	0},
 	{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},
 	{OPTION_BACKLIGHT,	"Backlight",	OPTV_STRING,	{0},	0},
-	{OPTION_DRI,		"DRI",		OPTV_BOOLEAN,	{0},	1},
+	{OPTION_DRI,		"DRI",		OPTV_STRING,	{0},	0},
 	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	0},
 	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	0},
 	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 83c79c1..23d9572 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -41,6 +41,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "sna.h"
 #include "sna_reg.h"
+#include "intel_options.h"
 
 #include <xf86drm.h>
 #include <i915_drm.h>
@@ -2317,6 +2318,17 @@ out_complete:
 }
 #endif
 
+static const char *dri_driver_name(struct sna *sna)
+{
+	const char *s = xf86GetOptValString(sna->Options, OPTION_DRI);
+	Bool dummy;
+
+	if (s == NULL || xf86getBoolValue(&dummy, s))
+		return (sna->kgem.gen && sna->kgem.gen < 40) ? "i915" : "i965";
+
+	return s;
+}
+
 bool sna_dri_open(struct sna *sna, ScreenPtr screen)
 {
 	DRI2InfoRec info;
@@ -2344,8 +2356,7 @@ bool sna_dri_open(struct sna *sna, ScreenPtr screen)
 	sna->deviceName = drmGetDeviceNameFromFd(sna->kgem.fd);
 	memset(&info, '\0', sizeof(info));
 	info.fd = sna->kgem.fd;
-	info.driverName =
-		(sna->kgem.gen && sna->kgem.gen < 40) ? "i915" : "i965";
+	info.driverName = dri_driver_name(sna);
 	info.deviceName = sna->deviceName;
 
 	DBG(("%s: loading dri driver '%s' [gen=%d] for device '%s'\n",
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 055c71c..f214b90 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -363,6 +363,12 @@ static void sna_setup_capabilities(ScrnInfoPtr scrn, int fd)
 #endif
 }
 
+static Bool sna_option_cast_to_bool(struct sna *sna, int id, Bool val)
+{
+	xf86getBoolValue(&val, xf86GetOptValString(sna->Options, id));
+	return val;
+}
+
 /**
  * This is called before ScreenInit to do any require probing of screen
  * configuration.
@@ -543,7 +549,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	xf86SetDpi(scrn, 0, 0);
 
 	sna->dri_available = false;
-	if (xf86ReturnOptValBool(sna->Options, OPTION_DRI, TRUE))
+	if (sna_option_cast_to_bool(sna, OPTION_DRI, TRUE))
 		sna->dri_available = !!xf86LoadSubModule(scrn, "dri2");
 
 	return TRUE;


More information about the xorg-commit mailing list