X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=msm.c;h=fac1fd06d7df714face75d6a7ae987ef4548973e;hb=041cb9f1a760c85318a27622118526dd5bffd019;hp=dbc5b7032a679e81bc6506d7146dbce760456ee3;hpb=e5c3fdf746e89d91abcde3bac2c4bb5f0f56a427;p=android-x86%2Fexternal-minigbm.git diff --git a/msm.c b/msm.c index dbc5b70..fac1fd0 100644 --- a/msm.c +++ b/msm.c @@ -105,8 +105,11 @@ static void msm_calculate_layout(struct bo *bo) uint32_t stride, alignw, alignh; alignw = ALIGN(width, DEFAULT_ALIGNMENT); - /* HAL_PIXEL_FORMAT_YV12 requires that the buffer's height not be aligned. */ - if (bo->meta.format == DRM_FORMAT_YVU420_ANDROID) { + /* HAL_PIXEL_FORMAT_YV12 requires that the buffer's height not be aligned. + DRM_FORMAT_R8 of height one is used for JPEG camera output, so don't + height align that. */ + if (bo->meta.format == DRM_FORMAT_YVU420_ANDROID || + (bo->meta.format == DRM_FORMAT_R8 && height == 1)) { alignh = height; } else { alignh = ALIGN(height, DEFAULT_ALIGNMENT); @@ -157,7 +160,7 @@ static void msm_add_ubwc_combinations(struct driver *drv, const uint32_t *format static int msm_init(struct driver *drv) { struct format_metadata metadata; - uint64_t render_use_flags = BO_USE_RENDER_MASK; + uint64_t render_use_flags = BO_USE_RENDER_MASK | BO_USE_SCANOUT; uint64_t texture_use_flags = BO_USE_TEXTURE_MASK | BO_USE_HW_VIDEO_DECODER; uint64_t sw_flags = (BO_USE_RENDERSCRIPT | BO_USE_SW_WRITE_OFTEN | BO_USE_SW_READ_OFTEN | BO_USE_LINEAR | BO_USE_PROTECTED); @@ -175,6 +178,16 @@ static int msm_init(struct driver *drv) drv_modify_combination(drv, DRM_FORMAT_YVU420, &LINEAR_METADATA, BO_USE_HW_VIDEO_ENCODER); drv_modify_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA, BO_USE_HW_VIDEO_ENCODER); + /* The camera stack standardizes on NV12 for YUV buffers. */ + drv_modify_combination(drv, DRM_FORMAT_NV12, &LINEAR_METADATA, + BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_SCANOUT); + /* + * R8 format is used for Android's HAL_PIXEL_FORMAT_BLOB and is used for JPEG snapshots + * from camera. + */ + drv_modify_combination(drv, DRM_FORMAT_R8, &LINEAR_METADATA, + BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE); + /* Android CTS tests require this. */ drv_add_combination(drv, DRM_FORMAT_BGR888, &LINEAR_METADATA, BO_USE_SW_MASK); @@ -188,10 +201,10 @@ static int msm_init(struct driver *drv) texture_use_flags &= ~sw_flags; msm_add_ubwc_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats), - &metadata, render_use_flags | BO_USE_SCANOUT); + &metadata, render_use_flags); msm_add_ubwc_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats), - &metadata, texture_use_flags | BO_USE_SCANOUT); + &metadata, texture_use_flags); return 0; } @@ -276,6 +289,16 @@ static void *msm_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t m req.offset); } +static uint32_t msm_resolve_format(struct driver *drv, uint32_t format, uint64_t use_flags) +{ + switch (format) { + case DRM_FORMAT_FLEX_YCbCr_420_888: + return DRM_FORMAT_NV12; + default: + return format; + } +} + const struct backend backend_msm = { .name = "msm", .init = msm_init, @@ -285,5 +308,6 @@ const struct backend backend_msm = { .bo_import = drv_prime_bo_import, .bo_map = msm_bo_map, .bo_unmap = drv_bo_munmap, + .resolve_format = msm_resolve_format, }; #endif /* DRV_MSM */