display: Use cache invalidate and clean correctly
Make sure cache is invalidated before reading in software and
cleaned after writing in software.
Change-Id: I91c471c47a5f1ff11f9960f08091a17ffe575534
diff --git a/libgralloc/mapper.cpp b/libgralloc/mapper.cpp
index 9c97aae..5a32975 100644
--- a/libgralloc/mapper.cpp
+++ b/libgralloc/mapper.cpp
@@ -222,12 +222,19 @@
pthread_mutex_unlock(lock);
}
*vaddr = (void*)hnd->base;
-
+ //Invalidate if reading in software. No need to do this for the metadata
+ //buffer as it is only read/written in software.
+ IMemAlloc* memalloc = getAllocator(hnd->flags) ;
+ err = memalloc->clean_buffer((void*)hnd->base,
+ hnd->size, hnd->offset, hnd->fd,
+ CACHE_INVALIDATE);
if ((usage & GRALLOC_USAGE_SW_WRITE_MASK) &&
!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
// Mark the buffer to be flushed after cpu read/write
hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
}
+ } else {
+ hnd->flags |= private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH;
}
return err;
}
@@ -237,26 +244,26 @@
{
if (private_handle_t::validate(handle) < 0)
return -EINVAL;
-
+ int err = 0;
private_handle_t* hnd = (private_handle_t*)handle;
+ IMemAlloc* memalloc = getAllocator(hnd->flags);
if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
- int err;
- IMemAlloc* memalloc = getAllocator(hnd->flags) ;
err = memalloc->clean_buffer((void*)hnd->base,
- hnd->size, hnd->offset, hnd->fd);
- ALOGE_IF(err < 0, "cannot flush handle %p (offs=%x len=%x, flags = 0x%x) err=%s\n",
- hnd, hnd->offset, hnd->size, hnd->flags, strerror(errno));
- unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
- err = memalloc->clean_buffer((void*)hnd->base_metadata, size,
- hnd->offset_metadata, hnd->fd_metadata);
- ALOGE_IF(err < 0, "cannot flush handle %p (offs=%x len=%lu, "
- "flags = 0x%x) err=%s\n", hnd, hnd->offset_metadata, size,
- hnd->flags, strerror(errno));
+ hnd->size, hnd->offset, hnd->fd,
+ CACHE_CLEAN_AND_INVALIDATE);
hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
+ } else if(hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) {
+ hnd->flags &= ~private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH;
+ } else {
+ //Probably a round about way to do this, but this avoids adding new
+ //flags
+ err = memalloc->clean_buffer((void*)hnd->base,
+ hnd->size, hnd->offset, hnd->fd,
+ CACHE_INVALIDATE);
}
- return 0;
+ return err;
}
/*****************************************************************************/