xf86-video-intel: 4 commits - src/sna/kgem.c
Chris Wilson
ickle at kemper.freedesktop.org
Thu Jan 3 10:09:01 PST 2013
src/sna/kgem.c | 117 +++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 86 insertions(+), 31 deletions(-)
New commits:
commit ea2da97773d858001f98adc880f24b9671c51b2f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jan 3 16:47:14 2013 +0000
sna: Convert allocation request from bytes to num_pages when shrinking
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 398244d..5f9ba9e 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -2206,9 +2206,58 @@ static void kgem_finish_buffers(struct kgem *kgem)
bo->base.size.pages.count > 1 &&
bo->used < bytes(&bo->base) / 2) {
struct kgem_bo *shrink;
+ unsigned alloc = NUM_PAGES(bo->used);
- shrink = search_linear_cache(kgem,
- PAGE_ALIGN(bo->used),
+ shrink = search_snoop_cache(kgem, alloc,
+ CREATE_INACTIVE | CREATE_NO_RETIRE);
+ if (shrink) {
+ void *map;
+ int n;
+
+ DBG(("%s: used=%d, shrinking %d to %d, handle %d to %d\n",
+ __FUNCTION__,
+ bo->used, bytes(&bo->base), bytes(shrink),
+ bo->base.handle, shrink->handle));
+
+ assert(bo->used <= bytes(shrink));
+ map = kgem_bo_map__cpu(kgem, shrink);
+ if (map) {
+ kgem_bo_sync__cpu(kgem, shrink);
+ memcpy(map, bo->mem, bo->used);
+
+ shrink->target_handle =
+ kgem->has_handle_lut ? bo->base.target_handle : shrink->handle;
+ for (n = 0; n < kgem->nreloc; n++) {
+ if (kgem->reloc[n].target_handle == bo->base.target_handle) {
+ kgem->reloc[n].target_handle = shrink->target_handle;
+ kgem->reloc[n].presumed_offset = shrink->presumed_offset;
+ kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
+ kgem->reloc[n].delta + shrink->presumed_offset;
+ }
+ }
+
+ bo->base.exec->handle = shrink->handle;
+ bo->base.exec->offset = shrink->presumed_offset;
+ shrink->exec = bo->base.exec;
+ shrink->rq = bo->base.rq;
+ list_replace(&bo->base.request,
+ &shrink->request);
+ list_init(&bo->base.request);
+ shrink->needs_flush = bo->base.dirty;
+
+ bo->base.exec = NULL;
+ bo->base.rq = NULL;
+ bo->base.dirty = false;
+ bo->base.needs_flush = false;
+ bo->used = 0;
+
+ goto decouple;
+ }
+
+ __kgem_bo_destroy(kgem, shrink);
+ }
+
+ shrink = search_linear_cache(kgem, alloc,
CREATE_INACTIVE | CREATE_NO_RETIRE);
if (shrink) {
int n;
@@ -2219,36 +2268,38 @@ static void kgem_finish_buffers(struct kgem *kgem)
bo->base.handle, shrink->handle));
assert(bo->used <= bytes(shrink));
- gem_write(kgem->fd, shrink->handle,
- 0, bo->used, bo->mem);
-
- shrink->target_handle =
- kgem->has_handle_lut ? bo->base.target_handle : shrink->handle;
- for (n = 0; n < kgem->nreloc; n++) {
- if (kgem->reloc[n].target_handle == bo->base.target_handle) {
- kgem->reloc[n].target_handle = shrink->target_handle;
- kgem->reloc[n].presumed_offset = shrink->presumed_offset;
- kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
- kgem->reloc[n].delta + shrink->presumed_offset;
+ if (gem_write(kgem->fd, shrink->handle,
+ 0, bo->used, bo->mem) == 0) {
+ shrink->target_handle =
+ kgem->has_handle_lut ? bo->base.target_handle : shrink->handle;
+ for (n = 0; n < kgem->nreloc; n++) {
+ if (kgem->reloc[n].target_handle == bo->base.target_handle) {
+ kgem->reloc[n].target_handle = shrink->target_handle;
+ kgem->reloc[n].presumed_offset = shrink->presumed_offset;
+ kgem->batch[kgem->reloc[n].offset/sizeof(kgem->batch[0])] =
+ kgem->reloc[n].delta + shrink->presumed_offset;
+ }
}
+
+ bo->base.exec->handle = shrink->handle;
+ bo->base.exec->offset = shrink->presumed_offset;
+ shrink->exec = bo->base.exec;
+ shrink->rq = bo->base.rq;
+ list_replace(&bo->base.request,
+ &shrink->request);
+ list_init(&bo->base.request);
+ shrink->needs_flush = bo->base.dirty;
+
+ bo->base.exec = NULL;
+ bo->base.rq = NULL;
+ bo->base.dirty = false;
+ bo->base.needs_flush = false;
+ bo->used = 0;
+
+ goto decouple;
}
- bo->base.exec->handle = shrink->handle;
- bo->base.exec->offset = shrink->presumed_offset;
- shrink->exec = bo->base.exec;
- shrink->rq = bo->base.rq;
- list_replace(&bo->base.request,
- &shrink->request);
- list_init(&bo->base.request);
- shrink->needs_flush = bo->base.dirty;
-
- bo->base.exec = NULL;
- bo->base.rq = NULL;
- bo->base.dirty = false;
- bo->base.needs_flush = false;
- bo->used = 0;
-
- goto decouple;
+ __kgem_bo_destroy(kgem, shrink);
}
}
commit 2bd6e4dcd43bb0d836f12232050e73ce1510bb0f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jan 3 16:38:33 2013 +0000
sna: Add a pair of asserts to validate fls()/cache_bucket()
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index df8c446..398244d 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -603,11 +603,15 @@ static void __kgem_request_free(struct kgem_request *rq)
static struct list *inactive(struct kgem *kgem, int num_pages)
{
+ assert(num_pages < MAX_CACHE_SIZE / PAGE_SIZE);
+ assert(cache_bucket(num_pages) < NUM_CACHE_BUCKETS);
return &kgem->inactive[cache_bucket(num_pages)];
}
static struct list *active(struct kgem *kgem, int num_pages, int tiling)
{
+ assert(num_pages < MAX_CACHE_SIZE / PAGE_SIZE);
+ assert(cache_bucket(num_pages) < NUM_CACHE_BUCKETS);
return &kgem->active[cache_bucket(num_pages)][tiling];
}
commit f9d2730974a869f15eac599ca865b50a9a9658d9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jan 3 15:20:45 2013 +0000
sna: Also recognise __i386__ for fls asm
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 23cbef5..df8c446 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -516,7 +516,7 @@ static void gem_close(int fd, uint32_t handle)
constant inline static unsigned long __fls(unsigned long word)
{
-#if defined(__GNUC__) && (defined(__x86__) || defined(__x86_64__))
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86__) || defined(__x86_64__))
asm("bsr %1,%0"
: "=r" (word)
: "rm" (word));
commit 69dde74a003ba0168ceca1558a4cb69097421b92
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Thu Jan 3 15:20:23 2013 +0000
sna: Fix off-by-one in C version of fls
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 80f25b8..23cbef5 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -522,7 +522,7 @@ constant inline static unsigned long __fls(unsigned long word)
: "rm" (word));
return word;
#else
- unsigned int v = 1;
+ unsigned int v = 0;
while (word >>= 1)
v++;
More information about the xorg-commit
mailing list