diff options
-rw-r--r-- | modules/gralloc/framebuffer.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/modules/gralloc/framebuffer.cpp b/modules/gralloc/framebuffer.cpp index 9d8513a2..3f8ed51b 100644 --- a/modules/gralloc/framebuffer.cpp +++ b/modules/gralloc/framebuffer.cpp @@ -97,8 +97,8 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) const size_t offset = hnd->base - m->framebuffer->base; m->info.activate = FB_ACTIVATE_VBL; m->info.yoffset = offset / m->finfo.line_length; - if (ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info) == -1) { - ALOGE("FBIOPUT_VSCREENINFO failed"); + if (ioctl(m->framebuffer->fd, FBIOPAN_DISPLAY, &m->info) == -1) { + ALOGE("FBIOPAN_DISPLAY failed"); m->base.unlock(&m->base, buffer); return -errno; } @@ -132,6 +132,27 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) /*****************************************************************************/ +void clearFrameBuffer(void* vaddr, size_t fbSize) +{ +#ifdef __aarch64__ + /* + * The optimised memset for arm64 cannot operate on device memory. + * The zeroing has to be done differently. This is a copy of bionic's + * generic memset. + */ + char* q = (char*)vaddr; + char* end = q + fbSize; + for (;;) { + if (q >= end) break; *q++ = 0; + if (q >= end) break; *q++ = 0; + if (q >= end) break; *q++ = 0; + if (q >= end) break; *q++ = 0; + } +#else + memset(vaddr, 0, fbSize); +#endif +} + int mapFrameBufferLocked(struct private_module_t* module) { // already initialized... @@ -284,7 +305,7 @@ int mapFrameBufferLocked(struct private_module_t* module) return -errno; } module->framebuffer->base = intptr_t(vaddr); - memset(vaddr, 0, fbSize); + clearFrameBuffer(vaddr, fbSize); return 0; } |