OSDN Git Service

gralloc: fallback to use fewer buffer on mapping error
authorChih-Wei Huang <cwhuang@linux.org.tw>
Thu, 2 Dec 2010 03:54:46 +0000 (11:54 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Thu, 5 May 2016 09:41:33 +0000 (17:41 +0800)
Change-Id: I6be89437fd10bdc3f5e05d56944d3d547bffbf3c

modules/gralloc/framebuffer.cpp

index d8356cf..03ea71c 100644 (file)
@@ -272,8 +272,6 @@ int mapFrameBufferLocked(struct private_module_t* module)
         return -errno;
 
 
-    module->flags = flags;
-    module->info = info;
     module->finfo = finfo;
     module->xdpi = xdpi;
     module->ydpi = ydpi;
@@ -283,21 +281,32 @@ int mapFrameBufferLocked(struct private_module_t* module)
      * map the framebuffer
      */
 
-    int err;
-    size_t fbSize = roundUpToPageSize(finfo.line_length * info.yres_virtual);
-    module->framebuffer = new private_handle_t(dup(fd), fbSize, 0);
-
-    module->numBuffers = info.yres_virtual / info.yres;
-    module->bufferMask = 0;
+    while (info.yres_virtual > 0) {
+        size_t fbSize = roundUpToPageSize(finfo.line_length * info.yres_virtual);
+        module->numBuffers = info.yres_virtual / info.yres;
+        void* vaddr = mmap(0, fbSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+        if (vaddr != MAP_FAILED) {
+            module->info = info;
+            module->flags = flags;
+            module->bufferMask = 0;
+            module->framebuffer = new private_handle_t(dup(fd), fbSize, 0);
+            module->framebuffer->base = intptr_t(vaddr);
+            memset(vaddr, 0, fbSize);
+            return 0;
+        }
 
-    void* vaddr = mmap(0, fbSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-    if (vaddr == MAP_FAILED) {
         ALOGE("Error mapping the framebuffer (%s)", strerror(errno));
-        return -errno;
+
+        info.yres_virtual -= info.yres;
+        ALOGW("Fallback to use fewer buffer: %d", info.yres_virtual / info.yres);
+        if (ioctl(fd, FBIOPUT_VSCREENINFO, &info) == -1)
+            break;
+
+        if (info.yres_virtual <= info.yres)
+            flags &= ~PAGE_FLIP;
     }
-    module->framebuffer->base = intptr_t(vaddr);
-    memset(vaddr, 0, fbSize);
-    return 0;
+
+    return -errno;
 }
 
 static int mapFrameBuffer(struct private_module_t* module)