libcopybit: Add copybit and copybit_c2d changes from Gingerbread
Change-Id: I39ccc7579f89d08eae809b47e434601aee6973a2
This commit is contained in:
		| @@ -17,26 +17,51 @@ LOCAL_PATH:= $(call my-dir) | ||||
| # HAL module implemenation, not prelinked and stored in | ||||
| # hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.so | ||||
|  | ||||
| ifeq ($(TARGET_BOARD_PLATFORM),msm7k) | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_PRELINK_MODULE := false | ||||
| LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw | ||||
| LOCAL_SHARED_LIBRARIES := liblog | ||||
| LOCAL_SRC_FILES := copybit.cpp | ||||
| LOCAL_MODULE := copybit.msm7k | ||||
| LOCAL_C_INCLUDES += hardware/msm7k/libgralloc | ||||
| LOCAL_CFLAGS += -DCOPYBIT_MSM7K=1 | ||||
| include $(BUILD_SHARED_LIBRARY) | ||||
| endif | ||||
| ifeq ($(TARGET_USES_C2D_COMPOSITION),true) | ||||
|     include $(CLEAR_VARS) | ||||
|     LOCAL_PRELINK_MODULE := false | ||||
|     LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw | ||||
|     LOCAL_SHARED_LIBRARIES := liblog libdl | ||||
|     LOCAL_SRC_FILES := copybit_c2d.cpp | ||||
|     LOCAL_MODULE := copybit.$(TARGET_BOARD_PLATFORM) | ||||
|     LOCAL_C_INCLUDES += hardware/msm7k/libgralloc-qsd8k | ||||
|     LOCAL_CFLAGS += -DCOPYBIT_Z180=1 -DC2D_SUPPORT_DISPLAY=1 | ||||
|     include $(BUILD_SHARED_LIBRARY) | ||||
| else | ||||
|     ifneq "$(findstring msm7630,$(TARGET_PRODUCT))" "msm7630" | ||||
|         ifeq ($(TARGET_BOARD_PLATFORM),msm7k) | ||||
|             include $(CLEAR_VARS) | ||||
|             ifeq ($(TARGET_GRALLOC_USES_ASHMEM),true) | ||||
|                 LOCAL_CFLAGS += -DUSE_ASHMEM | ||||
|                 ifeq "$(findstring msm7627,$(TARGET_PRODUCT))" "msm7627" | ||||
|                    LOCAL_CFLAGS += -DTARGET_7x27 | ||||
|                 endif | ||||
|             endif | ||||
|  | ||||
| ifeq ($(TARGET_BOARD_PLATFORM),qsd8k) | ||||
| include $(CLEAR_VARS) | ||||
| LOCAL_PRELINK_MODULE := false | ||||
| LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw | ||||
| LOCAL_SHARED_LIBRARIES := liblog | ||||
| LOCAL_SRC_FILES := copybit.cpp | ||||
| LOCAL_MODULE := copybit.qsd8k | ||||
| LOCAL_C_INCLUDES += hardware/libhardware/modules/gralloc | ||||
| LOCAL_CFLAGS += -DCOPYBIT_QSD8K=1 | ||||
| include $(BUILD_SHARED_LIBRARY) | ||||
|             LOCAL_PRELINK_MODULE := false | ||||
|             LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw | ||||
|             LOCAL_SHARED_LIBRARIES := liblog | ||||
|             LOCAL_SRC_FILES := copybit.cpp | ||||
|             LOCAL_MODULE := copybit.msm7k | ||||
|             LOCAL_C_INCLUDES += hardware/msm7k/libgralloc-qsd8k | ||||
|             LOCAL_CFLAGS += -DCOPYBIT_MSM7K=1 | ||||
|             include $(BUILD_SHARED_LIBRARY) | ||||
|         endif | ||||
|  | ||||
|         ifeq ($(TARGET_BOARD_PLATFORM),qsd8k) | ||||
|             include $(CLEAR_VARS) | ||||
|             ifeq ($(TARGET_GRALLOC_USES_ASHMEM),true) | ||||
|                 LOCAL_CFLAGS += -DUSE_ASHMEM | ||||
|             endif | ||||
|  | ||||
|             LOCAL_PRELINK_MODULE := false | ||||
|             LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw | ||||
|             LOCAL_SHARED_LIBRARIES := liblog | ||||
|             LOCAL_SRC_FILES := copybit.cpp | ||||
|             LOCAL_MODULE := copybit.qsd8k | ||||
|             LOCAL_C_INCLUDES += hardware/msm7k/libgralloc-qsd8k | ||||
|             LOCAL_CFLAGS += -DCOPYBIT_QSD8K=1 | ||||
|             include $(BUILD_SHARED_LIBRARY) | ||||
|         endif | ||||
|     endif | ||||
| endif | ||||
|   | ||||
							
								
								
									
										618
									
								
								libcopybit/c2d2.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										618
									
								
								libcopybit/c2d2.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,618 @@ | ||||
