compositionType is used to specifythis layer's type and is set by either
the hardware composerimplementation, or by the caller (see below).
合成类型用来确定layer的类型,
在(*prepare)()调用前,需要复位HWC_BACKGROUNDor HWC_FRAMEBUFFER,需要设置HWC_GEOMETRY_CHANGED的标志符,并在(*prepare)()过程中保持,
a)HWC_BACKGROUND:
(*prepare)()调用前设置,表明这是个特殊的"background"的层,backgroundColor是无效的,HWC向HWC_FRAMEBUFFER切换此值,并表示无法使用backgroundColor。
b)HWC_FRAMEBUFFER_TARGET
在prepare前设置此值,此值表明此层是framebuffersurface层,作为OpenGLEScomposition的对象,如果HWC设置其他层为HWC_OVERLAY或则为HWC_BACKGROUND,则在set()过程中opengles则什么都不干。
此标志仅仅用在版本至少为HWC_DEVICE_API_VERSION_1_1,在老版本的过程中,OpenGLES target 与(dpy, sur)通信,在HWC实现的过程中此值不能设置。
c)HWC_FRAMEBUFFER
在(*prepare)()调用前设置,仅仅在HWC_GEOMETRY_CHANGEDflag 也在设置的时候设置,并表明此层将使用opengles画进framebuffer中。HWC可以切换此值到HWC_OVERLAY表明其将要管理此层。
d)HWC_OVERLAY
在(*prepare)()过程中,通过HWC设置,表明此层由HWC设置,不能通过OpenGLES 合成。
e)HWC_SIDEBAND
在(*prepare)()前设置,此值表明此层的内容来自于边带视频流,此流在适当的时间(去同步多媒体流),与其他层当前内容进行合成,显示结果图片。此现象依赖于正常的prepare/set周期。prepare/set调用仅仅发生在其他层的改变,或则是边带视频流的位置或则大小的改变。
假如h/w composer 无法管理层由于边带视频流的原因(unsupportedscaling/blending/rotation, or too many sideband layers),其可以在(*prepare)()设置合成类型为HWC_FRAMEBUFFER。但是,这样做显示维实体颜色,因为平台无法使用GPU进行合成边带视频层。这个问题在未来的平台版本中将得到改善。
f)HWC_CURSOR_OVERLAY
在(*prepare)()期间,设置HWC实现,这个值意味着此层的合成将要被HWC的管理,另外,客户端在屏幕上可以异步刷新,这个层的位置可以使用setCursorPositionAsync() api。
h)uint32_thints;
hints是个位屏蔽位,在(*prepare)()期间由HWC实现过程中设置。在(*prepare)调用期间保持,除HWC_GEOMETRY_CHANGED flag设置时,并复位为0,
i)uint32_tflags; //hwc层的标志符
j)buffer_handle_thandle,const native_handle_t* sidebandStream
当合成的类型为HWC_FRAMEBUFFER,HWC_OVERLAY时,HWC_FRAMEBUFFER_TARGET为即将要合成的buffer句柄。这个句柄保证通过gralloc使用GRALLOC_USAGE_HW_COMPOSER分配。如果layer的句柄在连续两次调用prepare未发生改变,并且HWC_GEOMETRY_CHANGED flag没有为了第二次调用设置以及HWComposer实现可以假定为buffer的内容没有改变。
当合成的类型为HWC_SIDEBAND,constnative_handle_t* sidebandStream这是边带视频流的句柄,
k)uint32_t transform 为在合成过程中为了应用于buffer的变换,
int32_t blending; 在合成过程中进行混合
union {
// crop rectangle ininteger (pre HWC_DEVICE_API_VERSION_1_3)
hwc_rect_tsourceCropi;
hwc_rect_t sourceCrop;// just for source compatibility
// crop rectangle infloats (as of HWC_DEVICE_API_VERSION_1_3)
hwc_frect_tsourceCropf;
};
需要考虑的源区,buffer的原点在左上方,如果h/w不支持非整型source crop rectangle,则需要使用OpenGLES 进行合成。
hwc_rect_t displayFrame; //是sourceCrop在屏幕上合成的地方,sourceCrop通过线性滤波器缩放显示的帧,原点在屏幕的左上方。
hwc_region_t visibleRegionScreen; ///在屏幕的可见区域,这个可见区包括透明层的重合区域。
int acquireFenceFd;//同步fence对象在buffer的内容可用的时候作出标记,当buffer的内容可以用的时候此值为-1。此区域在set()过程中不可用,在prepare()期间被忽略,set()调用在fence被标记前返回,但是HWC必须等到所有buffer标记后才能读取他们。
HWC_FRAMEBUFFER层不会得到fence,因为在framebuffer准备显示之前,已经读取完成。
HWC_SIDEBAND 层不会获取fence,因为同步是由边带机制整个实现过程中使用管理。
HWC 是acquireFenceFd的所有者,当不需要的时候,并负责关掉。
int releaseFenceFd;
//在set()期间,HWC设置此部分文件说明为了一个syncfence对象在HWC完成从buffer中读取之后,并被标记结束。在prepare()过程中,此部分可以忽略。每一个Layer都应该有唯一的文件标识,一个fence对象拥有不止一个文件标识,但是可以互相自由地关掉文件标识。假如bufer可以在不同的时间中完成读取,
然后可以使用不同独立的fence作为标识。例如HWC使用位引擎,其他层使用overlays,当blit(传图)完成后,传图层会立即终止,但是overlay层直到一个顺序frame完成显示后才终止。由于HWC不会从HWC_FRAMEBUFFER.层读取数据,因此不会为他们产生release fence,当set()被调用后,这些层的releaseFenceFd的值为-1。由于HWC_SIDEBANDbuffers 不经过HWCclien,HWC不会为其产生release fence,当set() 被调用后,这些层的releaseFenceFd的值为-1。HWC客户端获得releaseFenceFd的所有权,当不使用的时候,关掉之。
uint8_t planeAlpha; // HWC_DEVICE_API_VERSION_1_2可以使用,Alpha值可以为整个层所用,
每个像素有效值计算如下:
* if (blending ==HWC_BLENDING_PREMULT)
* pixel.rgb =pixel.rgb * planeAlpha / 255
* pixel.a = pixel.a *planeAlpha / 255
然后blending进程根据上面blending部分合成,
* NOTE: planeAlpha appliesto YUV layers as well:
* pixel.rgb =yuv_to_rgb(pixel.yuv)
* if (blending ==HWC_BLENDING_PREMULT)
* pixel.rgb =pixel.rgb * planeAlpha / 255
* pixel.a = planeAlpha
如果一些图像没有alpha通道,然后可以h/w使用HWC_BLENDING_COVERAGE方程代替HWC_BLENDING_PREMULT,并且简单设置apha通道为alpha平面。
例如:
* if (blending ==HWC_BLENDING_PREMULT)
* blending =HWC_BLENDING_COVERAGE;
pixel.a = planeAlpha;
uint8_t _pad[3]; 预留使用
如果为64模式,此结构体为120字节,8字节对齐,32位模式,此结构体为96字节
#ifdef __LP64__
/*
* For 64-bit mode, this struct is120 bytes (and 8-byte aligned), and needs
* to be padded as such to maintainbinary compatibility.
*/
uint8_t reserved[120 - 96];
#else
/*
* For 32-bit mode, this struct is96 bytes, and needs to be padded as such
* to maintain binarycompatibility.
*/
uint8_t reserved[96 - 76];
#endif