static int get_framebuffer(GGLSurface *fb) { int fd, index = 0; void *bits; fd = open("/dev/graphics/fb0", O_RDWR); while (fd < 0 && index < 30) { usleep(1000); fd = open("/dev/graphics/fb0", O_RDWR); index++; } if (fd < 0) { perror("cannot open fb0\n"); return -1; } if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } #if 0 fprintf(stderr, "Pixel format: %dx%d @ %dbpp\n", vi.xres, vi.yres, vi.bits_per_pixel); vi.bits_per_pixel = PIXEL_SIZE * 8; if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { fprintf(stderr, "Pixel format: BGRA_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 8; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 24; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { fprintf(stderr, "Pixel format: RGBX_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 24; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 8; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGB_565) { #ifdef RECOVERY_RGB_565 fprintf(stderr, "Pixel format: RGB_565\n"); vi.blue.offset = 0; vi.green.offset = 5; vi.red.offset = 11; #else fprintf(stderr, "Pixel format: BGR_565\n"); vi.blue.offset = 11; vi.green.offset = 5; vi.red.offset = 0; #endif if (PIXEL_SIZE != 2) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.blue.length = 5; vi.green.length = 6; vi.red.length = 5; vi.blue.msb_right = 0; vi.green.msb_right = 0; vi.red.msb_right = 0; vi.transp.offset = 0; vi.transp.length = 0; } else { perror("unknown pixel format"); close(fd); return -1; } #endif vi.vmode = FB_VMODE_NONINTERLACED; vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { perror("failed to put fb0 info"); close(fd); return -1; } if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } #ifdef MSM_BSP has_overlay = target_has_overlay(fi.id); if (isTargetMdp5()) setDisplaySplit(); #else has_overlay = false; #endif if (!has_overlay) { printf("Not using qualcomm overlay, '%s'\n", fi.id); bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (bits == MAP_FAILED) { perror("failed to mmap framebuffer"); close(fd); return -1; } } else { printf("Using qualcomm overlay\n"); } #ifdef RECOVERY_GRAPHICS_USE_LINELENGTH vi.xres_virtual = fi.line_length / PIXEL_SIZE; #endif fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; #ifdef BOARD_HAS_JANKY_BACKBUFFER printf("setting JANKY BACKBUFFER\n"); fb->stride = fi.line_length/2; #else fb->stride = vi.xres_virtual; #endif fb->format = PIXEL_FORMAT; if (!has_overlay) { fb->data = bits; memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); } fb++; #ifndef TW_DISABLE_DOUBLE_BUFFERING /* check if we can use double buffering */ if (vi.yres * fi.line_length * 2 > fi.smem_len) #else printf("TW_DISABLE_DOUBLE_BUFFERING := true\n"); #endif return fd; double_buffering = 1; fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; #ifdef BOARD_HAS_JANKY_BACKBUFFER fb->stride = fi.line_length/2; fb->data = (GGLubyte*) (((unsigned long) bits) + vi.yres * fi.line_length); #else fb->stride = vi.xres_virtual; fb->data = (GGLubyte*) (((unsigned long) bits) + vi.yres * fb->stride * PIXEL_SIZE); #endif fb->format = PIXEL_FORMAT; if (!has_overlay) { memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); } #ifdef PRINT_SCREENINFO print_fb_var_screeninfo(); #endif return fd; }
static int get_framebuffer(GGLSurface *fb) { int fd; void *bits; fd = open("/dev/graphics/fb0", O_RDWR); if (fd < 0) { perror("cannot open fb0"); return -1; } if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } fprintf(stderr, "Pixel format: %dx%d @ %dbpp\n", vi.xres, vi.yres, vi.bits_per_pixel); vi.bits_per_pixel = PIXEL_SIZE * 8; if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { fprintf(stderr, "Pixel format: BGRA_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 8; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 24; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { fprintf(stderr, "Pixel format: RGBX_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 24; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 8; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGB_565) { #ifdef RECOVERY_RGB_565 fprintf(stderr, "Pixel format: RGB_565\n"); vi.blue.offset = 0; vi.green.offset = 5; vi.red.offset = 11; #else fprintf(stderr, "Pixel format: BGR_565\n"); vi.blue.offset = 11; vi.green.offset = 5; vi.red.offset = 0; #endif if (PIXEL_SIZE != 2) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.blue.length = 5; vi.green.length = 6; vi.red.length = 5; vi.blue.msb_right = 0; vi.green.msb_right = 0; vi.red.msb_right = 0; vi.transp.offset = 0; vi.transp.length = 0; } else { perror("unknown pixel format"); close(fd); return -1; } vi.vmode = FB_VMODE_NONINTERLACED; vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { perror("failed to put fb0 info"); close(fd); return -1; } if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (bits == MAP_FAILED) { perror("failed to mmap framebuffer"); close(fd); return -1; } #ifdef RECOVERY_GRAPHICS_USE_LINELENGTH vi.xres_virtual = fi.line_length / PIXEL_SIZE; #endif fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; #ifdef BOARD_HAS_JANKY_BACKBUFFER printf("setting JANKY BACKBUFFER\n"); fb->stride = fi.line_length/2; #else fb->stride = vi.xres_virtual; #endif fb->data = bits; fb->format = PIXEL_FORMAT; memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); fb++; /* check if we can use double buffering */ if (vi.yres * fi.line_length * 2 > fi.smem_len) return fd; double_buffering = 1; fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; #ifdef BOARD_HAS_JANKY_BACKBUFFER fb->stride = fi.line_length/2; fb->data = (void*) (((unsigned) bits) + vi.yres * fi.line_length); #else fb->stride = vi.xres_virtual; fb->data = (void*) (((unsigned) bits) + vi.yres * fb->stride * PIXEL_SIZE); #endif fb->format = PIXEL_FORMAT; memset(fb->data, 0, vi.yres * fb->stride * PIXEL_SIZE); #ifdef PRINT_SCREENINFO print_fb_var_screeninfo(); #endif return fd; }
static int get_framebuffer(GGLSurface *fb) { int fd; int fb_size; struct fb_fix_screeninfo fi; void *bits; fd = open("/dev/graphics/fb0", O_RDWR); if (fd < 0) { perror("cannot open fb0"); return -1; } if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } //fprintf(stderr, "Pixel format: %dx%d @ %dbpp\n", vi.xres, vi.yres, vi.bits_per_pixel); /*vi.bits_per_pixel = PIXEL_SIZE * 8; if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { fprintf(stderr, "Pixel format: BGRA_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 8; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 24; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { fprintf(stderr, "Pixel format: RGBX_8888\n"); if (PIXEL_SIZE != 4) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.red.offset = 24; vi.red.length = 8; vi.green.offset = 16; vi.green.length = 8; vi.blue.offset = 8; vi.blue.length = 8; vi.transp.offset = 0; vi.transp.length = 8; } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGB_565) { #ifdef RECOVERY_RGB_565 fprintf(stderr, "Pixel format: RGB_565\n"); vi.blue.offset = 0; vi.green.offset = 5; vi.red.offset = 11; #else fprintf(stderr, "Pixel format: BGR_565\n"); vi.blue.offset = 11; vi.green.offset = 5; vi.red.offset = 0; #endif if (PIXEL_SIZE != 2) fprintf(stderr, "E: Pixel Size mismatch!\n"); vi.blue.length = 5; vi.green.length = 6; vi.red.length = 5; vi.blue.msb_right = 0; vi.green.msb_right = 0; vi.red.msb_right = 0; vi.transp.offset = 0; vi.transp.length = 0; } else { perror("unknown pixel format"); close(fd); return -1; } vi.vmode = FB_VMODE_NONINTERLACED; vi.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { perror("failed to put fb0 info"); close(fd); return -1; }*/ if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { perror("failed to get fb0 info"); close(fd); return -1; } bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (bits == MAP_FAILED) { perror("failed to mmap framebuffer"); close(fd); return -1; } fprintf(stderr, "framebuffer bits:%d\n", vi.bits_per_pixel); fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; fb->stride = vi.xres; fb->data = bits; fb_size = PAGE_ALIGN(vi.yres * vi.xres * 4); fb->format = GGL_PIXEL_FORMAT_RGBA_8888; memset(fb->data, 0, fb_size); fb++; fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; fb->stride = vi.xres; fb->data = (void*) (((unsigned) bits) + fb_size); fb->format = GGL_PIXEL_FORMAT_RGBA_8888; memset(fb->data, 0, fb_size); #ifdef PRINT_SCREENINFO print_fb_var_screeninfo(); #endif return fd; }