static struct hw_module_methods_t hwc2_module_methods = {
.open = android::DrmHwcTwo::HookDevOpen,
};
hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = HARDWARE_MODULE_API_VERSION(2, 0),
.id = HWC_HARDWARE_MODULE_ID,
.name = "DrmHwcTwo module",
.author = "The Android Open Source Project",
.methods = &hwc2_module_methods,
.dso = NULL,
.reserved = {0},
};
根据这个变量,系统找到open函数:HookDevOpen, 这个函数里面会调用初始化
int DrmHwcTwo::EventWorker::Init(DrmHwcTwo *hwc2) {
hwc2_ = hwc2;
return InitWorker();
}
初始化里面会创建线程并进行事件处理:
void DrmCompositorWorker::Routine() {
int ret;
// 需要将此线程设置为实时线程,为了让底层调用CPU计时器可以获得更准确的计时
// 所有平台的提交线程需要设置为实时线程
if(bSchedFifoOnce_ == false){
bSchedFifoOnce_ = true;
static constexpr int kFifoPriority = 2;
struct sched_param param = {0};
int sched_policy;
sched_policy = SCHED_FIFO;
param.sched_priority = kFifoPriority;
if (sched_setscheduler(0, sched_policy, ¶m) != 0) {
HWC2_ALOGE("DrmCompositorWorker set SCHED_FIFO fail!");
}else{
HWC2_ALOGI("DrmCompositorWorker set SCHED_FIFO success!");
}
}
if(!compositor_->IsSidebandMode()){
if (!compositor_->HaveQueuedComposites()) {
Lock();
int wait_ret = WaitForSignalOrExitLocked(kWaitTimeOut_);
Unlock();
switch (wait_ret) {
case 0:
break;
case -EINTR:
return;
//close pre-comp for static screen.
case -ETIMEDOUT:
kWaitTimeOut_ = kWaitTimeOut_ * 2 > 500000000LL? 500000000LL : kWaitTimeOut_ * 2;
return;
default:
ALOGE("Failed to wait for signal, %d", wait_ret);
return;
}
}
}
kWaitTimeOut_ = 2000000LL;
ret = compositor_->Composite();
if (ret)
ALOGE("Failed to composite! %d", ret);
}
Routine里面会检查是否有合成的队列成员,有的话调用composite合成,

1126

被折叠的 条评论
为什么被折叠?



