HWC代码分析MIPI显示

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, &param) != 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合成,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值