Add chunk heap, use it for gralloc buffers
authorRebecca Schultz Zavin <rebecca@android.com>
Wed, 9 Jan 2013 23:37:04 +0000 (15:37 -0800)
committerRebecca Schultz Zavin <rebecca@android.com>
Tue, 15 Jan 2013 20:55:27 +0000 (12:55 -0800)
Rather than allocating buffers solely from system memory
we will now attempt to first allocate them out of a specific
graphics carveout.  If there isn't space for a buffer in the
carveout the system heap will be used instead.

Change-Id: I30844123910209a0201c9462fb4776f123537e50
Signed-off-by: Rebecca Schultz Zavin <rebecca@android.com>
gralloc/gralloc.cpp
include/ion.h
libcamera2/ExynosCameraHWInterface2.cpp

index f3610f3625885852f2424d81a160a20ce8ee8139..83a240708b33ba1ff8bd2b9d1d44068952195a18 100644 (file)
 #include "exynos_format.h"
 #include "gr.h"
 
-#define ION_HEAP_EXYNOS_CONTIG_MASK     (1 << 4)
+#define ION_HEAP_EXYNOS_CONTIG_MASK (1 << 4)
 #define ION_EXYNOS_FIMD_VIDEO_MASK  (1 << 28)
 #define ION_EXYNOS_MFC_OUTPUT_MASK  (1 << 26)
 #define ION_EXYNOS_MFC_INPUT_MASK   (1 << 25)
+#define ION_HEAP_SYSTEM_ID          0
+#define ION_HEAP_EXYNOS_CONTIG_ID   4
+#define ION_HEAP_CHUNK_ID           6
 #define MB_1 (1024*1024)
 
 
@@ -121,9 +124,9 @@ static unsigned int _select_heap(int usage)
     unsigned int heap_mask;
 
     if (usage & GRALLOC_USAGE_PROTECTED)
-        heap_mask = ION_HEAP_EXYNOS_CONTIG_MASK;
+        heap_mask = (1 << ION_HEAP_EXYNOS_CONTIG_ID);
     else
-        heap_mask = ION_HEAP_SYSTEM_MASK;
+        heap_mask = (1 << ION_HEAP_SYSTEM_ID) | (1 << ION_HEAP_CHUNK_ID);
 
     return heap_mask;
 }
@@ -189,6 +192,7 @@ static int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
 {
     size_t size;
     int err, fd;
+    unsigned int heap_mask = _select_heap(usage);
 
     switch (format) {
         case HAL_PIXEL_FORMAT_YV12:
@@ -204,8 +208,7 @@ static int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
             return -EINVAL;
     }
 
-    err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
-                       ion_flags, &fd);
+    err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags, &fd);
     if (err)
         return err;
 
index 0c6045ef3d7b9bcf3e41751434f37fb0b0b31098..e790cb48d9d193d539eb1ee8dd40385260e17951 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h> /* size_t */
 
 #define ION_FLAG_CACHED 1
+#define ION_FLAG_CACHED_NEEDS_SYNC 2
 
 #define ION_HEAP_SYSTEM_MASK            (1 << 0)
 #define ION_HEAP_SYSTEM_CONTIG_MASK     (1 << 1)
index ea90d0549625eb5a14ff62d70903556a3832434a..d6174bb2a5923e1a920919496abadbcc2adb95a9 100644 (file)
@@ -6046,7 +6046,7 @@ int ExynosCameraHWInterface2::allocCameraMemory(ion_client ionClient, ExynosBuff
             break;
         }
         if (1 << i & cacheFlag)
-            flag = ION_FLAG_CACHED;
+            flag = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC;
         else
             flag = 0;
         buf->fd.extFd[i] = ion_alloc(ionClient, \