From 532c859ed05ae075c481d0b7448d9472090ff431 Mon Sep 17 00:00:00 2001 From: ST-Ericsson Date: Mon, 20 Aug 2012 16:59:37 +0200 Subject: Support for graphics hardware on Snowball for JB. Change-Id: I47ad6dd695636536520590ed6eb791fe9289ffd7 Signed-off-by: Patrik Ryd Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/70899 --- include/hardware/copybit.h | 258 ++++++++++++++++++++++++++++++++++++++++++ include/hardware/fb.h | 35 ++++++ include/hardware/hwcomposer.h | 25 ++++ 3 files changed, 318 insertions(+) create mode 100644 include/hardware/copybit.h diff --git a/include/hardware/copybit.h b/include/hardware/copybit.h new file mode 100644 index 00000000..ded8baa4 --- /dev/null +++ b/include/hardware/copybit.h @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_COPYBIT_INTERFACE_H +#define ANDROID_COPYBIT_INTERFACE_H + +#ifdef TARGET_BOARD_SNOWBALL +#include + +#include +#include +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define COPYBIT_HARDWARE_MODULE_ID "copybit" + +/** + * Name of the graphics device to open + */ +#define COPYBIT_HARDWARE_COPYBIT0 "copybit0" + +/* supported pixel-formats. these must be compatible with + * graphics/PixelFormat.java, ui/PixelFormat.h, pixelflinger/format.h + */ +enum { + COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, + COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, + COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, + COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, + COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, + COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551, + COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444, + COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP, + COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP, + COPYBIT_FORMAT_YCbCr_422_P = HAL_PIXEL_FORMAT_YCbCr_422_P, + COPYBIT_FORMAT_YCbCr_420_P = HAL_PIXEL_FORMAT_YCbCr_420_P, + COPYBIT_FORMAT_YCrCb_422_SP = HAL_PIXEL_FORMAT_YCrCb_422_SP, + COPYBIT_FORMAT_YCrCb_420_SP = HAL_PIXEL_FORMAT_YCrCb_420_SP, + COPYBIT_FORMAT_YCrCb_422_P = HAL_PIXEL_FORMAT_YCrCb_422_P, + COPYBIT_FORMAT_YCrCb_420_P = HAL_PIXEL_FORMAT_YCrCb_420_P, + /* STE: Added Support for YUV42XMBN, required for Copybit CC acceleration */ + COPYBIT_FORMAT_YCBCR42XMBN = HAL_PIXEL_FORMAT_YCBCR42XMBN, + /* STE: Added for YCbCr422R -> RGB888 use-case */ + COPYBIT_FORMAT_YCbCr_422_I = HAL_PIXEL_FORMAT_YCbCr_422_I, +}; + +/* name for copybit_set_parameter */ +enum { + /* rotation of the source image in degrees (0 to 359) */ + COPYBIT_ROTATION_DEG = 1, + /* plane alpha value */ + COPYBIT_PLANE_ALPHA = 2, + /* enable or disable dithering */ + COPYBIT_DITHER = 3, + /* transformation applied (this is a superset of COPYBIT_ROTATION_DEG) */ + COPYBIT_TRANSFORM = 4, + /* blurs the copied bitmap. The amount of blurring cannot be changed + * at this time. */ + COPYBIT_BLUR = 5 +}; + +/* values for copybit_set_parameter(COPYBIT_TRANSFORM) */ +enum { + /* flip source image horizontally */ + COPYBIT_TRANSFORM_FLIP_H = HAL_TRANSFORM_FLIP_H, + /* flip source image vertically */ + COPYBIT_TRANSFORM_FLIP_V = HAL_TRANSFORM_FLIP_V, + /* rotate source image 90 degres */ + COPYBIT_TRANSFORM_ROT_90 = HAL_TRANSFORM_ROT_90, + /* rotate source image 180 degres */ + COPYBIT_TRANSFORM_ROT_180 = HAL_TRANSFORM_ROT_180, + /* rotate source image 270 degres */ + COPYBIT_TRANSFORM_ROT_270 = HAL_TRANSFORM_ROT_270, +}; + +/* enable/disable value copybit_set_parameter */ +enum { + COPYBIT_DISABLE = 0, + COPYBIT_ENABLE = 1 +}; + +/* use get_static_info() to query static informations about the hardware */ +enum { + /* Maximum amount of minification supported by the hardware*/ + COPYBIT_MINIFICATION_LIMIT = 1, + /* Maximum amount of magnification supported by the hardware */ + COPYBIT_MAGNIFICATION_LIMIT = 2, + /* Number of fractional bits support by the scaling engine */ + COPYBIT_SCALING_FRAC_BITS = 3, + /* Supported rotation step in degres. */ + COPYBIT_ROTATION_STEP_DEG = 4, +}; + +/* Image structure */ +struct copybit_image_t { + /* width */ + uint32_t w; + /* height */ + uint32_t h; + /* format COPYBIT_FORMAT_xxx */ + int32_t format; + /* base of buffer with image */ + void *base; + /* handle to the image */ + native_handle_t* handle; +}; + +/* Rectangle */ +struct copybit_rect_t { + /* left */ + int l; + /* top */ + int t; + /* right */ + int r; + /* bottom */ + int b; +}; + +/* Color (components in range 0-255) */ +struct copybit_color_t { + /* Red */ + uint8_t r; + /* Green */ + uint8_t g; + /* Blue */ + uint8_t b; + /* Alpha */ + uint8_t a; +}; + +/* Region */ +struct copybit_region_t { + int (*next)(struct copybit_region_t const *region, struct copybit_rect_t *rect); +}; + +/** + * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM + * and the fields of this data structure must begin with hw_module_t + * followed by module specific information. + */ +struct copybit_module_t { + struct hw_module_t common; +}; + +/** + * Every device data structure must begin with hw_device_t + * followed by module specific public methods and attributes. + */ +struct copybit_device_t { + struct hw_device_t common; + + /** + * Set a copybit parameter. + * + * @param dev from open + * @param name one for the COPYBIT_NAME_xxx + * @param value one of the COPYBIT_VALUE_xxx + * + * @return 0 if successful + */ + int (*set_parameter)(struct copybit_device_t *dev, int name, int value); + + /** + * Get a static copybit information. + * + * @param dev from open + * @param name one of the COPYBIT_STATIC_xxx + * + * @return value or -EINVAL if error + */ + int (*get)(struct copybit_device_t *dev, int name); + + /** + * Execute the bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param region the clip region + * + * @return 0 if successful + */ + int (*blit)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_region_t const *region); + + /** + * Execute the stretch bit blit copy operation + * + * @param dev from open + * @param dst is the destination image + * @param src is the source image + * @param dst_rect is the destination rectangle + * @param src_rect is the source rectangle + * @param region the clip region + * + * @return 0 if successful + */ + int (*stretch)(struct copybit_device_t *dev, + struct copybit_image_t const *dst, + struct copybit_image_t const *src, + struct copybit_rect_t const *dst_rect, + struct copybit_rect_t const *src_rect, + struct copybit_region_t const *region); + + /** + * Execute the fill bit blit operation + * + * @param dev from open + * @param dst is the destination image + * @param rect is the destination rectangle + * @param color is the fill color + * @param region the clip region + */ + int (*fill)(struct copybit_device_t *dev, + struct copybit_image_t *dst, + struct copybit_rect_t *rect, + struct copybit_color_t *color, + struct copybit_region_t *region); +}; + + +/** convenience API for opening and closing a device */ + +static inline int copybit_open(const struct hw_module_t* module, + struct copybit_device_t** device) { + return module->methods->open(module, + COPYBIT_HARDWARE_COPYBIT0, (struct hw_device_t**)device); +} + +static inline int copybit_close(struct copybit_device_t* device) { + return device->common.close(&device->common); +} + + +__END_DECLS + +#endif +#endif // ANDROID_COPYBIT_INTERFACE_H diff --git a/include/hardware/fb.h b/include/hardware/fb.h index 135e4aa3..7205f3de 100644 --- a/include/hardware/fb.h +++ b/include/hardware/fb.h @@ -42,18 +42,32 @@ typedef struct framebuffer_device_t { const uint32_t flags; /* dimensions of the framebuffer in pixels */ +#ifdef TARGET_BOARD_SNOWBALL + uint32_t width; + uint32_t height; +#else const uint32_t width; const uint32_t height; +#endif /* frambuffer stride in pixels */ +#ifdef TARGET_BOARD_SNOWBALL + int stride; +#else const int stride; +#endif /* framebuffer pixel format */ const int format; /* resolution of the framebuffer's display panel in pixel per inch*/ +#ifdef TARGET_BOARD_SNOWBALL + float xdpi; + float ydpi; +#else const float xdpi; const float ydpi; +#endif /* framebuffer's display panel refresh rate in frames per second */ const float fps; @@ -144,6 +158,27 @@ typedef struct framebuffer_device_t { */ int (*enableScreen)(struct framebuffer_device_t* dev, int enable); +#ifdef TARGET_BOARD_SNOWBALL + /* + * Sets the number of degrees ccw the framebuffer shall be rotated before + * being sent to the display. This call may change the framebuffer's + * dimensions. + */ + int (*rotate)(struct framebuffer_device_t* dev, unsigned int absolute_degree); + + /* + * Informs gralloc about the UI rotation. This is needed in the mirroring use + * case to get the correct orientation on the external device, e.g. HDMI. + */ + void (*UIRotationChange)(struct framebuffer_device_t* dev, int uiRotation); + + /* + * Enables the mirroring of the main display content to an external device, + * e.g. HDMI. + */ + void (*enableHDMIMirroring)(struct framebuffer_device_t* dev, int enable); +#endif + void* reserved_proc[6]; } framebuffer_device_t; diff --git a/include/hardware/hwcomposer.h b/include/hardware/hwcomposer.h index c30ef33b..121ed563 100644 --- a/include/hardware/hwcomposer.h +++ b/include/hardware/hwcomposer.h @@ -372,6 +372,20 @@ typedef struct hwc_module { struct hw_module_t common; } hwc_module_t; +#ifdef TARGET_BOARD_SNOWBALL +/* + * names for setParameter() + */ +enum { + /* Specifies the UI orientation */ + HWC_UI_ORIENTATION = 0x00000000, + /* Specifies if hardware rotation is used */ + HWC_HARDWARE_ROTATION = 0x00000001, + /* Set the hdmi plug status */ + HWC_HDMI_PLUGGED = 0x00000002, +}; +#endif + typedef struct hwc_composer_device_1 { struct hw_device_t common; @@ -561,6 +575,17 @@ typedef struct hwc_composer_device_1 { * Reserved for future use. Must be NULL. */ void* reserved_proc[4]; +#ifdef TARGET_BOARD_SNOWBALL + /* + * This hook is vendor specific and optional. + * + * (*setParameter)() makes the hardware composer aware of the system state, + * e.g. hdmi plug status and ui rotation, so that it can make intelligent + * decisions on how to handle composed surfaces and cloning in the kernel. + */ + int (*setParameter)(struct hwc_composer_device* dev, + int param, int value); +#endif } hwc_composer_device_1_t; -- cgit v1.2.3