xf86-video-intel: 2 commits - src/compat-api.h src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_display_fake.c src/sna/sna_driver.c src/sna/sna_glyphs.c src/sna/sna.h src/sna/sna_video_overlay.c
Chris Wilson
ickle at kemper.freedesktop.org
Tue Jan 13 08:32:48 PST 2015
src/compat-api.h | 12 +++++
src/sna/sna.h | 5 ++
src/sna/sna_accel.c | 6 +-
src/sna/sna_display.c | 104 +++++++++++++++++++++++++++++---------------
src/sna/sna_display_fake.c | 2
src/sna/sna_driver.c | 8 +--
src/sna/sna_glyphs.c | 2
src/sna/sna_video_overlay.c | 2
8 files changed, 96 insertions(+), 45 deletions(-)
New commits:
commit b7feeca0730bf55c23e5bc5af4cae9b8a73bba0e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jan 13 16:29:11 2015 +0000
sna: Wrap direct access to ScrnInfoPtr->pScreen
Admittedly ScrnInfoPtr->pScreen has nearly always existed, but for
completeness wrap it up in a compat macro.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/compat-api.h b/src/compat-api.h
index 9367d64..c9c76eb 100644
--- a/src/compat-api.h
+++ b/src/compat-api.h
@@ -39,7 +39,13 @@
#ifndef XF86_HAS_SCRN_CONV
#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
+#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,1,0,0,0)
#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
+#else
+#define xf86ScrnToScreen(s) ((s)->pScreen)
+#endif
+#else
+#define xf86ScrnToScreen(s) ((s)->pScreen)
#endif
#ifndef XF86_SCRN_INTERFACE
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 7a1bf34..0c66d17 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -462,6 +462,11 @@ to_sna_from_screen(ScreenPtr screen)
return to_sna(xf86ScreenToScrn(screen));
}
+pure static inline ScreenPtr to_screen_from_sna(struct sna *sna)
+{
+ return xf86ScrnToScreen(sna->scrn);
+}
+
pure static inline struct sna *
to_sna_from_pixmap(PixmapPtr pixmap)
{
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 3adb9a7..fb18d58 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1420,7 +1420,7 @@ static void __sna_free_pixmap(struct sna *sna,
sna_accel_watch_flush(sna, -1);
if (priv->header) {
- assert(pixmap->drawable.pScreen == sna->scrn->pScreen);
+ assert(pixmap->drawable.pScreen == to_screen_from_sna(sna));
assert(!priv->shm);
pixmap->devPrivate.ptr = sna->freed_pixmap;
sna->freed_pixmap = pixmap;
@@ -17247,7 +17247,7 @@ static void sna_accel_disarm_timer(struct sna *sna, int id)
static bool has_offload_slaves(struct sna *sna)
{
#if HAS_PIXMAP_SHARING
- ScreenPtr screen = sna->scrn->pScreen;
+ ScreenPtr screen = to_screen_from_sna(sna);
PixmapDirtyUpdatePtr dirty;
xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) {
@@ -17395,7 +17395,7 @@ static bool sna_accel_do_expire(struct sna *sna)
static void sna_accel_post_damage(struct sna *sna)
{
#if HAS_PIXMAP_SHARING
- ScreenPtr screen = sna->scrn->pScreen;
+ ScreenPtr screen = to_screen_from_sna(sna);
PixmapDirtyUpdatePtr dirty;
bool flush = false;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 8e46984..db337fb 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1378,7 +1378,7 @@ bool sna_pixmap_discard_shadow_damage(struct sna_pixmap *priv,
static bool sna_mode_enable_shadow(struct sna *sna)
{
- ScreenPtr screen = sna->scrn->pScreen;
+ ScreenPtr screen = to_screen_from_sna(sna);
DBG(("%s\n", __FUNCTION__));
assert(sna->mode.shadow == NULL);
@@ -1465,7 +1465,8 @@ static bool sna_crtc_enable_shadow(struct sna *sna, struct sna_crtc *crtc)
__FUNCTION__, crtc->id, crtc->pipe, crtc->slave_pixmap->drawable.serialNumber));
crtc->slave_damage = DamageCreate(sna_crtc_slave_damage, NULL,
DamageReportRawRegion, TRUE,
- sna->scrn->pScreen, crtc);
+ to_screen_from_sna(sna),
+ crtc);
if (crtc->slave_damage == NULL) {
if (!--sna->mode.shadow_active)
sna_mode_disable_shadow(sna);
@@ -1746,7 +1747,7 @@ void sna_copy_fbcon(struct sna *sna)
kgem_bo_destroy(&sna->kgem, bo);
#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(10, 0)
- sna->scrn->pScreen->canDoBGNoneRoot = ok;
+ to_screen_from_sna(sna)->canDoBGNoneRoot = ok;
#endif
}
@@ -2221,7 +2222,7 @@ static void sna_crtc_randr(xf86CrtcPtr crtc)
static void
sna_crtc_damage(xf86CrtcPtr crtc)
{
- ScreenPtr screen = crtc->scrn->pScreen;
+ ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
struct sna *sna = to_sna(crtc->scrn);
RegionRec region, *damage;
@@ -4347,7 +4348,7 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
struct sna *sna = to_sna(scrn);
- ScreenPtr screen = scrn->pScreen;
+ ScreenPtr screen = xf86ScrnToScreen(scrn);
PixmapPtr new_front;
int i;
@@ -6698,7 +6699,7 @@ sna_crtc_redisplay__fallback(xf86CrtcPtr crtc, RegionPtr region, struct kgem_bo
{
int16_t sx, sy;
struct sna *sna = to_sna(crtc->scrn);
- ScreenPtr screen = sna->scrn->pScreen;
+ ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
DrawablePtr draw = crtc_source(crtc, &sx, &sy);
PictFormatPtr format;
PictTransform T;
@@ -6796,7 +6797,7 @@ sna_crtc_redisplay__composite(xf86CrtcPtr crtc, RegionPtr region, struct kgem_bo
{
int16_t sx, sy;
struct sna *sna = to_sna(crtc->scrn);
- ScreenPtr screen = crtc->scrn->pScreen;
+ ScreenPtr screen = xf86ScrnToScreen(crtc->scrn);
DrawablePtr draw = crtc_source(crtc, &sx, &sy);
struct sna_composite_op tmp;
PictFormatPtr format;
diff --git a/src/sna/sna_display_fake.c b/src/sna/sna_display_fake.c
index 4d74c38..8830204 100644
--- a/src/sna/sna_display_fake.c
+++ b/src/sna/sna_display_fake.c
@@ -192,7 +192,7 @@ static const xf86OutputFuncsRec sna_output_funcs = {
static Bool
sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
{
- ScreenPtr screen = scrn->pScreen;
+ ScreenPtr screen = xf86ScrnToScreen(scrn);
PixmapPtr new_front;
DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 59abc03..6c122d0 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -185,8 +185,8 @@ sna_set_fallback_mode(ScrnInfoPtr scrn)
xf86DisableUnusedFunctions(scrn);
#ifdef RANDR_12_INTERFACE
- if (get_root_window(scrn->pScreen))
- xf86RandR12TellChanged(scrn->pScreen);
+ if (get_root_window(xf86ScrnToScreen(scrn)))
+ xf86RandR12TellChanged(xf86ScrnToScreen(scrn));
#endif
}
@@ -222,7 +222,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
screen->width, screen->height, screen->rootDepth));
assert(sna->scrn == xf86ScreenToScrn(screen));
- assert(sna->scrn->pScreen == screen);
+ assert(to_screen_from_sna(sna) == screen);
/* free the data used during miInitScreen */
free(screen->devPrivate);
@@ -1137,7 +1137,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
DBG(("%s\n", __FUNCTION__));
assert(sna->scrn == scrn);
- assert(scrn->pScreen == NULL); /* set afterwards */
+ assert(to_screen_from_sna(sna) == NULL); /* set afterwards */
assert(sna->freed_pixmap == NULL);
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index a5dfb06..6d57e8f 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -185,7 +185,7 @@ void sna_glyphs_close(struct sna *sna)
*/
bool sna_glyphs_create(struct sna *sna)
{
- ScreenPtr screen = sna->scrn->pScreen;
+ ScreenPtr screen = to_screen_from_sna(sna);
pixman_color_t white = { 0xffff, 0xffff, 0xffff, 0xffff };
unsigned int formats[] = {
PIXMAN_a8,
diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
index aee6d47..d782113 100644
--- a/src/sna/sna_video_overlay.c
+++ b/src/sna/sna_video_overlay.c
@@ -130,7 +130,7 @@ static int sna_video_overlay_stop(ddStopVideo_ARGS)
DBG(("%s()\n", __FUNCTION__));
- REGION_EMPTY(scrn->pScreen, &video->clip);
+ REGION_EMPTY(to_screen_from_sna(sna), &video->clip);
request.flags = 0;
(void)drmIoctl(sna->kgem.fd,
commit 3cfde9f04362a858ddfe7990109147e32eed516c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jan 13 13:50:08 2015 +0000
sna: Only instantiate the frontbuffer on the GPU if used
If we are a PRIME slave, we never need to allocate any memory for the
frontbuffer, so skip the forced allocation during modesets.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/compat-api.h b/src/compat-api.h
index d09e1fb..9367d64 100644
--- a/src/compat-api.h
+++ b/src/compat-api.h
@@ -223,4 +223,10 @@ static inline void FreePixmap(PixmapPtr pixmap)
dstx, dsty)
#endif
+#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,12,99,901,0)
+#define isGPU(S) (S)->is_gpu
+#else
+#define isGPU(S) 0
+#endif
+
#endif
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 0657c47..8e46984 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1662,7 +1662,7 @@ void sna_copy_fbcon(struct sna *sna)
int dx, dy;
int i;
- if (wedged(sna))
+ if (wedged(sna) || isGPU(sna->scrn))
return;
DBG(("%s\n", __FUNCTION__));
@@ -1756,7 +1756,6 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
PictTransform crtc_to_fb;
struct pict_f_transform f_crtc_to_fb, f_fb_to_crtc;
unsigned pitch_limit;
- struct sna_pixmap *priv;
BoxRec b;
assert(sna->scrn->virtualX && sna->scrn->virtualY);
@@ -1785,27 +1784,31 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
return true;
}
- priv = sna_pixmap_force_to_gpu(sna->front, MOVE_READ | __MOVE_SCANOUT);
- if (priv == NULL)
- return true; /* maybe we can create a bo for the scanout? */
-
- if (sna->kgem.gen == 071)
- pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
- else if ((sna->kgem.gen >> 3) > 4)
- pitch_limit = 32 * 1024;
- else if ((sna->kgem.gen >> 3) == 4)
- pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
- else if ((sna->kgem.gen >> 3) == 3)
- pitch_limit = priv->gpu_bo->tiling ? 8 * 1024 : 16 * 1024;
- else
- pitch_limit = 8 * 1024;
- DBG(("%s: gpu bo handle=%d tiling=%d pitch=%d, limit=%d\n", __FUNCTION__, priv->gpu_bo->handle, priv->gpu_bo->tiling, priv->gpu_bo->pitch, pitch_limit));
- if (priv->gpu_bo->pitch > pitch_limit)
- return true;
+ if (!isGPU(sna->scrn)) {
+ struct sna_pixmap *priv;
- if (priv->gpu_bo->tiling && sna->flags & SNA_LINEAR_FB) {
- DBG(("%s: gpu bo is tiled, need linear, forcing shadow\n", __FUNCTION__));
- return true;
+ priv = sna_pixmap_force_to_gpu(sna->front, MOVE_READ | __MOVE_SCANOUT);
+ if (priv == NULL)
+ return true; /* maybe we can create a bo for the scanout? */
+
+ if (sna->kgem.gen == 071)
+ pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
+ else if ((sna->kgem.gen >> 3) > 4)
+ pitch_limit = 32 * 1024;
+ else if ((sna->kgem.gen >> 3) == 4)
+ pitch_limit = priv->gpu_bo->tiling ? 16 * 1024 : 32 * 1024;
+ else if ((sna->kgem.gen >> 3) == 3)
+ pitch_limit = priv->gpu_bo->tiling ? 8 * 1024 : 16 * 1024;
+ else
+ pitch_limit = 8 * 1024;
+ DBG(("%s: gpu bo handle=%d tiling=%d pitch=%d, limit=%d\n", __FUNCTION__, priv->gpu_bo->handle, priv->gpu_bo->tiling, priv->gpu_bo->pitch, pitch_limit));
+ if (priv->gpu_bo->pitch > pitch_limit)
+ return true;
+
+ if (priv->gpu_bo->tiling && sna->flags & SNA_LINEAR_FB) {
+ DBG(("%s: gpu bo is tiled, need linear, forcing shadow\n", __FUNCTION__));
+ return true;
+ }
}
transform = NULL;
@@ -1943,6 +1946,7 @@ static struct kgem_bo *sna_crtc_attach(xf86CrtcPtr crtc)
sna_crtc->rotation = RR_Rotate_0;
if (use_shadow(sna, crtc)) {
+ PixmapPtr front;
unsigned long tiled_limit;
int tiling;
@@ -1997,7 +2001,8 @@ force_shadow:
return NULL;
}
- if (__sna_pixmap_get_bo(sna->front) && !crtc->transformPresent) {
+ front = sna_crtc->slave_pixmap ?: sna->front;
+ if (__sna_pixmap_get_bo(front) && !crtc->transformPresent) {
BoxRec b;
b.x1 = crtc->x;
@@ -2025,11 +2030,11 @@ force_shadow:
tmp.width = crtc->mode.HDisplay;
tmp.height = crtc->mode.VDisplay;
- tmp.depth = sna->front->drawable.depth;
- tmp.bitsPerPixel = sna->front->drawable.bitsPerPixel;
+ tmp.depth = front->drawable.depth;
+ tmp.bitsPerPixel = front->drawable.bitsPerPixel;
(void)sna->render.copy_boxes(sna, GXcopy,
- &sna->front->drawable, __sna_pixmap_get_bo(sna->front), 0, 0,
+ &front->drawable, __sna_pixmap_get_bo(front), 0, 0,
&tmp, bo, -crtc->x, -crtc->y,
&b, 1, 0);
}
@@ -4248,7 +4253,7 @@ static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
DBG(("%s\n", __FUNCTION__));
- if (wedged(sna))
+ if (wedged(sna) || isGPU(sna->scrn))
return;
old_priv = sna_pixmap_force_to_gpu(old, MOVE_READ);
@@ -7046,6 +7051,34 @@ void sna_shadow_unset_crtc(struct sna *sna,
sna_crtc_damage(crtc);
}
+static bool move_crtc_to_gpu(struct sna *sna)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ int i;
+
+ for (i = 0; i < sna->mode.num_real_crtc; i++) {
+ struct sna_crtc *crtc = to_sna_crtc(config->crtc[i]);
+
+ assert(crtc);
+
+ if (crtc->bo == NULL)
+ continue;
+
+ if (crtc->slave_pixmap)
+ continue;
+
+ if (crtc->client_bo)
+ continue;
+
+ DBG(("%s: CRTC %d [pipe=%d] requires frontbuffer\n",
+ __FUNCTION__, crtc->id, crtc->pipe));
+ return sna_pixmap_move_to_gpu(sna->front,
+ MOVE_READ | MOVE_ASYNC_HINT | __MOVE_SCANOUT);
+ }
+
+ return true;
+}
+
void sna_mode_redisplay(struct sna *sna)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
@@ -7095,7 +7128,7 @@ void sna_mode_redisplay(struct sna *sna)
if (sna->mode.flip_active)
return;
- if (wedged(sna) || !sna_pixmap_move_to_gpu(sna->front, MOVE_READ | MOVE_ASYNC_HINT | __MOVE_SCANOUT)) {
+ if (wedged(sna) || !move_crtc_to_gpu(sna)) {
DBG(("%s: forcing scanout update using the CPU\n", __FUNCTION__));
if (!sna_pixmap_move_to_cpu(sna->front, MOVE_READ))
return;
More information about the xorg-commit
mailing list