| /* Copyright (c) 2010, Code Aurora Forum. All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are | ||||
|  * met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *       notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above | ||||
|  *       copyright notice, this list of conditions and the following | ||||
|  *       disclaimer in the documentation and/or other materials provided | ||||
|  *       with the distribution. | ||||
|  *     * Neither the name of Code Aurora Forum, Inc. nor the names of its | ||||
|  *       contributors may be used to endorse or promote products derived | ||||
|  *       from this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED | ||||
|  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS | ||||
|  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||||
|  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||||
|  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||||
|  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||||
|  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  */ | ||||
| #ifndef __c2d2_h_ | ||||
| #define __c2d2_h_ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include <EGL/egl.h> /* for EGL surfaces */ | ||||
|  | ||||
| #ifndef C2D_API | ||||
| #define C2D_API /* define API export as needed */ | ||||
| #endif | ||||
| #ifndef int32 | ||||
| typedef int                     int32; | ||||
| #endif | ||||
| #ifndef uint32 | ||||
| typedef unsigned int            uint32; | ||||
| #endif | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /*********************** Blit definitions *****************************/ | ||||
| /*****************************************************************************/ | ||||
|  | ||||
| /* Status codes, returned by any blit function */ | ||||
| typedef enum { | ||||
|     C2D_STATUS_OK              = 0, | ||||
|     C2D_STATUS_NOT_SUPPORTED   = 1, | ||||
|     C2D_STATUS_OUT_OF_MEMORY   = 2, | ||||
|     C2D_STATUS_INVALID_PARAM   = 3, | ||||
|     C2D_STATUS_SURFACE_IN_USE  = 4, | ||||
| } C2D_STATUS; | ||||
|  | ||||
|  | ||||
| /* Definitions of color format modes, used together with color formats */ | ||||
| typedef enum { | ||||
|     C2D_FORMAT_PACK_INTO_32BIT   = (1 <<  8), /* pack into dword if set */ | ||||
|     C2D_FORMAT_SWAP_ENDIANNESS   = (1 <<  9), /* swaps the order */ | ||||
|     C2D_FORMAT_LINEAR_SPACE      = (1 << 10), /* linear color space */ | ||||
|     C2D_FORMAT_PREMULTIPLIED     = (1 << 11), /* alpha premultiplied */ | ||||
|     C2D_FORMAT_INVERT_ALPHA      = (1 << 12), /* inverts alpha */ | ||||
|     C2D_FORMAT_DISABLE_ALPHA     = (1 << 13), /* disables alpha */ | ||||
|     C2D_FORMAT_INTERLACED        = (1 << 14), /* YUV line-interlaced */ | ||||
|     C2D_FORMAT_TRANSPARENT       = (1 << 15), /* YUV 1-bit alpha in Y */ | ||||
|     C2D_FORMAT_MACROTILED        = (1 << 16), /* tiled in macro level */ | ||||
|     C2D_FORMAT_TILED_4x4         = (1 << 17), /* 4x4 tiled format */ | ||||
|     C2D_FORMAT_SWAP_RB           = (1 << 18), /* Swap R & B color components */ | ||||
| } C2D_FORMAT_MODE; | ||||
|  | ||||
| /* Definitions of supported RGB formats, used in C2D_RGB_SURFACE_DEF. | ||||
|  * The bits of each color channel are packed into a machine word | ||||
|  * representing a single pixel from left to right (MSB to LSB) in the | ||||
|  * order indicated by format name. For the sub-byte formats the pixels | ||||
|  * are packed into bytes from left to right (MSbit to LSBit). | ||||
|  * If the C2D_FORMAT_PACK_INTO_32BIT bit is set, the minimal | ||||
|  * machine word used for pixel storage is 32-bit and the whole word | ||||
|  * is reversed if endianness is swapped. | ||||
|  * If the C2D_FORMAT_SWAP_ENDIANNESS bit is set, the order within a | ||||
|  * minimal machine word representing a pixel | ||||
|  * is reversed for both sub-byte and multi-byte formats. | ||||
|  * If the C2D_FORMAT_LINEAR_SPACE bit is set, the color space of | ||||
|  * the formats below is considered linear, if applicable. | ||||
|  * If the C2D_FORMAT_PREMULTIPLIED bit is set, the color channels | ||||
|  * are premultiplied with the alpha, if applicable. | ||||
|  * If the C2D_FORMAT_INVERT_ALPHA bit is set, the alpha interpretation | ||||
|  * is inverted: 0 - opaque, 1 - transparent, if applicable. | ||||
|  * If the C2D_FORMAT_DISABLE_ALPHA bit is set, the alpha channel serves | ||||
|  * as a placeholder and is ignored during blit, if applicable. | ||||
|  * If the COMP_FORMAT_MACROTILED bit is set, the surface is in the | ||||
|  * tiled format : 64x32 for 8bpp, 32x32 for 16bpp formats  */ | ||||
| typedef enum { | ||||
|     C2D_COLOR_FORMAT_1            = 0,   /* 1-bit alpha/color expansion */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_2_PALETTE    = 1,   /* 2-bit indices for palette */ | ||||
|     C2D_COLOR_FORMAT_4_PALETTE    = 2,   /* 4-bit indices for palette */ | ||||
|     C2D_COLOR_FORMAT_8_PALETTE    = 3,   /* 8-bit indices for palette */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_2_L          = 4,   /* 2-bit grayscale */ | ||||
|     C2D_COLOR_FORMAT_4_L          = 5,   /* 4-bit grayscale */ | ||||
|     C2D_COLOR_FORMAT_8_L          = 6,   /* 8-bit grayscale */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_2_A          = 7,   /* 2-bit alpha only */ | ||||
|     C2D_COLOR_FORMAT_4_A          = 8,   /* 4-bit alpha only */ | ||||
|     C2D_COLOR_FORMAT_8_A          = 9,   /* 8-bit alpha only */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_444_RGB      = 10,  /* 12-bit colors */ | ||||
|     C2D_COLOR_FORMAT_565_RGB      = 11,  /* 16-bit colors */ | ||||
|     C2D_COLOR_FORMAT_888_RGB      = 12,  /* 24-bit colors */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_1555_ARGB    = 13,  /* 16-bit colors (1-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_4444_ARGB    = 14,  /* 16-bit colors (4-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_8565_ARGB    = 15,  /* 24-bit colors (8-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_8888_ARGB    = 16,  /* 32-bit colors (8-bit alpha) */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_5551_RGBA    = 17,  /* 16-bit colors (1-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_4444_RGBA    = 18,  /* 16-bit colors (4-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_5658_RGBA    = 19,  /* 24-bit colors (8-bit alpha) */ | ||||
|     C2D_COLOR_FORMAT_8888_RGBA    = 20,  /* 32-bit colors (8-bit alpha) */ | ||||
|  | ||||
|     /* derived RGB color formats (base format + mode bits) */ | ||||
|  | ||||
| } C2D_RGB_FORMAT; | ||||
|  | ||||
| /* Definitions of supported YUV formats, used in C2D_YUV_SURFACE_DEF. | ||||
|  * Each of Y,U,V channels usually takes 1 byte and therefore is | ||||
|  * individually addressable. The definitions below show how Y,U,V | ||||
|  * channels are packed into macropixels for each particular format. | ||||
|  * The order is from left (smaller byte addresses) to right (larger | ||||
|  * byte addresses). The first three digits (4xx) denote the chroma | ||||
|  * subsampling in standard YUV notation. The digits in the macropixel | ||||
|  * denote that the whole block (from the previous digit or from the | ||||
|  * beginning) has to be repeated the number of times. Underscores | ||||
|  * between Y,U,V channels are used to describe separate planes for | ||||
|  * planar YUV formats. Formats are mapped to numbers so that future | ||||
|  * versions with various YUV permutations are easy to add. | ||||
|  * If the C2D_FORMAT_INTERLACED bit is set, the line order is | ||||
|  * interlaced: 0,2,4,...1,3,5... if applicable. | ||||
|  * If the C2D_FORMAT_TRANSPARENT bit is set, the least significant | ||||
|  * bit of Y channel serves as alpha: 0 - transparent, 1 - opaque. */ | ||||
| typedef enum { | ||||
|     C2D_COLOR_FORMAT_411_YYUYYV   = 110, /* packed, 12-bit         */ | ||||
|     C2D_COLOR_FORMAT_411_YUYYVY   = 111, /* packed, 12-bit         */ | ||||
|     C2D_COLOR_FORMAT_411_UYYVYY   = 112, /* packed, 12-bit, "Y411" */ | ||||
|     C2D_COLOR_FORMAT_411_YUYV2Y4  = 116, /* packed, 12-bit         */ | ||||
|     C2D_COLOR_FORMAT_411_UYVY2Y4  = 117, /* packed, 12-bit, "Y41P" */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_422_YUYV     = 120, /* packed, 16-bit, "YUY2" */ | ||||
|     C2D_COLOR_FORMAT_422_UYVY     = 121, /* packed, 16-bit, "UYVY" */ | ||||
|     C2D_COLOR_FORMAT_422_YVYU     = 122, /* packed, 16-bit, "YVYU" */ | ||||
|     C2D_COLOR_FORMAT_422_VYUY     = 123, /* packed, 16-bit         */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_444_YUV      = 130, /* packed, 24-bit         */ | ||||
|     C2D_COLOR_FORMAT_444_UYV      = 131, /* packed, 24-bit, "IYU2" */ | ||||
|     C2D_COLOR_FORMAT_444_AYUV     = 136, /* packed, 24-bit, "AYUV" */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_410_Y_UV     = 150, /* planar, Y + interleaved UV */ | ||||
|     C2D_COLOR_FORMAT_411_Y_UV     = 151, /* planar, Y + interleaved UV */ | ||||
|     C2D_COLOR_FORMAT_420_Y_UV     = 152, /* planar, Y + interleaved UV */ | ||||
|     C2D_COLOR_FORMAT_422_Y_UV     = 153, /* planar, Y + interleaved UV */ | ||||
|     C2D_COLOR_FORMAT_444_Y_UV     = 154, /* planar, Y + interleaved UV */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_410_Y_VU     = 160, /* planar, Y + interleaved VU */ | ||||
|     C2D_COLOR_FORMAT_411_Y_VU     = 161, /* planar, Y + interleaved VU */ | ||||
|     C2D_COLOR_FORMAT_420_Y_VU     = 162, /* planar, Y + interleaved VU */ | ||||
|     C2D_COLOR_FORMAT_422_Y_VU     = 163, /* planar, Y + interleaved VU */ | ||||
|     C2D_COLOR_FORMAT_444_Y_VU     = 164, /* planar, Y + interleaved VU */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_410_Y_U_V    = 170, /* planar, Y + U + V separate */ | ||||
|     C2D_COLOR_FORMAT_411_Y_U_V    = 171, /* planar, Y + U + V separate */ | ||||
|     C2D_COLOR_FORMAT_420_Y_V_U    = 172, /* planar, Y + V + U separate */ | ||||
|     C2D_COLOR_FORMAT_420_Y_U_V    = 173, /* planar, Y + U + V separate */ | ||||
|     C2D_COLOR_FORMAT_422_Y_U_V    = 174, /* planar, Y + U + V separate */ | ||||
|     C2D_COLOR_FORMAT_444_Y_U_V    = 175, /* planar, Y + U + V separate */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_800_Y        = 190, /* planar, Y only, grayscale */ | ||||
|  | ||||
|     /* derived YUV color formats (base format + mode bits), FOURCC */ | ||||
|  | ||||
|     C2D_COLOR_FORMAT_411_Y411     = 112, | ||||
|     C2D_COLOR_FORMAT_411_Y41P     = 117, | ||||
|     C2D_COLOR_FORMAT_411_IY41     = 117 | (1 << 14), | ||||
|     C2D_COLOR_FORMAT_411_Y41T     = 117 | (1 << 15), | ||||
|  | ||||
|     C2D_COLOR_FORMAT_422_YUY2     = 120, | ||||
|     C2D_COLOR_FORMAT_422_IUYV     = 121 | (1 << 14), | ||||
|     C2D_COLOR_FORMAT_422_Y42T     = 121 | (1 << 15), | ||||
|     C2D_COLOR_FORMAT_444_IYU2     = 131, | ||||
|  | ||||
|     C2D_COLOR_FORMAT_420_NV12     = 152, | ||||
|     C2D_COLOR_FORMAT_420_NV21     = 162, | ||||
|  | ||||
|     C2D_COLOR_FORMAT_410_YUV9     = 170, | ||||
|     C2D_COLOR_FORMAT_410_YVU9     = 170, | ||||
|     C2D_COLOR_FORMAT_411_Y41B     = 171, | ||||
|     C2D_COLOR_FORMAT_420_YV12     = 172, | ||||
|     C2D_COLOR_FORMAT_420_IYUV     = 173, | ||||
|     C2D_COLOR_FORMAT_420_I420     = 173, | ||||
|     C2D_COLOR_FORMAT_422_YV16     = 174, | ||||
|     C2D_COLOR_FORMAT_422_Y42B     = 174, | ||||
|  | ||||
|     C2D_COLOR_FORMAT_800_Y800     = 190, | ||||
|  | ||||
| } C2D_YUV_FORMAT; | ||||
|  | ||||
|  | ||||
| /* Configuration bits, used in the config_mask field of C2D_OBJECT struct */ | ||||
| typedef enum { | ||||
|     C2D_SOURCE_RECT_BIT      = (1 <<  0), /* enables source_rect field */ | ||||
|     C2D_MIRROR_H_BIT         = (1 <<  1), /* enables horizontal flipping */ | ||||
|     C2D_MIRROR_V_BIT         = (1 <<  2), /* enables vertical flipping */ | ||||
|     C2D_SOURCE_TILE_BIT      = (1 <<  3), /* enables source surface tiling */ | ||||
|     C2D_TARGET_RECT_BIT      = (1 <<  4), /* enables target_rect field */ | ||||
|     C2D_ROTATE_BIT           = (1 <<  5), /* enables all rotation fields */ | ||||
|     C2D_SCISSOR_RECT_BIT     = (1 <<  6), /* enables scissor_rect field */ | ||||
|     C2D_MASK_SURFACE_BIT     = (1 <<  7), /* enables mask_surface_id field */ | ||||
|     C2D_MASK_ALIGN_BIT       = (1 <<  8), /* aligns mask to source_rect */ | ||||
|     C2D_MASK_SCALE_BIT       = (1 <<  9), /* enables mask surface scaling */ | ||||
|     C2D_MASK_TILE_BIT        = (1 << 10), /* enables mask surface tiling */ | ||||
|     C2D_GLOBAL_ALPHA_BIT     = (1 << 11), /* enables global_alpha field */ | ||||
|     C2D_COLOR_KEY_BIT        = (1 << 12), /* enables color_key field */ | ||||
|     C2D_NO_PIXEL_ALPHA_BIT   = (1 << 13), /* disables source alpha channel */ | ||||
|     C2D_NO_BILINEAR_BIT      = (1 << 14), /* disables bilinear on scaling */ | ||||
|     C2D_NO_ANTIALIASING_BIT  = (1 << 15), /* disables antialiasing on edges */ | ||||
|     C2D_DRAW_LINE_BIT        = (1 << 16), /* enables line drawing with source rectangle */ | ||||
|     C2D_DRAW_LINE_NOLAST     = (1 << 17), /* disable last pixel draw for line */ | ||||
| } C2D_SOURCE_CONFIG; | ||||
|  | ||||
| /* Target configuration bits, defines rotation + mirroring. | ||||
|  * Mirror is applied prior to rotation if enabled. */ | ||||
| typedef enum { | ||||
|     C2D_TARGET_MIRROR_H        = (1 << 0), /* horizontal flip */ | ||||
|     C2D_TARGET_MIRROR_V        = (1 << 1), /* vertical flip */ | ||||
|     C2D_TARGET_ROTATE_0        = (0 << 2), /* no rotation */ | ||||
|     C2D_TARGET_ROTATE_90       = (1 << 2), /* 90 degree rotation */ | ||||
|     C2D_TARGET_ROTATE_180      = (2 << 2), /* 180 degree rotation */ | ||||
|     C2D_TARGET_ROTATE_270      = (3 << 2), /* 270 degree rotation, 90 + 180 */ | ||||
|     C2D_TARGET_MASK_ALIGN      = (1 << 4), /* aligns mask to target scissor */ | ||||
|     C2D_TARGET_MASK_SCALE      = (1 << 5), /* enables mask scaling */ | ||||
|     C2D_TARGET_MASK_TILE       = (1 << 6), /* enables mask tiling */ | ||||
|     C2D_TARGET_COLOR_KEY       = (1 << 7), /* enables target_color_key */ | ||||
|     C2D_TARGET_NO_PIXEL_ALPHA  = (1 << 8), /* disables target alpha channel */ | ||||
| } C2D_TARGET_CONFIG; | ||||
|  | ||||
| #define C2D_TARGET_ROTATION_MASK  (C2D_TARGET_ROTATE_90*3) | ||||
|  | ||||
| /* Additional blend modes, can be used with both source and target configs. | ||||
|    If none of the below is set, the default "SRC over DST" is applied. */ | ||||
| typedef enum { | ||||
|     C2D_ALPHA_BLEND_SRC_OVER   = (0  << 20), /* Default, Porter-Duff "SRC over DST" */ | ||||
|     C2D_ALPHA_BLEND_SRC        = (1  << 20), /* Porter-Duff "SRC" */ | ||||
|     C2D_ALPHA_BLEND_SRC_IN     = (2  << 20), /* Porter-Duff "SRC in DST" */ | ||||
|     C2D_ALPHA_BLEND_DST_IN     = (3  << 20), /* Porter-Duff "DST in SRC" */ | ||||
|     C2D_ALPHA_BLEND_SRC_OUT    = (4  << 20), /* Porter-Duff "SRC out DST" */ | ||||
|     C2D_ALPHA_BLEND_DST_OUT    = (5  << 20), /* Porter-Duff "DST out SRC" */ | ||||
|     C2D_ALPHA_BLEND_DST_OVER   = (6  << 20), /* Porter-Duff "DST over SRC" */ | ||||
|     C2D_ALPHA_BLEND_SRC_ATOP   = (7  << 20), /* Porter-Duff "SRC ATOP" */ | ||||
|     C2D_ALPHA_BLEND_DST_ATOP   = (8  << 20), /* Porter-Duff "DST ATOP" */ | ||||
|     C2D_ALPHA_BLEND_XOR        = (9  << 20), /* Xor */ | ||||
|     C2D_ALPHA_BLEND_MULTIPLY   = (10 << 20), /* OpenVG "MULTIPLY" */ | ||||
|     C2D_ALPHA_BLEND_SCREEN     = (11 << 20), /* OpenVG "SCREEN" */ | ||||
|     C2D_ALPHA_BLEND_DARKEN     = (12 << 20), /* OpenVG "DARKEN" */ | ||||
|     C2D_ALPHA_BLEND_LIGHTEN    = (13 << 20), /* OpenVG "LIGHTEN" */ | ||||
|     C2D_ALPHA_BLEND_ADDITIVE   = (14 << 20), /* OpenVG "ADDITIVE" */ | ||||
|     C2D_ALPHA_BLEND_DIRECT     = (15 << 20), /* Direct alpha blitting */ | ||||
|     C2D_ALPHA_BLEND_INVERTC    = (16 << 20), /* Invert color */ | ||||
|     C2D_ALPHA_BLEND_NONE       = (1  << 25), /* disables alpha blending */ | ||||
| } C2D_ALPHA_BLEND_MODE; | ||||
|  | ||||
|  | ||||
| /* Surface caps enumeration */ | ||||
| typedef enum { | ||||
|     C2D_SOURCE          = (1 << 0), /* allows to use as a source */ | ||||
|     C2D_TARGET          = (1 << 1), /* allows to use as a target */ | ||||
|     C2D_MASK            = (1 << 2), /* allows to use as a mask */ | ||||
|     C2D_PALETTE         = (1 << 3), /* allows to use as a palette */ | ||||
| } C2D_SURFACE_BITS; | ||||
|  | ||||
| /* Surface type enumeration */ | ||||
| typedef enum { | ||||
|     C2D_SURFACE_EGL          = 0, /* Arbitrary EGL surface */ | ||||
|     C2D_SURFACE_RGB_HOST     = 1, /* Host memory RGB surface */ | ||||
|     C2D_SURFACE_RGB_EXT      = 2, /* External memory RGB surface */ | ||||
|     C2D_SURFACE_YUV_HOST     = 3, /* Host memory YUV surface */ | ||||
|     C2D_SURFACE_YUV_EXT      = 4, /* External memory YUV surface */ | ||||
|     C2D_SURFACE_WITH_PHYS    = (1<<3), /* physical address allready mapped */ | ||||
|                                         /* this bit is valid with HOST types */ | ||||
| } C2D_SURFACE_TYPE; | ||||
|  | ||||
| /* Structure for registering an EGL surface as a blit surface */ | ||||
| typedef struct { | ||||
|     EGLDisplay display; /* EGL display */ | ||||
|     EGLContext context; /* EGL context, reserved - pass EGL_NO_CONTEXT */ | ||||
|     EGLSurface surface; /* EGL surface */ | ||||
| } C2D_EGL_SURFACE_DEF; | ||||
|  | ||||
| /* Structure for registering a RGB buffer as a blit surface */ | ||||
| typedef struct { | ||||
|     uint32 format;   /* RGB color format plus additional mode bits */ | ||||
|     uint32 width;    /* defines width in pixels */ | ||||
|     uint32 height;   /* defines height in pixels */ | ||||
|     void  *buffer;   /* pointer to the RGB buffer */ | ||||
|     void  *phys;     /* physical address */ | ||||
|     int32  stride;   /* defines stride in bytes, negative stride is allowed */ | ||||
| } C2D_RGB_SURFACE_DEF; | ||||
|  | ||||
| /* Structure for registering a YUV plane(s) as a blit surface */ | ||||
| typedef struct { | ||||
|     uint32 format;   /* YUV color format plus additional mode bits */ | ||||
|     uint32 width;    /* defines width in pixels */ | ||||
|     uint32 height;   /* defines height in pixels */ | ||||
|     void  *plane0;  /* holds the whole buffer if YUV format is not planar */ | ||||
|     void  *phys0;   /* physical address */ | ||||
|     int32  stride0; /* stride in bytes if YUV format is not planar */ | ||||
|     void  *plane1;  /* holds UV or VU plane for planar interleaved */ | ||||
|     void  *phys1;   /* physical address */ | ||||
|     int32  stride1; /* stride for UV or VU plane for planar interleaved */ | ||||
|     void  *plane2;  /* holds the 3. plane, ignored if YUV format is not planar */ | ||||
|     void  *phys2;    /* physical address */ | ||||
|     int32  stride2; /* stride for the 3. plane, ignored if YUV format is not planar */ | ||||
| } C2D_YUV_SURFACE_DEF; | ||||
|  | ||||
|  | ||||
| /* Rectangle definition */ | ||||
| typedef struct { | ||||
|     int32 x;        /* upper-left x */ | ||||
|     int32 y;        /* upper-left y */ | ||||
|     int32 width;    /* width */ | ||||
|     int32 height;   /* height */ | ||||
| } C2D_RECT; | ||||
|  | ||||
| /* C2D_OBJECT encapsulates the blit parameters for a source surface. | ||||
|  * The fg_color defines color in target format for bits equal to 1 | ||||
|  * in the source C2D_COLOR_FORMAT_1 format. It also defines rendering | ||||
|  * color for all alpha-only source formats. If the surface_id is 0 | ||||
|  * the fg_color defines a constant fill color used instead of the surface. | ||||
|  * The bg_color defines color in target format for bits equal to 0 | ||||
|  * in the source C2D_COLOR_FORMAT_1 format, otherwise both are ignored. | ||||
|  * The palette_id is used for all palette source formats, otherwise ignored. | ||||
|  | ||||
|  * The source_rect first defines the content of the source surface, | ||||
|  * it is then horizontally/vertically flipped if C2D_MIRROR_*_BIT is set, | ||||
|  * then scaled with bilinear interpolation to exactly fit target_rect | ||||
|  * or repeated across target_rect if C2D_SOURCE_TILE_BIT is set, | ||||
|  * target_rect is then rotated clockwise by an arbitrary angle in degrees | ||||
|  * around the rot_orig_x/y, defined relative to target_rect's top left point, | ||||
|  * and then clipped to scissor_rect defined in target coordinate system. | ||||
|  | ||||
|  * Finally alpha blending is applied before pixels get written into the target. | ||||
|  * Surface's pixel alpha is combined with mask alpha and with global alpha. | ||||
|  * Mask surface follows all transformations applied to the source surface. | ||||
|  * Source color key defines transparent color, applied together with alpha. */ | ||||
| typedef struct C2D_OBJECT_STR { | ||||
|     uint32 surface_id;      /* source surface */ | ||||
|  | ||||
|     uint32 fg_color;        /* foreground color */ | ||||
|     uint32 bg_color;        /* background color */ | ||||
|     uint32 palette_id;      /* one-dimensional horizontal palette surface */ | ||||
|  | ||||
|     uint32 config_mask;     /* defines which fields below are enabled */ | ||||
|  | ||||
|     C2D_RECT source_rect;  /* region of the source surface,   16.16 fp */ | ||||
|     C2D_RECT target_rect;  /* position and scaling in target, 16.16 fp */ | ||||
|  | ||||
|     int32 rot_orig_x;       /* rotation origin relative to target_rect's... */ | ||||
|     int32 rot_orig_y;       /* ...top left point,     both are 16.16 fp */ | ||||
|     int32 rotation;         /* clock-wise rotation in degrees, 16.16 fp */ | ||||
|  | ||||
|     C2D_RECT scissor_rect; /* defines the clip rectangle in target surface */ | ||||
|  | ||||
|     uint32 mask_surface_id; /* source alpha-mask surface */ | ||||
|     uint32 global_alpha;    /* 0 = fully transparent, 255 = fully opaque */ | ||||
|     uint32 color_key;       /* transparent color for the source surface */ | ||||
|  | ||||
|     struct C2D_OBJECT_STR *next; /* pointer to the next object or NULL */ | ||||
| } C2D_OBJECT; | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /**************************** C2D API 2.0 ********************************/ | ||||
| /*****************************************************************************/ | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * Functions to create/destroy surfaces */ | ||||
|  | ||||
| /* Creates a generic blit surface according to its type. | ||||
|  * Pass a combination of desired surface bits according to planned usage. | ||||
|  * Accepted values for surface_bits may include bits from C2D_SURFACE_BITS, | ||||
|  * and also from C2D_DISPLAY for compatibility with HW display controller. | ||||
|  * For host memory types the memory is preallocated outside the API | ||||
|  * and should remain valid until surface is destroyed. | ||||
|  * For external memory types the memory is allocated within API. | ||||
|  * On success, the non-zero surface identifier is returned. | ||||
|  * All numbers greater that 0 are valid surface identifiers, 0 is invalid. | ||||
|  | ||||
|  * arbitrary EGL surface (including  proprietary Command List Surface): | ||||
|  * surface_type       = C2D_SURFACE_EGL | ||||
|  * surface_definition = C2D_EGL_SURFACE_DEF | ||||
|  * all fields in definition structure should be set | ||||
|  * context field is reserved and can be ignored | ||||
|  | ||||
|  * Host memory RGB surface: | ||||
|  * surface_type       = C2D_SURFACE_RGB_HOST | ||||
|  * surface_definition = C2D_RGB_SURFACE_DEF | ||||
|  * all fields in definition structure should be set | ||||
|  | ||||
|  * External memory RGB surface: | ||||
|  * surface_type       = C2D_SURFACE_RGB_EXT | ||||
|  * surface_definition = C2D_RGB_SURFACE_DEF | ||||
|  * buffer field in definition structure is ignored | ||||
|  | ||||
|  * Host memory YUV surface: | ||||
|  * surface_type       = C2D_SURFACE_YUV_HOST | ||||
|  * surface_definition = C2D_YUV_SURFACE_DEF | ||||
|  * one or all plane and stride fields in definition structure | ||||
|  * should be set depending on whether the format is planar or not | ||||
|  | ||||
|  * External memory YUV surface: | ||||
|  * surface_type       = C2D_SURFACE_YUV_EXT | ||||
|  * surface_definition = C2D_YUV_SURFACE_DEF | ||||
|  * all plane and stride fields in definition structure are ignored */ | ||||
| C2D_API C2D_STATUS c2dCreateSurface( uint32 *surface_id, | ||||
|                          uint32 surface_bits, | ||||
|                          C2D_SURFACE_TYPE surface_type, | ||||
|                          void *surface_definition ); | ||||
|  | ||||
| /* Requests properties of the specified surface. */ | ||||
| C2D_API C2D_STATUS c2dQuerySurface( uint32 surface_id, | ||||
|                          uint32 *surface_bits, | ||||
|                          C2D_SURFACE_TYPE *surface_type, | ||||
|                          uint32 *width, uint32 *height, | ||||
|                          uint32 *format ); | ||||
|  | ||||
| /* Destroys a generic blit surface. | ||||
|  * For external memory surfaces also deallocates the memory. | ||||
|  * It is safe to free any external resources associated with a given | ||||
|  * surface on c2dCreateSurface call after this function returns. */ | ||||
| C2D_API C2D_STATUS c2dDestroySurface( uint32 surface_id ); | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * Functions to modify/exchange surface data */ | ||||
|  | ||||
| /* The format of fill_color is the same as color format being used | ||||
|  * for specified surface. If fill_rect is NULL the whole surface is filled. | ||||
|  * Alpha-blending is not performed while filling. | ||||
|  * The operation is complete when function returns. */ | ||||
| C2D_API C2D_STATUS c2dFillSurface( uint32 surface_id, | ||||
|                          uint32 fill_color, | ||||
|                          C2D_RECT *fill_rect ); | ||||
|  | ||||
| /* Writes data located in host memory into the specified surface. | ||||
|  * The chunk of host memory is identified with surface_type and | ||||
|  * surface_definition, no surface registration needed in this case. | ||||
|  * Only C2D_SURFACE_RGB_HOST, C2D_SURFACE_YUV_HOST are accepted. | ||||
|  * If only part of the host memory buffer should be loaded, it should | ||||
|  * be configured in surface_definition using width, height and stride. | ||||
|  * The x and y are defined in target surface coordinate space. | ||||
|  * Color conversion has to be done, if color formats differ. | ||||
|  * Alpha-blending is not performed while writing. | ||||
|  * The operation is complete when function returns. */ | ||||
| C2D_API C2D_STATUS c2dWriteSurface( uint32 surface_id, | ||||
|                          C2D_SURFACE_TYPE surface_type, | ||||
|                          void *surface_definition, | ||||
|                          int32 x, int32 y ); | ||||
|  | ||||
| /* Reads data from the specified surface into the host memory. | ||||
|  * The chunk of host memory is identified with surface_type and | ||||
|  * surface_definition, no surface registration needed in this case. | ||||
|  * Only C2D_SURFACE_RGB_HOST, C2D_SURFACE_YUV_HOST are accepted. | ||||
|  * If only part of the surface should be read, it should | ||||
|  * be configured in surface_definition using width, height and stride. | ||||
|  * The x and y are defined in source surface coordinate space. | ||||
|  * Color conversion has to be done, if color formats differ. | ||||
|  * Alpha-blending is not performed while reading. | ||||
|  * The operation is complete when function returns. */ | ||||
| C2D_API C2D_STATUS c2dReadSurface( uint32 surface_id, | ||||
|                          C2D_SURFACE_TYPE surface_type, | ||||
|                          void *surface_definition, | ||||
|                          int32 x, int32 y ); | ||||
|  | ||||
| /* Notifies c2d imlementation that surface has been updated from outside the API, | ||||
|  * if updated_rect is NULL then the whole surface has been updated. */ | ||||
| C2D_API C2D_STATUS c2dSurfaceUpdated( uint32 surface_id, | ||||
|                          C2D_RECT *updated_rect ); | ||||
|  | ||||
| /* Updates surface information. | ||||
|  * Could be called only for host surfaces set with parameter "C2D_SURFACE_WITH_PHYS". | ||||
|  * Count for surface planes have to be same than for already allocated surface */ | ||||
| C2D_API C2D_STATUS c2dUpdateSurface( uint32 surface_id, | ||||
|                          uint32 surface_bits, | ||||
|                          C2D_SURFACE_TYPE surface_type, | ||||
|                          void *surface_definition ); | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * Functions to do actual blit */ | ||||
|  | ||||
| /* Draw a list of blit objects into the given target. | ||||
|  * The target_config is a bitwise OR of values from C2D_TARGET_CONFIG. | ||||
|  * The target transformation creates the effect that target surface | ||||
|  * is transformed before the blit and then transformed back | ||||
|  * after blit, however no physical target transform is performed. | ||||
|  * The objects_list is a linked list of blit objects, no more | ||||
|  * than num_objects is drawn from the given list. | ||||
|  * If num_objects is 0, the whole list is drawn. | ||||
|  * The blit is not guaranteed to complete after function returns. */ | ||||
| C2D_API C2D_STATUS c2dDraw( uint32 target_id, | ||||
|                          uint32 target_config, C2D_RECT *target_scissor, | ||||
|                          uint32 target_mask_id, uint32 target_color_key, | ||||
|                          C2D_OBJECT *objects_list, uint32 num_objects ); | ||||
|  | ||||
|  | ||||
| /* timstamp set in the blit commands flush */ | ||||
| typedef void*                   c2d_ts_handle; | ||||
|  | ||||
| /* Forces any pending blit to complete for a given target. | ||||
|  * Non-blocking. All input surfaces for this target except those | ||||
|  * which are shared with other targets are expected to be immediately | ||||
|  * writable after client has been waiting returned timestamp with | ||||
|  * c2dWaitTimestamp funtion or c2dFinish has been called for same target */ | ||||
| C2D_API C2D_STATUS c2dFlush( uint32 target_id, c2d_ts_handle *timestamp); | ||||
|  | ||||
|  | ||||
| /* Waits the pending timestamp */ | ||||
| C2D_API C2D_STATUS c2dWaitTimestamp( c2d_ts_handle timestamp ); | ||||
|  | ||||
|  | ||||
| /* Forces any pending blit to complete for a given target. | ||||
|  * Blocking version, returns when blit is done. | ||||
|  * All input surfaces for this target except those which are shared with | ||||
|  * other targets are expected to be immediately | ||||
|  * writable after this function returns. */ | ||||
| C2D_API C2D_STATUS c2dFinish( uint32 target_id ); | ||||
|  | ||||
|  | ||||
| /*****************************************************************************/ | ||||
| /****************************** Display API **********************************/ | ||||
| /*****************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* Display input enumeration */ | ||||
| typedef enum { | ||||
|     C2D_DISPLAY_INPUT_0      = 0,       /*!< default input */ | ||||
|     C2D_DISPLAY_INPUT_1      = (1<<16), /*!< Overlay 1     */ | ||||
|     C2D_DISPLAY_INPUT_2      = (1<<17), /*!< Overlay 2...    */ | ||||
| } C2D_DISPLAY_INPUT; | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * Functions for display output. */ | ||||
|  | ||||
| /* Functionality described in this section is optional and is | ||||
|  * provided only for the cases when blit HW | ||||
|  * is tightly bound to the display controller. */ | ||||
|  | ||||
| /* Display enumeration, may also be used in surface caps */ | ||||
| typedef enum { | ||||
|     C2D_DISPLAY_MAIN         = (1 << 10), /* main display */ | ||||
|     C2D_DISPLAY_SECONDARY    = (1 << 11), /* secondary display */ | ||||
|     C2D_DISPLAY_TV_OUT       = (1 << 12), /* tv-out */ | ||||
| } C2D_DISPLAY; | ||||
|  | ||||
| /* Display window enumeration */ | ||||
| typedef enum { | ||||
|     C2D_DISPLAY_OVERLAY      = C2D_DISPLAY_INPUT_1, /*!< Overlay window bit. This defines display input. | ||||
|                                                 When defined the surface is set on the overlay window | ||||
|                                                 otherwise the surface is set on the background window. */ | ||||
| } C2D_DISPLAY_WINDOW;                    /*!< Window bit set with display parameter */ | ||||
|  | ||||
|  | ||||
| /* Display update modes */ | ||||
| typedef enum { | ||||
|     C2D_DISPLAY_MODE_TEAR_SYNC   = (1 << 0), /* enables tearing sync */ | ||||
|     C2D_DISPLAY_MODE_SURF_REMOVE = (1 << 1), /* Remove surface from given display + input */ | ||||
| } C2D_DISPLAY_MODE; | ||||
|  | ||||
|  | ||||
| /* Sets the given surface as a current display front buffer. | ||||
|  * Several displays can be specified as an output if supported. | ||||
|  * Still only one input can be specified at a time fro display/displays. | ||||
|  * The surface remains shown until it gets replaced with another one. */ | ||||
| C2D_API C2D_STATUS c2dDisplaySetSurface( uint32 display, | ||||
|                          uint32 surface_id, uint32 mode ); | ||||
|  | ||||
| /* Returns the current surface for a particular display. | ||||
|  * Only one display can be specified at a time. | ||||
|  * The latest surface set with compDisplaySetSurface or | ||||
|  * the default pre-allocated surface is returned. */ | ||||
| C2D_API C2D_STATUS c2dDisplayGetSurface( uint32 display, | ||||
|                          uint32 *surface_id ); | ||||
|  | ||||
| /* Returns the properties for a particular display. | ||||
|  * Only one display can be specified at a time. */ | ||||
| C2D_API C2D_STATUS c2dDisplayGetProperties( uint32 display, | ||||
|                          uint32 *width, uint32 *height, | ||||
|                          uint32 *format ); | ||||
|  | ||||
| /* Sets the properties for a particular display input. | ||||
|  * Only one display + input can be specified at a time. | ||||
|  * C2D_OBJECT used to set input rect(target rect), | ||||
|  * blending operations, rotation...etc for display source */ | ||||
| C2D_API C2D_STATUS c2dDisplaySetObject( uint32 display, | ||||
|                          uint32 target_config, uint32 target_color_key, | ||||
|                          C2D_OBJECT * c2dObject, uint32 mode); | ||||
|  | ||||
| /*****************************************************************************/ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __c2d2_h_ */ | ||||
| @@ -119,13 +119,15 @@ static void intersect(struct copybit_rect_t *out, | ||||
| /** convert COPYBIT_FORMAT to MDP format */ | ||||
| static int get_format(int format) { | ||||
|     switch (format) { | ||||
|     case COPYBIT_FORMAT_RGB_565:       return MDP_RGB_565; | ||||
|     case COPYBIT_FORMAT_RGBX_8888:     return MDP_RGBX_8888; | ||||
|     case COPYBIT_FORMAT_RGB_888:       return MDP_RGB_888; | ||||
|     case COPYBIT_FORMAT_RGBA_8888:     return MDP_RGBA_8888; | ||||
|     case COPYBIT_FORMAT_BGRA_8888:     return MDP_BGRA_8888; | ||||
|     case COPYBIT_FORMAT_YCrCb_420_SP:  return MDP_Y_CBCR_H2V2; | ||||
|     case COPYBIT_FORMAT_YCbCr_422_SP:  return MDP_Y_CRCB_H2V1; | ||||
|     case HAL_PIXEL_FORMAT_RGB_565:       return MDP_RGB_565; | ||||
|     case HAL_PIXEL_FORMAT_RGBX_8888:     return MDP_RGBX_8888; | ||||
|     case HAL_PIXEL_FORMAT_RGB_888:       return MDP_RGB_888; | ||||
|     case HAL_PIXEL_FORMAT_RGBA_8888:     return MDP_RGBA_8888; | ||||
|     case HAL_PIXEL_FORMAT_BGRA_8888:     return MDP_BGRA_8888; | ||||
|     case HAL_PIXEL_FORMAT_YCrCb_422_SP:  return MDP_Y_CBCR_H2V1; | ||||
|     case HAL_PIXEL_FORMAT_YCrCb_420_SP:  return MDP_Y_CBCR_H2V2; | ||||
|     case HAL_PIXEL_FORMAT_YCbCr_422_SP:  return MDP_Y_CRCB_H2V1; | ||||
|     case HAL_PIXEL_FORMAT_YCbCr_420_SP:  return MDP_Y_CRCB_H2V2; | ||||
|     } | ||||
|     return -1; | ||||
| } | ||||
| @@ -138,27 +140,23 @@ static void set_image(struct mdp_img *img, const struct copybit_image_t *rhs) | ||||
|     img->height     = rhs->h; | ||||
|     img->format     = get_format(rhs->format); | ||||
|     img->offset     = hnd->offset; | ||||
| #if defined(COPYBIT_MSM7K) | ||||
|     if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_GPU) { | ||||
|         img->offset += hnd->map_offset; | ||||
|         img->memory_id = hnd->gpu_fd; | ||||
|         if (img->format == MDP_RGBA_8888) { | ||||
|             // msm7201A GPU only supports BGRA_8888 destinations | ||||
|             img->format = MDP_BGRA_8888; | ||||
|         } | ||||
|     } else { | ||||
|         img->memory_id = hnd->fd; | ||||
|     } | ||||
| #else | ||||
|     img->memory_id  = hnd->fd; | ||||
| #endif | ||||
|     #if defined(COPYBIT_MSM7K) | ||||
|         #if defined(USE_ASHMEM) && (TARGET_7x27) | ||||
|              img->memory_id = hnd->fd; | ||||
|         #else //USE_ASHMEM not defined | ||||
|              img->memory_id = hnd->fd; | ||||
|         #endif //end USE_ASHMEM | ||||
|     #else | ||||
|         img->memory_id  = hnd->fd; | ||||
|     #endif | ||||
| } | ||||
| /** setup rectangles */ | ||||
| static void set_rects(struct copybit_context_t *dev, | ||||
|                       struct mdp_blit_req *e, | ||||
|                       const struct copybit_rect_t *dst, | ||||
|                       const struct copybit_rect_t *src, | ||||
|                       const struct copybit_rect_t *scissor) { | ||||
|                       const struct copybit_rect_t *scissor, | ||||
|                       uint32_t padding) { | ||||
|     struct copybit_rect_t clip; | ||||
|     intersect(&clip, scissor, dst); | ||||
|  | ||||
| @@ -186,18 +184,30 @@ static void set_rects(struct copybit_context_t *dev, | ||||
|     MULDIV(&e->src_rect.x, &e->src_rect.w, src->r - src->l, W); | ||||
|     MULDIV(&e->src_rect.y, &e->src_rect.h, src->b - src->t, H); | ||||
|     if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_V) { | ||||
|         e->src_rect.y = e->src.height - (e->src_rect.y + e->src_rect.h); | ||||
|         if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { | ||||
|             e->src_rect.x = e->src.width - (e->src_rect.x + e->src_rect.w) - padding; | ||||
|         }else{ | ||||
|             e->src_rect.y = e->src.height - (e->src_rect.y + e->src_rect.h); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (dev->mFlags & COPYBIT_TRANSFORM_FLIP_H) { | ||||
|         e->src_rect.x = e->src.width  - (e->src_rect.x + e->src_rect.w); | ||||
|         if (dev->mFlags & COPYBIT_TRANSFORM_ROT_90) { | ||||
|             e->src_rect.y = e->src.height - (e->src_rect.y + e->src_rect.h); | ||||
|         }else{ | ||||
|             e->src_rect.x = e->src.width - (e->src_rect.x + e->src_rect.w) - padding; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** setup mdp request */ | ||||
| static void set_infos(struct copybit_context_t *dev, struct mdp_blit_req *req) { | ||||
| static void set_infos(struct copybit_context_t *dev, struct mdp_blit_req *req, int flags) { | ||||
|     req->alpha = dev->mAlpha; | ||||
|     req->transp_mask = MDP_TRANSP_NOP; | ||||
|     req->flags = dev->mFlags | MDP_BLEND_FG_PREMULT; | ||||
|     req->flags = dev->mFlags | flags; | ||||
| #if defined(COPYBIT_QSD8K) | ||||
|     req->flags |= MDP_BLEND_FG_PREMULT; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** copy the bits */ | ||||
| @@ -355,10 +365,10 @@ static int stretch_copybit( | ||||
|         if (ctx->mAlpha < 255) { | ||||
|             switch (src->format) { | ||||
|                 // we don't support plane alpha with RGBA formats | ||||
|                 case COPYBIT_FORMAT_RGBA_8888: | ||||
|                 case COPYBIT_FORMAT_BGRA_8888: | ||||
|                 case COPYBIT_FORMAT_RGBA_5551: | ||||
|                 case COPYBIT_FORMAT_RGBA_4444: | ||||
|                 case HAL_PIXEL_FORMAT_RGBA_8888: | ||||
|                 case HAL_PIXEL_FORMAT_BGRA_8888: | ||||
|                 case HAL_PIXEL_FORMAT_RGBA_5551: | ||||
|                 case HAL_PIXEL_FORMAT_RGBA_4444: | ||||
|                     return -EINVAL; | ||||
|             } | ||||
|         } | ||||
| @@ -383,10 +393,12 @@ static int stretch_copybit( | ||||
|         while ((status == 0) && region->next(region, &clip)) { | ||||
|             intersect(&clip, &bounds, &clip); | ||||
|             mdp_blit_req* req = &list.req[list.count]; | ||||
|             set_infos(ctx, req); | ||||
|             int flags = 0; | ||||
|  | ||||
|             set_infos(ctx, req, flags); | ||||
|             set_image(&req->dst, dst); | ||||
|             set_image(&req->src, src); | ||||
|             set_rects(ctx, req, dst_rect, src_rect, &clip); | ||||
|             set_rects(ctx, req, dst_rect, src_rect, &clip, src->padding); | ||||
|  | ||||
|             if (req->src_rect.w<=0 || req->src_rect.h<=0) | ||||
|                 continue; | ||||
| @@ -462,7 +474,7 @@ static int open_copybit(const struct hw_module_t* module, const char* name, | ||||
|     } else { | ||||
|         struct fb_fix_screeninfo finfo; | ||||
|         if (ioctl(ctx->mFD, FBIOGET_FSCREENINFO, &finfo) == 0) { | ||||
|             if (strcmp(finfo.id, "msmfb") == 0) { | ||||
|             if (strncmp(finfo.id, "msmfb", 5) == 0) { | ||||
|                 /* Success */ | ||||
|                 status = 0; | ||||
|             } else { | ||||
|   | ||||
							
								
								
									
										1008
									
								
								libcopybit/copybit_c2d.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1008
									
								
								libcopybit/copybit_c2d.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user