xf86-video-intel: 5 commits - src/sna/kgem.c src/sna/kgem.h src/sna/sna_render.c src/sna/sna_video_sprite.c uxa/uxa-glyphs.c
Chris Wilson
ickle at kemper.freedesktop.org
Sat Apr 14 23:53:32 PDT 2012
src/sna/kgem.c | 27 +++++++++++++--------------
src/sna/kgem.h | 1 -
src/sna/sna_render.c | 26 ++++++++++++++++++++++++--
src/sna/sna_video_sprite.c | 14 ++++++--------
uxa/uxa-glyphs.c | 4 +++-
5 files changed, 46 insertions(+), 26 deletions(-)
New commits:
commit a16616209bb2dcb7aaa859b38e154f0a10faa82b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 14 19:03:25 2012 +0100
uxa: Fix leak of glyph mask for unhandled glyph composition
==1401== 7,344 bytes in 34 blocks are possibly lost in loss record 570 of 587
==1401== at 0x4027034: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1401== by 0x8BE5150: drm_intel_gem_bo_alloc_internal (intel_bufmgr_gem.c:689)
==1401== by 0x899FC04: intel_uxa_create_pixmap (intel_uxa.c:1077)
==1401== by 0x89C2C41: uxa_glyphs (uxa-glyphs.c:254)
==1401== by 0x21F05E: damageGlyphs (damage.c:647)
==1401== by 0x218E06: ProcRenderCompositeGlyphs (render.c:1434)
==1401== by 0x15AA40: Dispatch (dispatch.c:439)
==1401== by 0x1499E9: main (main.c:287)
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/uxa/uxa-glyphs.c b/uxa/uxa-glyphs.c
index b754f4e..921b99c 100644
--- a/uxa/uxa-glyphs.c
+++ b/uxa/uxa-glyphs.c
@@ -812,8 +812,10 @@ uxa_glyphs_via_mask(CARD8 op,
if (!uxa_pixmap_is_offscreen(src_pixmap) ||
!uxa_screen->info->prepare_composite(PictOpAdd,
this_atlas, NULL, mask,
- src_pixmap, NULL, pixmap))
+ src_pixmap, NULL, pixmap)) {
+ FreePicture(mask, 0);
return -1;
+ }
glyph_atlas = this_atlas;
}
commit ae145c21e9fd3a12164f8b4720d059f9c158249e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 14 18:42:23 2012 +0100
sna: Avoid leaking the plane resources when determining sprite planes
Fixes the tiny, one-off leak:
==1407== 8 bytes in 1 blocks are definitely lost in loss record 48 of 527
==1407== at 0x402894D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1407== by 0x8580BE8: drmMalloc (xf86drm.c:147)
==1407== by 0x8583D54: drmAllocCpy (xf86drmMode.c:73)
==1407== by 0x8585265: drmModeGetPlaneResources (xf86drmMode.c:955)
==1407== by 0x8A1BCE9: sna_video_sprite_setup (sna_video_sprite.c:367)
==1407== by 0x8A1A0A3: sna_video_init (sna_video.c:523)
==1407== by 0x89FD4E0: sna_screen_init (sna_driver.c:935)
==1407== by 0x15AD80: AddScreen (dispatch.c:3909)
==1407== by 0x19A2DB: InitOutput (xf86Init.c:817)
==1407== by 0x14981C: main (main.c:204)
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 82db122..0e5f3ab 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -361,21 +361,21 @@ XF86VideoAdaptorPtr sna_video_sprite_setup(struct sna *sna,
ScreenPtr screen)
{
XF86VideoAdaptorPtr adaptor;
+ struct drm_mode_get_plane_res r;
struct sna_video *video;
- drmModePlaneRes *plane_resources;
- plane_resources = drmModeGetPlaneResources(sna->kgem.fd);
- if (!plane_resources)
+ memset(&r, 0, sizeof(struct drm_mode_get_plane_res));
+ if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPLANERESOURCES, &r))
+ return NULL;
+ if (r.count_planes == 0)
return NULL;
adaptor = calloc(1,
sizeof(XF86VideoAdaptorRec) +
sizeof(struct sna_video) +
sizeof(DevUnion));
- if (!adaptor) {
- free(plane_resources);
+ if (!adaptor)
return NULL;
- }
adaptor->type = XvWindowMask | XvInputMask | XvImageMask;
adaptor->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT */ ;
@@ -428,7 +428,5 @@ XF86VideoAdaptorPtr sna_video_sprite_setup(struct sna *sna,
xvColorKey = MAKE_ATOM("XV_COLORKEY");
- free(plane_resources);
-
return adaptor;
}
commit 69a7737abeded6ee923643bd8a80a5a84e6a979c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 14 12:06:51 2012 +0100
sna: Align texture subsurfaces to 2x2 texture samples
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 66e078a..ec2aaad 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -839,8 +839,15 @@ sna_render_pixmap_partial(struct sna *sna,
box.x2 = ALIGN(box.x2, tile_width * 8 / pixmap->drawable.bitsPerPixel);
offset = box.x1 * pixmap->drawable.bitsPerPixel / 8 / tile_width * tile_size;
- } else
+ } else {
+ box.y1 = box.y1 & ~1;
+ box.y2 = ALIGN(box.y2, 2);
+
+ box.x1 = box.x1 & ~1;
+ box.x2 = ALIGN(box.x2, 2);
+
offset = box.x1 * pixmap->drawable.bitsPerPixel / 8;
+ }
if (box.x2 > pixmap->drawable.width)
box.x2 = pixmap->drawable.width;
commit 1d2a46e0902d82b43a5e12af36521a6a7fd6ba39
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 14 12:04:23 2012 +0100
sna: Align redirect subsurfaces to 2x2 or 4x4 render spans
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 8af80f2..66e078a 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -1767,8 +1767,23 @@ sna_render_composite_redirect(struct sna *sna,
box.x2 = ALIGN(box.x2, tile_width * 8 / op->dst.pixmap->drawable.bitsPerPixel);
offset = box.x1 * op->dst.pixmap->drawable.bitsPerPixel / 8 / tile_width * tile_size;
- } else
+ } else {
+ if (sna->kgem.gen < 40) {
+ box.y1 = box.y1 & ~3;
+ box.y2 = ALIGN(box.y2, 4);
+
+ box.x1 = box.x1 & ~3;
+ box.x2 = ALIGN(box.x2, 4);
+ } else {
+ box.y1 = box.y1 & ~1;
+ box.y2 = ALIGN(box.y2, 2);
+
+ box.x1 = box.x1 & ~1;
+ box.x2 = ALIGN(box.x2, 2);
+ }
+
offset = box.x1 * op->dst.pixmap->drawable.bitsPerPixel / 8;
+ }
if (box.y2 > op->dst.pixmap->drawable.height)
box.y2 = op->dst.pixmap->drawable.height;
commit 1ce2b65d622797000e0a4db7dc851d5b1da04f85
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Apr 14 11:59:31 2012 +0100
sna: Align render target sizes on gen2/3 to 4x4 render spans
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index f1b0376..9b080f1 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -686,12 +686,6 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
DBG(("%s: partial buffer size=%d [%d KiB]\n", __FUNCTION__,
kgem->partial_buffer_size, kgem->partial_buffer_size / 1024));
- kgem->min_alignment = 4;
- if (gen < 60)
- /* XXX workaround an issue where we appear to fail to
- * disable dual-stream mode */
- kgem->min_alignment = 64;
-
kgem->max_object_size = 2 * aperture.aper_size / 3;
kgem->max_gpu_size = kgem->max_object_size;
if (!kgem->has_llc)
@@ -776,8 +770,8 @@ static uint32_t kgem_untiled_pitch(struct kgem *kgem,
uint32_t width, uint32_t bpp,
bool scanout)
{
- width = width * bpp >> 3;
- return ALIGN(width, scanout ? 64 : kgem->min_alignment);
+ width = ALIGN(width, 4) * bpp >> 3;
+ return ALIGN(width, scanout ? 64 : 4);
}
void kgem_get_tile_size(struct kgem *kgem, int tiling,
@@ -838,14 +832,19 @@ static uint32_t kgem_surface_size(struct kgem *kgem,
tile_width = 512;
tile_height = kgem->gen < 30 ? 16 : 8;
} else {
- tile_width = scanout ? 64 : kgem->min_alignment;
- tile_height = 2;
+ tile_width = scanout ? 64 : 4 * bpp >> 3;
+ tile_height = 4;
}
} else switch (tiling) {
default:
case I915_TILING_NONE:
- tile_width = scanout ? 64 : kgem->min_alignment;
- tile_height = 2;
+ if (kgem->gen < 40) {
+ tile_width = scanout ? 64 : 4 * bpp >> 3;
+ tile_height = 4;
+ } else {
+ tile_width = scanout ? 64 : 2 * bpp >> 3;
+ tile_height = 2;
+ }
break;
case I915_TILING_X:
tile_width = 512;
@@ -899,7 +898,7 @@ static uint32_t kgem_aligned_height(struct kgem *kgem,
} else switch (tiling) {
default:
case I915_TILING_NONE:
- tile_height = 2;
+ tile_height = kgem->gen < 40 ? 4 : 2;
break;
case I915_TILING_X:
tile_height = 8;
@@ -2881,7 +2880,7 @@ struct kgem_bo *kgem_create_cpu_2d(struct kgem *kgem,
stride = ALIGN(width, 2) * bpp >> 3;
stride = ALIGN(stride, 4);
- size = ALIGN(height, 2) * stride;
+ size = ALIGN(height, kgem->gen < 40 ? 4 : 2) * stride;
assert(size >= PAGE_SIZE);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index e52645c..913e1a9 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -161,7 +161,6 @@ struct kgem {
uint16_t half_cpu_cache_pages;
uint32_t aperture_total, aperture_high, aperture_low, aperture_mappable;
uint32_t aperture, aperture_fenced;
- uint32_t min_alignment;
uint32_t max_upload_tile_size, max_copy_tile_size;
uint32_t max_gpu_size, max_cpu_size;
uint32_t large_object_size, max_object_size;
More information about the xorg-commit
mailing list