Created
July 22, 2012 18:45
-
-
Save nicklaslof/3160669 to your computer and use it in GitHub Desktop.
ugly hacks to get gralloc to work on Xperia HDPI devices (atleast mk16i)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| don't use. | |
| https://gist.github.com/3194208 and https://gist.github.com/3194307 are better workarounds. | |
| diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp | |
| index 1e03a88..a8d3b0a 100644 | |
| --- a/libgralloc/framebuffer.cpp | |
| +++ b/libgralloc/framebuffer.cpp | |
| @@ -679,7 +679,7 @@ int mapFrameBufferLocked(struct private_module_t* module) | |
| float ydpi = (info.yres * 25.4f) / info.height; | |
| //The reserved[4] field is used to store FPS by the driver. | |
| float fps = info.reserved[4]; | |
| - | |
| + info.yres_virtual = 1708; | |
| // can probably be info.yres_virtual = inf.yres*2; | |
| ALOGI("using (fd=%d)\n" | |
| "id = %s\n" | |
| "xres = %d px\n" | |
| diff --git a/drivers/video/msm/msm_fb.c b/drivers/video/msm/msm_fb.c | |
| index 6ab377e..dcfe0df 100644 | |
| --- a/drivers/video/msm/msm_fb.c | |
| +++ b/drivers/video/msm/msm_fb.c | |
| @@ -925,16 +925,16 @@ static int msm_fb_register(struct msm_fb_data_type *mfd) | |
| fix->xpanstep = 1; | |
| fix->ypanstep = 1; | |
| var->vmode = FB_VMODE_NONINTERLACED; | |
| - var->blue.offset = 24; | |
| - var->green.offset = 16; | |
| - var->red.offset = 8; | |
| + var->blue.offset = 0; | |
| + var->green.offset = 8; | |
| + var->red.offset = 16; | |
| var->blue.length = 8; | |
| var->green.length = 8; | |
| var->red.length = 8; | |
| var->blue.msb_right = 0; | |
| var->green.msb_right = 0; | |
| var->red.msb_right = 0; | |
| - var->transp.offset = 0; | |
| + var->transp.offset = 24; | |
| var->transp.length = 8; | |
| bpp = 4; | |
| break; | |
| @@ -944,16 +944,16 @@ static int msm_fb_register(struct msm_fb_data_type *mfd) | |
| fix->xpanstep = 1; | |
| fix->ypanstep = 1; | |
| var->vmode = FB_VMODE_NONINTERLACED; | |
| - var->blue.offset = 16; | |
| - var->green.offset = 8; | |
| - var->red.offset = 0; | |
| + var->blue.offset = 8; | |
| + var->green.offset = 16; | |
| + var->red.offset = 24; | |
| var->blue.length = 8; | |
| var->green.length = 8; | |
| var->red.length = 8; | |
| var->blue.msb_right = 0; | |
| var->green.msb_right = 0; | |
| var->red.msb_right = 0; | |
| - var->transp.offset = 24; | |
| + var->transp.offset = 0; | |
| var->transp.length = 8; | |
| bpp = 4; | |
| break; | |
| @@ -1317,11 +1317,16 @@ DECLARE_MUTEX(msm_fb_pan_sem); | |
| static int msm_fb_pan_display(struct fb_var_screeninfo *var, | |
| struct fb_info *info) | |
| { | |
| - struct mdp_dirty_region dirty; | |
| +struct mdp_dirty_region dirty; | |
| struct mdp_dirty_region *dirtyPtr = NULL; | |
| struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; | |
| struct msm_fb_panel_data *pdata = | |
| (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data; | |
| + if (info->node == 1 || info->node == 2) { | |
| + pr_err("%s: no pan display for fb%d!", | |
| + __func__, info->node); | |
| + return -EPERM; | |
| + } | |
| if ((!mfd->op_enable) || (!mfd->panel_power_on)) | |
| return -EPERM; | |
| @@ -1397,8 +1402,10 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |
| { | |
| struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; | |
| + printk(KERN_WARNING "FB_ROTATE_UR"); | |
| if (var->rotate != FB_ROTATE_UR) | |
| return -EINVAL; | |
| + printk(KERN_WARNING "grayscale"); | |
| if (var->grayscale != info->var.grayscale) | |
| return -EINVAL; | |
| @@ -1438,33 +1445,40 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |
| break; | |
| case 32: | |
| - /* Figure out if the user meant RGBA or ARGB | |
| - and verify the position of the RGB components */ | |
| + printk(KERN_WARNING,"case 32"); | |
| if (var->transp.offset == 24) { | |
| - if ((var->blue.offset != 16) || | |
| + printk(KERN_WARNING "offset 24"); | |
| + if ((var->blue.offset != 0) || | |
| (var->green.offset != 8) || | |
| - (var->red.offset != 0)) | |
| + (var->red.offset != 16)){ | |
| + printk(KERN_WARNING "1"); | |
| return -EINVAL; | |
| + } | |
| } else if (var->transp.offset == 0) { | |
| - if ((var->blue.offset != 24) || | |
| + printk(KERN_WARNING "offset 0"); | |
| + if ((var->blue.offset != 8) || | |
| (var->green.offset != 16) || | |
| - (var->red.offset != 8)) | |
| + (var->red.offset != 24)){ | |
| + printk(KERN_WARNING "2"); | |
| return -EINVAL; | |
| - } else | |
| + } | |
| + } else{ | |
| + printk(KERN_WARNING "first else"); | |
| return -EINVAL; | |
| + } | |
| - /* Check the common values for both RGBA and ARGB */ | |
| - | |
| + printk(KERN_WARNING "checking common"); | |
| if ((var->blue.length != 8) || | |
| (var->green.length != 8) || | |
| (var->red.length != 8) || | |
| (var->transp.length != 8) || | |
| (var->blue.msb_right != 0) || | |
| (var->green.msb_right != 0) || | |
| - (var->red.msb_right != 0)) | |
| + (var->red.msb_right != 0)){ | |
| + printk(KERN_WARNING "common failed"); | |
| return -EINVAL; | |
| - | |
| + } | |
| break; | |
| default: | |
| @@ -1472,25 +1486,35 @@ static int msm_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |
| } | |
| if ((var->xres_virtual <= 0) || (var->yres_virtual <= 0)) | |
| - return -EINVAL; | |
| + {printk(KERN_WARNING "3"); | |
| + return -EINVAL;} | |
| if (info->fix.smem_len < | |
| (var->xres_virtual*var->yres_virtual*(var->bits_per_pixel/8))) | |
| - return -EINVAL; | |
| + {printk(KERN_WARNING "4"); | |
| + return -EINVAL;} | |
| if ((var->xres == 0) || (var->yres == 0)) | |
| - return -EINVAL; | |
| + {printk(KERN_WARNING "5"); | |
| + return -EINVAL;} | |
| if ((var->xres > mfd->panel_info.xres) || | |
| (var->yres > mfd->panel_info.yres)) | |
| - return -EINVAL; | |
| + {printk(KERN_WARNING "6"); | |
| + return -EINVAL;} | |
| if (var->xoffset > (var->xres_virtual - var->xres)) | |
| - return -EINVAL; | |
| - | |
| + {printk(KERN_WARNING "7"); | |
| + return -EINVAL;} | |
| +/* | |
| if (var->yoffset > (var->yres_virtual - var->yres)) | |
| - return -EINVAL; | |
| - | |
| + {printk(KERN_WARNING "8"); | |
| + printk(KERN_WARNING "yoffset: %u",var->yoffset); | |
| + printk(KERN_WARNING "virtual: %u",var->yres_virtual); | |
| + printk(KERN_WARNING "yres: %u",var->yres); | |
| + return -EINVAL;} | |
| +*/ | |
| + printk(KERN_WARNING "return 0"); | |
| return 0; | |
| } | |
| @@ -1521,7 +1545,7 @@ static int msm_fb_set_par(struct fb_info *info) | |
| break; | |
| case 32: | |
| - if (var->transp.offset == 0) | |
| + if (var->transp.offset == 24) | |
| mfd->fb_imgType = MDP_ARGB_8888; | |
| else | |
| mfd->fb_imgType = MDP_RGBA_8888; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment