hwc_composer_device_1
struct hw_device_t common; //hardware composer device通用方法,其必须为hwc_composer_device_1 的第一个成员,用此结构体的使用者需要将hw_device_t 投射到上下文的hwc_composer_device_1指针。
int (*prepare)(structhwc_composer_device_1 *dev,
size_t numDisplays,hwc_display_contents_1_t** displays); //
//(*prepare)() 在每一帧合成前调用,可以应用于SurfaceFlinger决定HWC合成的步骤,(*prepare)()可以调用多次,并以最后一次调用为准。当一层合成类型为HWC_FRAMEBUFFER, HWC_OVERLAY, orHWC_CURSOR_OVERLAY,HWC将作出回应。 HWC_FRAMEBUFFER类型,此层所需SurfaceFlinger 使用OpenGLES管理。在最近overlay两层,HWC 将要管理每层的合成。合成类型在整个*prepare)()都会保持不变,除非HWC_GEOMETRY_CHANGED符改变。(*prepare)()被HWC_GEOMETRY_CHANGED调用,表示几何列表已经改变,也就是说buffer's句柄已经更新。最典型的是一个窗口已经添加,移除,更改大小和移动。在此种情况下,合成类型和提示都会复位到默认值。HWC 1.0,中numDisplays经常值为1,displays[0]为空,ForHWC 1.1, numDisplays是HWC_NUM_PHYSICAL_DISPLAY_TYPES,returns:0 代码成功.负值代码出错. 如果一个错误返回则,表明surfaceflinger没有层在句柄中。
int (*set)(structhwc_composer_device_1 *dev,
size_t numDisplays,hwc_display_contents_1_t** displays);
//(*set)()应用于eglSwapBuffers()中,假定有相同的功能,除非自动work单子提交给实际eglSwapBuffers()。
层列表确保和上次调用(*prepare)()返回的是一样的,当调用返回假定displays将要更新工作列表的内容,在先前过度帧没有图片帧。显示零层表明整个合成已经被SurfaceFlinger使用OpenGLES进行处理。在这种情况下(*set)()行为仅仅为eglSwapBuffers()。For HWC 1.0 ,numDisplays为1,displays[0]为空,
For HWC 1.1,numDisplays 为HWC_NUM_PHYSICAL_DISPLAY_TYPES
需要注意的是,这里有一个隐含层含有不透明的黑色像素在所有的层列表之后。hwcomposermodule 的职责是确保黑色像素输出或则是混合格式。*MUST*报错事件仍然会导致在先前为了最终有信号而调用中返回fences值。此调用可能已经发出等待命令,并且已经设置在没有引起这些fences发出信号,将很有可能导致锁死。
int (*eventControl)(structhwc_composer_device_1* dev, int disp,
int event, int enabled);
event支持HWC_EVENT_VSYNC事件,enabled为了显示使能或则使能h/wcomposer事件,并且可以在任何进程中调用并且发挥作用,当出错的时候返回为-EINVAL。
int (*blank)(structhwc_composer_device_1* dev, int disp, int blank); //当blank参数为非零的时候,
关掉显示器;
int (*setPowerMode)(structhwc_composer_device_1* dev, int disp,
int mode); // 对于HWC 1.4以及更高版本的时候,使用setPowerMode来代替blank().
参考HWC_POWER_MODE_* constants来设置powermode。
int (*query)(structhwc_composer_device_1* dev, int what, int* value);
//用来检索h/wcomposer信息。
void (*registerProcs)(structhwc_composer_device_1* dev,
hwc_procs_t const* procs);
// 在h/wcomposer HAL层调用并且稍后使用。在composerdevice 被non-NULL进程打开,然后被立即调用。在registerProcs()内部不允许调用返回,registerProcs() 必须保存hwc_procs_t pointer,当调用registerProc返回。
void (*dump)(structhwc_composer_device_1* dev, char *buff, int buff_len);
//如果non NULL,则dump将会被SurfaceFlinger on dumpsys调用。
int (*getDisplayConfigs)(structhwc_composer_device_1* dev, int disp,
uint32_t* configs, size_t*numConfigs);
//(*getDisplayConfigs)()返回与其连接着的display的可供配置的句柄,这些句柄必须在display连接的过程中保持有效,Configuration 句柄写到configs,大多数入口分配通过调用传入*numConfigs,getDisplayConfigs不应尝试写入比config多的configs,为display返回可用配置数量到*numConfigs,如果*numConfigs为零,则configs可能为null。硬件合成版本版本为HWC_DEVICE_API_VERSION_1_3或则更高版本应该选择一个配置去激活和报表作为返回列表的第一入口。HWC_DEVICE_API_VERSION_1_4和稍后提供的通过surfaceflinger提供的配置管理,并且hardware composers实现这些APIS,必须提供getActiveConfig和setActiveConfig。
int (*getDisplayAttributes)(structhwc_composer_device_1* dev, int disp,
uint32_t config, constuint32_t* attributes, int32_t* values);
//(*getDisplayAttributes)()返回一个特定配置相连接的dispaly配置属性,配置参数作为一个配置句柄作为getDisplayConfigs的返回值,属性列表遇到HWC_DISPLAY_NO_ATTRIBUTEH中断,
int (*getActiveConfig)(structhwc_composer_device_1* dev, int disp);
//(*getDisplayAttributes)()返回属性为了一个特定配置相连的display。
int (*setActiveConfig)(structhwc_composer_device_1* dev, int disp,
intindex);//在配置句柄(由getDisplayConfigs返回)列表命令hardware composer切换display配置。如果此函数返回无错误,为了getActiveConfig获得任何顺序调用应该返回相应的索引直到以下情况出现:
1)另一个成功调用此函数,2)display没有连接。
int (*setCursorPositionAsync)(structhwc_composer_device_1 *dev, int disp, int x_pos, int y_pos);
//异步更新cursor layer(光标层)位置,在标准的prepare()/set()合成的循环之内,客户端(surfaceflinger)可以请求所给的layer使用专业的光标合成硬件,通过设置HWC_IS_CURSOR_LAYER标识位。仅仅在一个layer的单次显示的时候可以设置此标识位。如果layer适合平台光标硬件,hwcomposer将在prepare()返回,其合成类型为HWC_CURSOR_OVERLAY。此表明客户端不仅负责合成那个层,并且客户端可以继续更新位置所处的层在调用set()之后。这可以减少鼠标移动明显的延迟,在屏鼠标更新。调用setCursorPositionAsync()后可能区别与不同进程做prepare()/set()合成循环,
int (*getBuiltInDisplayNum)(structhwc_composer_device_1 *dev, uint32_t *number);
void* reserved_proc[1];