From e17d093d0ccb4f2d69f435d4a739e265f562ba55 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 8 Dec 2009 19:34:43 -0800 Subject: [PATCH] improve cache behavior of gralloc allocations on qsd8k make sure to use cached buffers only when frequent cpu access is needed. also, always flush buffers after they are allocated and cleared. --- libgralloc-qsd8k/gralloc.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/libgralloc-qsd8k/gralloc.cpp b/libgralloc-qsd8k/gralloc.cpp index 38f3885..f1d8f55 100644 --- a/libgralloc-qsd8k/gralloc.cpp +++ b/libgralloc-qsd8k/gralloc.cpp @@ -279,9 +279,16 @@ try_ashmem: err = -ENOMEM; } else { struct pmem_region sub = { offset, size }; - + int openFlags = O_RDWR | O_SYNC; + uint32_t uread = usage & GRALLOC_USAGE_SW_READ_MASK; + uint32_t uwrite = usage & GRALLOC_USAGE_SW_WRITE_MASK; + if (uread == GRALLOC_USAGE_SW_READ_OFTEN || + uwrite == GRALLOC_USAGE_SW_WRITE_OFTEN) { + openFlags &= ~O_SYNC; + } + // now create the "sub-heap" - fd = open("/dev/pmem", O_RDWR, 0); + fd = open("/dev/pmem", openFlags, 0); err = fd < 0 ? fd : 0; // and connect to it @@ -297,8 +304,11 @@ try_ashmem: close(fd); sAllocator.deallocate(offset); fd = -1; + } else { + memset((char*)base + offset, 0, size); + // clean and invalidate the new allocation + cacheflush(intptr_t(base) + offset, size, 0); } - memset((char*)base + offset, 0, size); //LOGD_IF(!err, "allocating pmem size=%d, offset=%d", size, offset); } } else {