diff options
author | Ramkumar Radhakrishnan <ramkumar@codeaurora.org> | 2016-03-07 20:15:52 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-03-17 19:09:50 -0700 |
commit | db89d1f64eee19184b824d997772c5994c34442b (patch) | |
tree | 65a572f66c1fbc8cdda447bfce8a074090e6b692 /libgralloc | |
parent | 813ec82a9536f24e39894c720867198e28a3d02d (diff) | |
download | display-db89d1f64eee19184b824d997772c5994c34442b.tar.gz |
libgralloc: Add support for 10 bit RGB/YUV formats.
Add 10 bit RGB/YUV HAL Pixel formats in gralloc library.
CRs-Fixed: 882953
Change-Id: I5c99bbd61d899408d6ff182b11ffb537bbde13c6
Diffstat (limited to 'libgralloc')
-rw-r--r-- | libgralloc/adreno_utils.h | 9 | ||||
-rw-r--r-- | libgralloc/alloc_controller.cpp | 350 | ||||
-rw-r--r-- | libgralloc/gr.h | 4 | ||||
-rw-r--r-- | libgralloc/gralloc_priv.h | 13 |
4 files changed, 223 insertions, 153 deletions
diff --git a/libgralloc/adreno_utils.h b/libgralloc/adreno_utils.h index 31f9d520..8ea7f709 100644 --- a/libgralloc/adreno_utils.h +++ b/libgralloc/adreno_utils.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2015, The Linux Foundation. All rights reserved. +* Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: @@ -26,6 +26,7 @@ typedef enum { ADRENO_PIXELFORMAT_UNKNOWN = 0, + ADRENO_PIXELFORMAT_R10G10B10A2_UNORM = 24, // Vertex, Normalized GL_UNSIGNED_INT_10_10_10_2_OES ADRENO_PIXELFORMAT_R8G8B8A8 = 28, ADRENO_PIXELFORMAT_R8G8B8A8_SRGB = 29, ADRENO_PIXELFORMAT_B5G6R5 = 85, @@ -42,6 +43,10 @@ typedef enum { ADRENO_PIXELFORMAT_A1B5G5R5 = 519, // GL_RGB5_A1 ADRENO_PIXELFORMAT_R8G8B8X8_SRGB = 520, // GL_SRGB8 ADRENO_PIXELFORMAT_R8G8B8_SRGB = 521, // GL_SRGB8 + ADRENO_PIXELFORMAT_A2B10G10R10_UNORM = 532, + // Vertex, Normalized GL_UNSIGNED_INT_10_10_10_2_OES + ADRENO_PIXELFORMAT_R10G10B10X2_UNORM = 537, + // Vertex, Normalized GL_UNSIGNED_INT_10_10_10_2_OES ADRENO_PIXELFORMAT_R5G6B5 = 610, // RGBA version of B5G6R5 ADRENO_PIXELFORMAT_R5G5B5A1 = 611, // RGBA version of B5G5R5A1 ADRENO_PIXELFORMAT_R4G4B4A4 = 612, // RGBA version of B4G4R4A4 @@ -49,5 +54,5 @@ typedef enum { ADRENO_PIXELFORMAT_NV21 = 619, ADRENO_PIXELFORMAT_Y8U8V8A8 = 620, // YUV 4:4:4 packed (1 plane) ADRENO_PIXELFORMAT_Y8 = 625, // Single 8-bit luma only channel YUV format - + ADRENO_PIXELFORMAT_TP10 = 648, } ADRENOPIXELFORMAT; diff --git a/libgralloc/alloc_controller.cpp b/libgralloc/alloc_controller.cpp index 9eb786ee..2eb1adca 100644 --- a/libgralloc/alloc_controller.cpp +++ b/libgralloc/alloc_controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2011 - 2016, The Linux Foundation. All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -77,7 +77,7 @@ using namespace android; ANDROID_SINGLETON_STATIC_INSTANCE(AdrenoMemInfo); -static void getUBwcWidthAndHeight(int, int, int, int&, int&); +static void getYuvUBwcWidthHeight(int, int, int, int&, int&); static unsigned int getUBwcSize(int, int, int, const int, const int); //Common functions @@ -189,7 +189,15 @@ bool isUncompressedRgbFormat(int format) case HAL_PIXEL_FORMAT_RGBA_4444: case HAL_PIXEL_FORMAT_R_8: case HAL_PIXEL_FORMAT_RG_88: - case HAL_PIXEL_FORMAT_BGRX_8888: // Intentional fallthrough + case HAL_PIXEL_FORMAT_BGRX_8888: + case HAL_PIXEL_FORMAT_RGBA_1010102: + case HAL_PIXEL_FORMAT_ARGB_2101010: + case HAL_PIXEL_FORMAT_RGBX_1010102: + case HAL_PIXEL_FORMAT_XRGB_2101010: + case HAL_PIXEL_FORMAT_BGRA_1010102: + case HAL_PIXEL_FORMAT_ABGR_2101010: + case HAL_PIXEL_FORMAT_BGRX_1010102: + case HAL_PIXEL_FORMAT_XBGR_2101010: // Intentional fallthrough is_rgb_format = true; break; default: @@ -208,104 +216,100 @@ void AdrenoMemInfo::getAlignedWidthAndHeight(int width, int height, int format, if (isUncompressedRgbFormat(format) == true) { int tileEnabled = ubwc_enabled || isMacroTileEnabled(format, usage); getGpuAlignedWidthHeight(width, height, format, tileEnabled, aligned_w, aligned_h); - return; - } - - if (ubwc_enabled) { - getUBwcWidthAndHeight(width, height, format, aligned_w, aligned_h); - return; - } - - aligned_w = width; - aligned_h = height; - int alignment = 32; - switch (format) - { - case HAL_PIXEL_FORMAT_YCrCb_420_SP: - case HAL_PIXEL_FORMAT_YCbCr_420_SP: - if (LINK_adreno_get_gpu_pixel_alignment) { - alignment = LINK_adreno_get_gpu_pixel_alignment(); - } - aligned_w = ALIGN(width, alignment); - break; - case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: - aligned_w = ALIGN(width, alignment); - break; - case HAL_PIXEL_FORMAT_RAW16: - aligned_w = ALIGN(width, 16); - break; - case HAL_PIXEL_FORMAT_RAW10: - aligned_w = ALIGN(width * 10 / 8, 8); - break; - case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: - aligned_w = ALIGN(width, 128); - break; - case HAL_PIXEL_FORMAT_YV12: - case HAL_PIXEL_FORMAT_YCbCr_422_SP: - case HAL_PIXEL_FORMAT_YCrCb_422_SP: - case HAL_PIXEL_FORMAT_YCbCr_422_I: - case HAL_PIXEL_FORMAT_YCrCb_422_I: - aligned_w = ALIGN(width, 16); - break; - case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: - case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: - aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width); - aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height); - break; - case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: - aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV21, width); - aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV21, height); - break; - case HAL_PIXEL_FORMAT_BLOB: - break; - case HAL_PIXEL_FORMAT_NV21_ZSL: - aligned_w = ALIGN(width, 64); - aligned_h = ALIGN(height, 64); - break; - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR: - case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: - if(LINK_adreno_compute_compressedfmt_aligned_width_and_height) { - int bytesPerPixel = 0; - int raster_mode = 0; //Adreno unknown raster mode. - int padding_threshold = 512; //Threshold for padding - //surfaces. - - LINK_adreno_compute_compressedfmt_aligned_width_and_height( - width, height, format, 0,raster_mode, padding_threshold, - &aligned_w, &aligned_h, &bytesPerPixel); - } else { - ALOGW("%s: Warning!! Symbols" \ - " compute_compressedfmt_aligned_width_and_height" \ - " not found", __FUNCTION__); - } - break; - default: break; + } else if (ubwc_enabled) { + getYuvUBwcWidthHeight(width, height, format, aligned_w, aligned_h); + } else { + aligned_w = width; + aligned_h = height; + int alignment = 32; + switch (format) + { + case HAL_PIXEL_FORMAT_YCrCb_420_SP: + case HAL_PIXEL_FORMAT_YCbCr_420_SP: + if (LINK_adreno_get_gpu_pixel_alignment) { + alignment = LINK_adreno_get_gpu_pixel_alignment(); + } + aligned_w = ALIGN(width, alignment); + break; + case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: + aligned_w = ALIGN(width, alignment); + break; + case HAL_PIXEL_FORMAT_RAW16: + aligned_w = ALIGN(width, 16); + break; + case HAL_PIXEL_FORMAT_RAW10: + aligned_w = ALIGN(width * 10 / 8, 8); + break; + case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: + aligned_w = ALIGN(width, 128); + break; + case HAL_PIXEL_FORMAT_YV12: + case HAL_PIXEL_FORMAT_YCbCr_422_SP: + case HAL_PIXEL_FORMAT_YCrCb_422_SP: + case HAL_PIXEL_FORMAT_YCbCr_422_I: + case HAL_PIXEL_FORMAT_YCrCb_422_I: + aligned_w = ALIGN(width, 16); + break; + case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: + case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: + aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12, width); + aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height); + break; + case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: + aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV21, width); + aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV21, height); + break; + case HAL_PIXEL_FORMAT_BLOB: + break; + case HAL_PIXEL_FORMAT_NV21_ZSL: + aligned_w = ALIGN(width, 64); + aligned_h = ALIGN(height, 64); + break; + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR: + case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + if(LINK_adreno_compute_compressedfmt_aligned_width_and_height) { + int bytesPerPixel = 0; + int raster_mode = 0; //Adreno unknown raster mode. + int padding_threshold = 512; //Threshold for padding + //surfaces. + + LINK_adreno_compute_compressedfmt_aligned_width_and_height( + width, height, format, 0,raster_mode, padding_threshold, + &aligned_w, &aligned_h, &bytesPerPixel); + } else { + ALOGW("%s: Warning!! Symbols" \ + " compute_compressedfmt_aligned_width_and_height" \ + " not found", __FUNCTION__); + } + break; + default: break; + } } } @@ -391,6 +395,14 @@ ADRENOPIXELFORMAT AdrenoMemInfo::getGpuPixelFormat(int hal_format) case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: return ADRENO_PIXELFORMAT_NV12_EXT; + case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: + return ADRENO_PIXELFORMAT_TP10; + case HAL_PIXEL_FORMAT_RGBA_1010102: + return ADRENO_PIXELFORMAT_R10G10B10A2_UNORM; + case HAL_PIXEL_FORMAT_RGBX_1010102: + return ADRENO_PIXELFORMAT_R10G10B10X2_UNORM; + case HAL_PIXEL_FORMAT_ABGR_2101010: + return ADRENO_PIXELFORMAT_A2B10G10R10_UNORM; default: ALOGE("%s: No map for format: 0x%x", __FUNCTION__, hal_format); break; @@ -550,6 +562,14 @@ unsigned int getSize(int format, int width, int height, int usage, case HAL_PIXEL_FORMAT_RGBA_8888: case HAL_PIXEL_FORMAT_RGBX_8888: case HAL_PIXEL_FORMAT_BGRA_8888: + case HAL_PIXEL_FORMAT_RGBA_1010102: + case HAL_PIXEL_FORMAT_ARGB_2101010: + case HAL_PIXEL_FORMAT_RGBX_1010102: + case HAL_PIXEL_FORMAT_XRGB_2101010: + case HAL_PIXEL_FORMAT_BGRA_1010102: + case HAL_PIXEL_FORMAT_ABGR_2101010: + case HAL_PIXEL_FORMAT_BGRX_1010102: + case HAL_PIXEL_FORMAT_XBGR_2101010: size = alignedw * alignedh * 4; break; case HAL_PIXEL_FORMAT_RGB_888: @@ -706,6 +726,54 @@ void getBufferAttributes(int width, int height, int format, int usage, size = getSize(format, width, height, usage, alignedw, alignedh); } +void getYuvUbwcSPPlaneInfo(private_handle_t* hnd, int color_format, + struct android_ycbcr* ycbcr) +{ + // UBWC buffer has these 4 planes in the following sequence: + // Y_Meta_Plane, Y_Plane, UV_Meta_Plane, UV_Plane + unsigned int y_meta_stride, y_meta_height, y_meta_size; + unsigned int y_stride, y_height, y_size; + unsigned int c_meta_stride, c_meta_height, c_meta_size; + unsigned int alignment = 4096; + int width = hnd->width; + int height = hnd->height; + + y_meta_stride = VENUS_Y_META_STRIDE(color_format, width); + y_meta_height = VENUS_Y_META_SCANLINES(color_format, height); + y_meta_size = ALIGN((y_meta_stride * y_meta_height), alignment); + + y_stride = VENUS_Y_STRIDE(color_format, width); + y_height = VENUS_Y_SCANLINES(color_format, height); + y_size = ALIGN((y_stride * y_height), alignment); + + c_meta_stride = VENUS_UV_META_STRIDE(color_format, width); + c_meta_height = VENUS_UV_META_SCANLINES(color_format, height); + c_meta_size = ALIGN((c_meta_stride * c_meta_height), alignment); + + ycbcr->y = (void*)(hnd->base + y_meta_size); + ycbcr->cb = (void*)(hnd->base + y_meta_size + y_size + c_meta_size); + ycbcr->cr = (void*)(hnd->base + y_meta_size + y_size + + c_meta_size + 1); + ycbcr->ystride = y_stride; + ycbcr->cstride = VENUS_UV_STRIDE(color_format, width); +} + +void getYuvSPPlaneInfo(private_handle_t* hnd, int bpp, + struct android_ycbcr* ycbcr) +{ + int width = hnd->width; + int height = hnd->height; + unsigned int ystride, cstride; + + ystride = cstride = width * bpp; + ycbcr->y = (void*)hnd->base; + ycbcr->cb = (void*)(hnd->base + ystride * height); + ycbcr->cr = (void*)(hnd->base + ystride * height + 1); + ycbcr->ystride = ystride; + ycbcr->cstride = cstride; + ycbcr->chroma_step = 2 * bpp; +} + int getYUVPlaneInfo(private_handle_t* hnd, struct android_ycbcr* ycbcr) { int err = 0; @@ -714,7 +782,6 @@ int getYUVPlaneInfo(private_handle_t* hnd, struct android_ycbcr* ycbcr) int format = hnd->format; unsigned int ystride, cstride; - unsigned int alignment = 4096; memset(ycbcr->reserved, 0, sizeof(ycbcr->reserved)); MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; @@ -744,43 +811,23 @@ int getYUVPlaneInfo(private_handle_t* hnd, struct android_ycbcr* ycbcr) case HAL_PIXEL_FORMAT_YCbCr_422_SP: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: //Same as YCbCr_420_SP_VENUS - ystride = cstride = width; - ycbcr->y = (void*)hnd->base; - ycbcr->cb = (void*)(hnd->base + ystride * height); - ycbcr->cr = (void*)(hnd->base + ystride * height + 1); - ycbcr->ystride = ystride; - ycbcr->cstride = cstride; - ycbcr->chroma_step = 2; + getYuvSPPlaneInfo(hnd, 1, ycbcr); + break; + + case HAL_PIXEL_FORMAT_YCbCr_420_P010: + getYuvSPPlaneInfo(hnd, 2, ycbcr); break; case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: - // NV12_UBWC buffer has these 4 planes in the following sequence: - // Y_Meta_Plane, Y_Plane, UV_Meta_Plane, UV_Plane - unsigned int y_meta_stride, y_meta_height, y_meta_size; - unsigned int y_stride, y_height, y_size; - unsigned int c_meta_stride, c_meta_height, c_meta_size; - - y_meta_stride = VENUS_Y_META_STRIDE(COLOR_FMT_NV12_UBWC, width); - y_meta_height = VENUS_Y_META_SCANLINES(COLOR_FMT_NV12_UBWC, height); - y_meta_size = ALIGN((y_meta_stride * y_meta_height), alignment); - - y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, width); - y_height = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, height); - y_size = ALIGN((y_stride * y_height), alignment); - - c_meta_stride = VENUS_UV_META_STRIDE(COLOR_FMT_NV12_UBWC, width); - c_meta_height = VENUS_UV_META_SCANLINES(COLOR_FMT_NV12_UBWC, height); - c_meta_size = ALIGN((c_meta_stride * c_meta_height), alignment); - - ycbcr->y = (void*)(hnd->base + y_meta_size); - ycbcr->cb = (void*)(hnd->base + y_meta_size + y_size + c_meta_size); - ycbcr->cr = (void*)(hnd->base + y_meta_size + y_size + - c_meta_size + 1); - ycbcr->ystride = y_stride; - ycbcr->cstride = VENUS_UV_STRIDE(COLOR_FMT_NV12_UBWC, width); + getYuvUbwcSPPlaneInfo(hnd, COLOR_FMT_NV12_UBWC, ycbcr); ycbcr->chroma_step = 2; break; + case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: + getYuvUbwcSPPlaneInfo(hnd, COLOR_FMT_NV12_BPP10_UBWC, ycbcr); + ycbcr->chroma_step = 3; + break; + case HAL_PIXEL_FORMAT_YCrCb_420_SP: case HAL_PIXEL_FORMAT_YCrCb_422_SP: case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: @@ -788,13 +835,8 @@ int getYUVPlaneInfo(private_handle_t* hnd, struct android_ycbcr* ycbcr) case HAL_PIXEL_FORMAT_NV21_ZSL: case HAL_PIXEL_FORMAT_RAW16: case HAL_PIXEL_FORMAT_RAW10: - ystride = cstride = width; - ycbcr->y = (void*)hnd->base; - ycbcr->cr = (void*)(hnd->base + ystride * height); - ycbcr->cb = (void*)(hnd->base + ystride * height + 1); - ycbcr->ystride = ystride; - ycbcr->cstride = cstride; - ycbcr->chroma_step = 2; + getYuvSPPlaneInfo(hnd, 1, ycbcr); + std::swap(ycbcr->cb, ycbcr->cr); break; //Planar @@ -882,6 +924,7 @@ static bool isUBwcFormat(int format) switch(format) { case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: + case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: return true; default: return false; @@ -898,6 +941,8 @@ static bool isUBwcSupported(int format) case HAL_PIXEL_FORMAT_RGBX_8888: case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: + case HAL_PIXEL_FORMAT_RGBA_1010102: + case HAL_PIXEL_FORMAT_RGBX_1010102: return true; default: return false; @@ -933,7 +978,7 @@ bool isUBwcEnabled(int format, int usage) return false; } -static void getUBwcWidthAndHeight(int width, int height, int format, +static void getYuvUBwcWidthHeight(int width, int height, int format, int& aligned_w, int& aligned_h) { switch (format) @@ -944,6 +989,10 @@ static void getUBwcWidthAndHeight(int width, int height, int format, aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12_UBWC, width); aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_UBWC, height); break; + case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: + aligned_w = VENUS_Y_STRIDE(COLOR_FMT_NV12_BPP10_UBWC, width); + aligned_h = VENUS_Y_SCANLINES(COLOR_FMT_NV12_BPP10_UBWC, height); + break; default: ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format); aligned_w = 0; @@ -952,7 +1001,7 @@ static void getUBwcWidthAndHeight(int width, int height, int format, } } -static void getUBwcBlockSize(int bpp, int& block_width, int& block_height) +static void getRgbUBwcBlockSize(int bpp, int& block_width, int& block_height) { block_width = 0; block_height = 0; @@ -978,13 +1027,13 @@ static void getUBwcBlockSize(int bpp, int& block_width, int& block_height) } } -static unsigned int getUBwcMetaBufferSize(int width, int height, int bpp) +static unsigned int getRgbUBwcMetaBufferSize(int width, int height, int bpp) { unsigned int size = 0; int meta_width, meta_height; int block_width, block_height; - getUBwcBlockSize(bpp, block_width, block_height); + getRgbUBwcBlockSize(bpp, block_width, block_height); if (!block_width || !block_height) { ALOGE("%s: Unsupported bpp: %d", __FUNCTION__, bpp); @@ -1009,18 +1058,23 @@ static unsigned int getUBwcSize(int width, int height, int format, switch (format) { case HAL_PIXEL_FORMAT_BGR_565: size = alignedw * alignedh * 2; - size += getUBwcMetaBufferSize(width, height, 2); + size += getRgbUBwcMetaBufferSize(width, height, 2); break; case HAL_PIXEL_FORMAT_RGBA_8888: case HAL_PIXEL_FORMAT_RGBX_8888: + case HAL_PIXEL_FORMAT_RGBA_1010102: + case HAL_PIXEL_FORMAT_RGBX_1010102: size = alignedw * alignedh * 4; - size += getUBwcMetaBufferSize(width, height, 4); + size += getRgbUBwcMetaBufferSize(width, height, 4); break; case HAL_PIXEL_FORMAT_NV12_ENCODEABLE: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS: case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_UBWC, width, height); break; + case HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC: + size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12_BPP10_UBWC, width, height); + break; default: ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__, format); break; @@ -1046,11 +1100,11 @@ int getRgbDataAddress(private_handle_t* hnd, void** rgb_data) unsigned int meta_size = 0; switch (hnd->format) { case HAL_PIXEL_FORMAT_BGR_565: - meta_size = getUBwcMetaBufferSize(hnd->width, hnd->height, 2); + meta_size = getRgbUBwcMetaBufferSize(hnd->width, hnd->height, 2); break; case HAL_PIXEL_FORMAT_RGBA_8888: case HAL_PIXEL_FORMAT_RGBX_8888: - meta_size = getUBwcMetaBufferSize(hnd->width, hnd->height, 4); + meta_size = getRgbUBwcMetaBufferSize(hnd->width, hnd->height, 4); break; default: ALOGE("%s:Unsupported RGB format: 0x%x", __FUNCTION__, hnd->format); diff --git a/libgralloc/gr.h b/libgralloc/gr.h index 1b8d9b4a..bb1f6ddc 100644 --- a/libgralloc/gr.h +++ b/libgralloc/gr.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2008 The Android Open Source Project - * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. + * Copyright (c) 2011 - 2016, The Linux Foundation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -76,7 +76,7 @@ int getRgbDataAddress(private_handle_t* pHnd, void** rgb_data); // To query if UBWC is enabled, based on format and usage flags bool isUBwcEnabled(int format, int usage); -// Function to check if the format is an uncompressed RGB format +// Function to check if the format is an RGB format bool isUncompressedRgbFormat(int format); /*****************************************************************************/ diff --git a/libgralloc/gralloc_priv.h b/libgralloc/gralloc_priv.h index 7a5fc845..613c0669 100644 --- a/libgralloc/gralloc_priv.h +++ b/libgralloc/gralloc_priv.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2008 The Android Open Source Project - * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2011 - 2016, The Linux Foundation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,6 +109,17 @@ #define HAL_PIXEL_FORMAT_NV21_ZSL 0x113 #define HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS 0x114 #define HAL_PIXEL_FORMAT_BGR_565 0x115 +#define HAL_PIXEL_FORMAT_RGBA_1010102 0x116 +#define HAL_PIXEL_FORMAT_ARGB_2101010 0x117 +#define HAL_PIXEL_FORMAT_RGBX_1010102 0x118 +#define HAL_PIXEL_FORMAT_XRGB_2101010 0x119 +#define HAL_PIXEL_FORMAT_BGRA_1010102 0x11A +#define HAL_PIXEL_FORMAT_ABGR_2101010 0x11B +#define HAL_PIXEL_FORMAT_BGRX_1010102 0x11C +#define HAL_PIXEL_FORMAT_XBGR_2101010 0x11D +#define HAL_PIXEL_FORMAT_YCbCr_420_P010 0x11F +#define HAL_PIXEL_FORMAT_YCbCr_420_TP10_UBWC 0x120 + #define HAL_PIXEL_FORMAT_INTERLACE 0x180 //v4l2_fourcc('Y', 'U', 'Y', 'L'). 24 bpp YUYV 4:2:2 10 bit per component |