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