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