Home | History | Annotate | Download | only in drm_hwcomposer
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "hwc-drm-compositor-worker"
     18 
     19 #include "drmdisplaycompositor.h"
     20 #include "drmcompositorworker.h"
     21 #include "worker.h"
     22 
     23 #include <stdlib.h>
     24 
     25 #include <cutils/log.h>
     26 #include <hardware/hardware.h>
     27 
     28 namespace android {
     29 
     30 DrmCompositorWorker::DrmCompositorWorker(DrmDisplayCompositor *compositor)
     31     : Worker("drm-compositor", HAL_PRIORITY_URGENT_DISPLAY),
     32       compositor_(compositor) {
     33 }
     34 
     35 DrmCompositorWorker::~DrmCompositorWorker() {
     36 }
     37 
     38 int DrmCompositorWorker::Init() {
     39   return InitWorker();
     40 }
     41 
     42 void DrmCompositorWorker::Routine() {
     43   int ret;
     44   if (!compositor_->HaveQueuedComposites()) {
     45     ret = Lock();
     46     if (ret) {
     47       ALOGE("Failed to lock worker, %d", ret);
     48       return;
     49     }
     50 
     51     int wait_ret = WaitForSignalOrExitLocked();
     52 
     53     ret = Unlock();
     54     if (ret) {
     55       ALOGE("Failed to unlock worker, %d", ret);
     56       return;
     57     }
     58 
     59     if (wait_ret == -EINTR) {
     60       return;
     61     } else if (wait_ret) {
     62       ALOGE("Failed to wait for signal, %d", wait_ret);
     63       return;
     64     }
     65   }
     66 
     67   ret = compositor_->Composite();
     68   if (ret)
     69     ALOGE("Failed to composite! %d", ret);
     70 }
     71 }
     72