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-plane"
     18 
     19 #include "drmplane.h"
     20 #include "drmresources.h"
     21 
     22 #include <cinttypes>
     23 #include <errno.h>
     24 #include <stdint.h>
     25 
     26 #include <cutils/log.h>
     27 #include <xf86drmMode.h>
     28 
     29 namespace android {
     30 
     31 DrmPlane::DrmPlane(DrmResources *drm, drmModePlanePtr p)
     32     : drm_(drm), id_(p->plane_id), possible_crtc_mask_(p->possible_crtcs) {
     33 }
     34 
     35 int DrmPlane::Init() {
     36   DrmProperty p;
     37 
     38   int ret = drm_->GetPlaneProperty(*this, "type", &p);
     39   if (ret) {
     40     ALOGE("Could not get plane type property");
     41     return ret;
     42   }
     43 
     44   uint64_t type;
     45   ret = p.value(&type);
     46   if (ret) {
     47     ALOGE("Failed to get plane type property value");
     48     return ret;
     49   }
     50   switch (type) {
     51     case DRM_PLANE_TYPE_OVERLAY:
     52     case DRM_PLANE_TYPE_PRIMARY:
     53     case DRM_PLANE_TYPE_CURSOR:
     54       type_ = (uint32_t)type;
     55       break;
     56     default:
     57       ALOGE("Invalid plane type %" PRIu64, type);
     58       return -EINVAL;
     59   }
     60 
     61   ret = drm_->GetPlaneProperty(*this, "CRTC_ID", &crtc_property_);
     62   if (ret) {
     63     ALOGE("Could not get CRTC_ID property");
     64     return ret;
     65   }
     66 
     67   ret = drm_->GetPlaneProperty(*this, "FB_ID", &fb_property_);
     68   if (ret) {
     69     ALOGE("Could not get FB_ID property");
     70     return ret;
     71   }
     72 
     73   ret = drm_->GetPlaneProperty(*this, "CRTC_X", &crtc_x_property_);
     74   if (ret) {
     75     ALOGE("Could not get CRTC_X property");
     76     return ret;
     77   }
     78 
     79   ret = drm_->GetPlaneProperty(*this, "CRTC_Y", &crtc_y_property_);
     80   if (ret) {
     81     ALOGE("Could not get CRTC_Y property");
     82     return ret;
     83   }
     84 
     85   ret = drm_->GetPlaneProperty(*this, "CRTC_W", &crtc_w_property_);
     86   if (ret) {
     87     ALOGE("Could not get CRTC_W property");
     88     return ret;
     89   }
     90 
     91   ret = drm_->GetPlaneProperty(*this, "CRTC_H", &crtc_h_property_);
     92   if (ret) {
     93     ALOGE("Could not get CRTC_H property");
     94     return ret;
     95   }
     96 
     97   ret = drm_->GetPlaneProperty(*this, "SRC_X", &src_x_property_);
     98   if (ret) {
     99     ALOGE("Could not get SRC_X property");
    100     return ret;
    101   }
    102 
    103   ret = drm_->GetPlaneProperty(*this, "SRC_Y", &src_y_property_);
    104   if (ret) {
    105     ALOGE("Could not get SRC_Y property");
    106     return ret;
    107   }
    108 
    109   ret = drm_->GetPlaneProperty(*this, "SRC_W", &src_w_property_);
    110   if (ret) {
    111     ALOGE("Could not get SRC_W property");
    112     return ret;
    113   }
    114 
    115   ret = drm_->GetPlaneProperty(*this, "SRC_H", &src_h_property_);
    116   if (ret) {
    117     ALOGE("Could not get SRC_H property");
    118     return ret;
    119   }
    120 
    121   ret = drm_->GetPlaneProperty(*this, "rotation", &rotation_property_);
    122   if (ret)
    123     ALOGE("Could not get rotation property");
    124 
    125   ret = drm_->GetPlaneProperty(*this, "alpha", &alpha_property_);
    126   if (ret)
    127     ALOGI("Could not get alpha property");
    128 
    129   return 0;
    130 }
    131 
    132 uint32_t DrmPlane::id() const {
    133   return id_;
    134 }
    135 
    136 bool DrmPlane::GetCrtcSupported(const DrmCrtc &crtc) const {
    137   return !!((1 << crtc.pipe()) & possible_crtc_mask_);
    138 }
    139 
    140 uint32_t DrmPlane::type() const {
    141   return type_;
    142 }
    143 
    144 const DrmProperty &DrmPlane::crtc_property() const {
    145   return crtc_property_;
    146 }
    147 
    148 const DrmProperty &DrmPlane::fb_property() const {
    149   return fb_property_;
    150 }
    151 
    152 const DrmProperty &DrmPlane::crtc_x_property() const {
    153   return crtc_x_property_;
    154 }
    155 
    156 const DrmProperty &DrmPlane::crtc_y_property() const {
    157   return crtc_y_property_;
    158 }
    159 
    160 const DrmProperty &DrmPlane::crtc_w_property() const {
    161   return crtc_w_property_;
    162 }
    163 
    164 const DrmProperty &DrmPlane::crtc_h_property() const {
    165   return crtc_h_property_;
    166 }
    167 
    168 const DrmProperty &DrmPlane::src_x_property() const {
    169   return src_x_property_;
    170 }
    171 
    172 const DrmProperty &DrmPlane::src_y_property() const {
    173   return src_y_property_;
    174 }
    175 
    176 const DrmProperty &DrmPlane::src_w_property() const {
    177   return src_w_property_;
    178 }
    179 
    180 const DrmProperty &DrmPlane::src_h_property() const {
    181   return src_h_property_;
    182 }
    183 
    184 const DrmProperty &DrmPlane::rotation_property() const {
    185   return rotation_property_;
    186 }
    187 
    188 const DrmProperty &DrmPlane::alpha_property() const {
    189   return alpha_property_;
    190 }
    191 }
    192