android13/hardware/rockchip/hwcomposer/drmhwc2/drm/drmplane.cpp

857 lines
24 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "hwc-drm-plane"
#include "drmplane.h"
#include "drmdevice.h"
#include "rockchip/utils/drmdebug.h"
#include <errno.h>
#include <stdint.h>
#include <cinttypes>
#include <log/log.h>
#include <xf86drmMode.h>
#include <drm/drm_fourcc.h>
namespace android {
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
struct plane_rotation_type_name plane_rotation_type_names[] = {
{ DRM_PLANE_ROTATION_0, "rotate-0" },
{ DRM_PLANE_ROTATION_90, "rotate-90" },
{ DRM_PLANE_ROTATION_270, "rotate-270" },
{ DRM_PLANE_ROTATION_X_MIRROR, "reflect-x" },
{ DRM_PLANE_ROTATION_Y_MIRROR, "reflect-y" },
{ DRM_PLANE_ROTATION_Unknown, "unknown" },
};
DrmPlane::DrmPlane(DrmDevice *drm, drmModePlanePtr p,int soc_id)
: drm_(drm), id_(p->plane_id),
possible_crtc_mask_(p->possible_crtcs),
plane_(p),
soc_id_(soc_id) {
}
int DrmPlane::Init() {
DrmProperty p;
int ret = drm_->GetPlaneProperty(*this, "type", &p);
if (ret) {
ALOGE("Could not get plane type property");
return ret;
}
uint64_t type;
std::tie(ret, type) = p.value();
if (ret) {
ALOGE("Failed to get plane type property value");
return ret;
}
switch (type) {
case DRM_PLANE_TYPE_OVERLAY:
case DRM_PLANE_TYPE_PRIMARY:
case DRM_PLANE_TYPE_CURSOR:
type_ = (uint32_t)type;
break;
default:
ALOGE("Invalid plane type %" PRIu64, type);
return -EINVAL;
}
ret = drm_->GetPlaneProperty(*this, "CRTC_ID", &crtc_property_);
if (ret) {
ALOGE("Could not get CRTC_ID property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "FB_ID", &fb_property_);
if (ret) {
ALOGE("Could not get FB_ID property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "CRTC_X", &crtc_x_property_);
if (ret) {
ALOGE("Could not get CRTC_X property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "CRTC_Y", &crtc_y_property_);
if (ret) {
ALOGE("Could not get CRTC_Y property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "CRTC_W", &crtc_w_property_);
if (ret) {
ALOGE("Could not get CRTC_W property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "CRTC_H", &crtc_h_property_);
if (ret) {
ALOGE("Could not get CRTC_H property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "SRC_X", &src_x_property_);
if (ret) {
ALOGE("Could not get SRC_X property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "SRC_Y", &src_y_property_);
if (ret) {
ALOGE("Could not get SRC_Y property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "SRC_W", &src_w_property_);
if (ret) {
ALOGE("Could not get SRC_W property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "SRC_H", &src_h_property_);
if (ret) {
ALOGE("Could not get SRC_H property");
return ret;
}
ret = drm_->GetPlaneProperty(*this, "EOTF", &eotf_property_);
if (ret)
ALOGI("Could not get eotf property");
ret = drm_->GetPlaneProperty(*this, "ZPOS", &zpos_property_);
if (ret){
ALOGE("Could not get ZPOS property, try to get zpos property");
ret = drm_->GetPlaneProperty(*this, "zpos", &zpos_property_);
if (ret)
ALOGE("Could not get zpos property");
}
ret = drm_->GetPlaneProperty(*this, "SHARE_FLAGS", &area_id_property_);
if (ret)
ALOGE("Could not get AREA_ID property");
ret = drm_->GetPlaneProperty(*this, "SHARE_ID", &share_id_property_);
if (ret)
ALOGE("Could not get SHARE_ID property");
ret = drm_->GetPlaneProperty(*this, "FEATURE", &feature_property_);
if (ret)
ALOGE("Could not get FEATURE property");
std::tie(ret,b_scale_) = feature_property_.value_bitmask("scale");
std::tie(ret,b_alpha_) = feature_property_.value_bitmask("alpha");
std::tie(ret,b_hdr2sdr_) = feature_property_.value_bitmask("hdr2sdr");
std::tie(ret,b_sdr2hdr_) = feature_property_.value_bitmask("sdr2hdr");
std::tie(ret,b_afbdc_) = feature_property_.value_bitmask("afbdc");
if(isRK356x(soc_id_) || isRK3588(soc_id_) || isRK3528(soc_id_) || isRK3562(soc_id_)){
b_alpha_ = true;
b_hdr2sdr_ = true;
b_sdr2hdr_ = true;
}
//ALOGD("rk-debug scale=%d alpha=%d hdr2sdr=%d sdr2hdr=%d afbdc=%d", b_scale_,b_alpha_,b_hdr2sdr_,b_sdr2hdr_,b_afbdc_);
support_format_list.clear();
for (uint32_t j = 0; j < plane_->count_formats; j++) {
support_format_list.insert(plane_->formats[j]);
}
ret = drm_->GetPlaneProperty(*this, "alpha", &alpha_property_);
if (ret)
ALOGI("Could not get alpha property");
ret = drm_->GetPlaneProperty(*this, "pixel blend mode", &blend_mode_property_);
if (ret)
ALOGI("Could not get pixel blend mode property");
rotate_ = DRM_PLANE_ROTATION_0;
ret = drm_->GetPlaneProperty(*this, "rotation", &rotation_property_);
if (ret)
ALOGE("Could not get FEATURE property");
else{
for(int i = 0; i < ARRAY_SIZE(plane_rotation_type_names); i++){
bool find_name = false;
int value = 0;
std::tie(value,find_name) = rotation_property_.bitmask(plane_rotation_type_names[i].name);
if(find_name){
rotate_ |= value;
}
}
}
ret = drm_->GetPlaneProperty(*this, "NAME", &name_property_);
if (ret)
ALOGE("Could not get NAME property");
else{
mark_type_by_name();
}
ret = drm_->GetPlaneProperty(*this, "INPUT_WIDTH", &input_w_property_);
if (ret)
ALOGE("Could not get INPUT_WIDTH property");
else{
uint64_t input_w_max=0;
std::tie(ret,input_w_max) = input_w_property_.range_max();
if(!ret)
input_w_max_ = input_w_max;
else
ALOGE("Could not get INPUT_WIDTH range_max property");
}
ret = drm_->GetPlaneProperty(*this, "INPUT_HEIGHT", &input_h_property_);
if (ret)
ALOGE("Could not get INPUT_HEIGHT property");
else{
uint64_t input_h_max=0;
std::tie(ret,input_h_max) = input_h_property_.range_max();
if(!ret)
input_h_max_ = input_h_max;
else
ALOGE("Could not get INPUT_HEIGHT range_max property");
}
ret = drm_->GetPlaneProperty(*this, "OUTPUT_WIDTH", &output_w_property_);
if (ret)
ALOGE("Could not get OUTPUT_WIDTH property");
else{
uint64_t output_w_max=0;
std::tie(ret,output_w_max) = output_w_property_.range_max();
if(!ret)
output_w_max_ = output_w_max;
else
ALOGE("Could not get OUTPUT_WIDTH range_max property");
}
ret = drm_->GetPlaneProperty(*this, "OUTPUT_HEIGHT", &output_h_property_);
if (ret)
ALOGE("Could not get OUTPUT_HEIGHT property");
else{
uint64_t output_h_max=0;
std::tie(ret,output_h_max) = output_h_property_.range_max();
if(!ret)
output_h_max_ = output_h_max;
else
ALOGE("Could not get OUTPUT_HEIGHT range_max property");
}
ret = drm_->GetPlaneProperty(*this, "SCALE_RATE", &scale_rate_property_);
if (ret)
ALOGE("Could not get SCALE_RATE property");
else{
uint64_t scale_rate=0;
std::tie(ret,scale_rate) = scale_rate_property_.range_max();
if(!ret)
scale_min_ = 1/(scale_rate * 1.0);
else
ALOGE("Could not get SCALE_RATE range_min property");
std::tie(ret,scale_rate) = scale_rate_property_.range_min();
if(!ret)
scale_max_ = scale_rate;
else
ALOGE("Could not get SCALE_RATE range_max property");
if(isRK356x(soc_id_)){
if(win_type_ & (DRM_PLANE_TYPE_SMART0_MASK | DRM_PLANE_TYPE_SMART1_MASK)){
b_scale_ = false;
scale_min_ = 1.0;
scale_max_ = 1.0;
}
}
}
ret = drm_->GetPlaneProperty(*this, "ASYNC_COMMIT", &async_commit_property_);
if (ret) {
ALOGE("Could not get ASYNC_COMMIT property");
}
// Kernel 6.1 更名使用 COLOR_ENCODING 与 COLOR_RANGE 替代 COLOR_SPACE
if(gIsDrmVerison6_1()){
ret = drm_->GetPlaneProperty(*this, "COLOR_ENCODING", &kernel6_1_color_encoding_ );
if (ret) {
ALOGE("Could not get COLOR_ENCODING property");
}
ret = drm_->GetPlaneProperty(*this, "COLOR_RANGE", &kernel6_1_color_range_);
if (ret) {
ALOGE("Could not get COLOR_RANGE property");
}
}else{
ret = drm_->GetPlaneProperty(*this, "COLOR_SPACE", &colorspace_property_);
if (ret)
ALOGI("Could not get colorspace property");
}
return 0;
}
uint32_t DrmPlane::id() const {
return id_;
}
bool DrmPlane::GetCrtcSupported(const DrmCrtc &crtc) const {
return !!((1 << crtc.pipe()) & possible_crtc_mask_);
}
uint32_t DrmPlane::type() const {
return type_;
}
const char* DrmPlane::name() const{
return name_;
}
void DrmPlane::mark_type_by_name(){
if(isRK3588(soc_id_)){
struct plane_type_name_rk3588 {
DrmPlaneTypeRK3588 type;
const char *name;
};
struct plane_type_name_rk3588 plane_type_names_rk3588[] = {
{ PLANE_RK3588_CLUSTER0_WIN0, "Cluster0-win0" },
{ PLANE_RK3588_CLUSTER0_WIN1, "Cluster0-win1" },
{ PLANE_RK3588_CLUSTER1_WIN0, "Cluster1-win0" },
{ PLANE_RK3588_CLUSTER1_WIN1, "Cluster1-win1" },
{ PLANE_RK3588_CLUSTER2_WIN0, "Cluster2-win0" },
{ PLANE_RK3588_CLUSTER2_WIN1, "Cluster2-win1" },
{ PLANE_RK3588_CLUSTER3_WIN0, "Cluster3-win0" },
{ PLANE_RK3588_CLUSTER3_WIN1, "Cluster3-win1" },
{ PLANE_RK3588_ESMART0_WIN0, "Esmart0-win0" },
{ PLANE_RK3588_ESMART0_WIN1, "Esmart0-win1" },
{ PLANE_RK3588_ESMART0_WIN2, "Esmart0-win2" },
{ PLANE_RK3588_ESMART0_WIN3, "Esmart0-win3" },
{ PLANE_RK3588_ESMART1_WIN0, "Esmart1-win0" },
{ PLANE_RK3588_ESMART1_WIN1, "Esmart1-win1" },
{ PLANE_RK3588_ESMART1_WIN2, "Esmart1-win2" },
{ PLANE_RK3588_ESMART1_WIN3, "Esmart1-win3" },
{ PLANE_RK3588_ESMART2_WIN0, "Esmart2-win0" },
{ PLANE_RK3588_ESMART2_WIN1, "Esmart2-win1" },
{ PLANE_RK3588_ESMART2_WIN2, "Esmart2-win2" },
{ PLANE_RK3588_ESMART2_WIN3, "Esmart2-win3" },
{ PLANE_RK3588_ESMART3_WIN0, "Esmart3-win0" },
{ PLANE_RK3588_ESMART3_WIN1, "Esmart3-win1" },
{ PLANE_RK3588_ESMART3_WIN2, "Esmart3-win2" },
{ PLANE_RK3588_ESMART3_WIN3, "Esmart3-win3" },
{ PLANE_RK3588_Unknown, "unknown" },
};
for(int i = 0; i < ARRAY_SIZE(plane_type_names_rk3588); i++){
int ret;
bool find_name = false;
std::tie(ret,find_name) = name_property_.bitmask(plane_type_names_rk3588[i].name);
if(find_name){
win_type_ = plane_type_names_rk3588[i].type;
name_ = plane_type_names_rk3588[i].name;
break;
}
}
}else if(isRK356x(soc_id_)){
struct plane_type_name_rk356x {
DrmPlaneTypeRK356x type;
const char *name;
};
struct plane_type_name_rk356x plane_type_names_rk356x[] = {
{ DRM_PLANE_TYPE_CLUSTER0_WIN0, "Cluster0-win0" },
{ DRM_PLANE_TYPE_CLUSTER0_WIN1, "Cluster0-win1" },
{ DRM_PLANE_TYPE_CLUSTER1_WIN0, "Cluster1-win0" },
{ DRM_PLANE_TYPE_CLUSTER1_WIN1, "Cluster1-win1" },
{ DRM_PLANE_TYPE_ESMART0_WIN0, "Esmart0-win0" },
{ DRM_PLANE_TYPE_ESMART0_WIN1, "Esmart0-win1" },
{ DRM_PLANE_TYPE_ESMART0_WIN2, "Esmart0-win2" },
{ DRM_PLANE_TYPE_ESMART0_WIN3, "Esmart0-win3" },
{ DRM_PLANE_TYPE_ESMART1_WIN0, "Esmart1-win0" },
{ DRM_PLANE_TYPE_ESMART1_WIN1, "Esmart1-win1" },
{ DRM_PLANE_TYPE_ESMART1_WIN2, "Esmart1-win2" },
{ DRM_PLANE_TYPE_ESMART1_WIN3, "Esmart1-win3" },
{ DRM_PLANE_TYPE_SMART0_WIN0, "Smart0-win0" },
{ DRM_PLANE_TYPE_SMART0_WIN1, "Smart0-win1" },
{ DRM_PLANE_TYPE_SMART0_WIN2, "Smart0-win2" },
{ DRM_PLANE_TYPE_SMART0_WIN3, "Smart0-win3" },
{ DRM_PLANE_TYPE_SMART1_WIN0, "Smart1-win0" },
{ DRM_PLANE_TYPE_SMART1_WIN1, "Smart1-win1" },
{ DRM_PLANE_TYPE_SMART1_WIN2, "Smart1-win2" },
{ DRM_PLANE_TYPE_SMART1_WIN3, "Smart1-win3" },
{ DRM_PLANE_TYPE_VOP2_Unknown, "unknown" },
};
for(int i = 0; i < ARRAY_SIZE(plane_type_names_rk356x); i++){
int ret;
bool find_name = false;
std::tie(ret,find_name) = name_property_.bitmask(plane_type_names_rk356x[i].name);
if(find_name){
win_type_ = plane_type_names_rk356x[i].type;
name_ = plane_type_names_rk356x[i].name;
break;
}
}
}else if(isRK3399(soc_id_)){
struct plane_type_name_rk3399 {
DrmPlaneTypeRK3399 type;
const char *name;
};
struct plane_type_name_rk3399 plane_type_names_rk3399[] = {
{ DRM_PLANE_TYPE_VOP0_WIN0 , "VOP0-win0-0" },
{ DRM_PLANE_TYPE_VOP0_WIN1 , "VOP0-win1-0" },
{ DRM_PLANE_TYPE_VOP0_WIN2_0, "VOP0-win2-0" },
{ DRM_PLANE_TYPE_VOP0_WIN2_1, "VOP0-win2-1" },
{ DRM_PLANE_TYPE_VOP0_WIN2_2, "VOP0-win2-2" },
{ DRM_PLANE_TYPE_VOP0_WIN2_3, "VOP0-win2-3" },
{ DRM_PLANE_TYPE_VOP0_WIN3_0, "VOP0-win3-0" },
{ DRM_PLANE_TYPE_VOP0_WIN3_0, "VOP0-win3-1" },
{ DRM_PLANE_TYPE_VOP0_WIN3_0, "VOP0-win3-2" },
{ DRM_PLANE_TYPE_VOP0_WIN3_0, "VOP0-win3-3" },
{ DRM_PLANE_TYPE_VOP1_WIN0 , "VOP1-win0-0" },
{ DRM_PLANE_TYPE_VOP1_WIN2_0, "VOP1-win2-0" },
{ DRM_PLANE_TYPE_VOP1_WIN2_0, "VOP1-win2-1" },
{ DRM_PLANE_TYPE_VOP1_WIN2_0, "VOP1-win2-2" },
{ DRM_PLANE_TYPE_VOP1_WIN2_0, "VOP1-win2-3" },
{ DRM_PLANE_TYPE_VOP1_Unknown, "unknown" },
};
for(int i = 0; i < ARRAY_SIZE(plane_type_names_rk3399); i++){
int ret;
bool find_name = false;
std::tie(ret,find_name) = name_property_.bitmask(plane_type_names_rk3399[i].name);
if(find_name){
win_type_ = plane_type_names_rk3399[i].type;
name_ = plane_type_names_rk3399[i].name;
break;
}
}
}else if(isRK3528(soc_id_)){
struct plane_type_name_rk3528 {
DrmPlaneTypeRK3528 type;
const char *name;
};
struct plane_type_name_rk3528 plane_type_names_rk3528[] = {
{ PLANE_RK3528_CLUSTER0_WIN0, "Cluster0-win0" },
{ PLANE_RK3528_CLUSTER0_WIN1, "Cluster0-win1" },
{ PLANE_RK3528_ESMART0_WIN0, "Esmart0-win0" },
{ PLANE_RK3528_ESMART0_WIN1, "Esmart0-win1" },
{ PLANE_RK3528_ESMART0_WIN2, "Esmart0-win2" },
{ PLANE_RK3528_ESMART0_WIN3, "Esmart0-win3" },
{ PLANE_RK3528_ESMART1_WIN0, "Esmart1-win0" },
{ PLANE_RK3528_ESMART1_WIN1, "Esmart1-win1" },
{ PLANE_RK3528_ESMART1_WIN2, "Esmart1-win2" },
{ PLANE_RK3528_ESMART1_WIN3, "Esmart1-win3" },
{ PLANE_RK3528_ESMART2_WIN0, "Esmart2-win0" },
{ PLANE_RK3528_ESMART2_WIN1, "Esmart2-win1" },
{ PLANE_RK3528_ESMART2_WIN2, "Esmart2-win2" },
{ PLANE_RK3528_ESMART2_WIN3, "Esmart2-win3" },
{ PLANE_RK3528_ESMART3_WIN0, "Esmart3-win0" },
{ PLANE_RK3528_ESMART3_WIN1, "Esmart3-win1" },
{ PLANE_RK3528_ESMART3_WIN2, "Esmart3-win2" },
{ PLANE_RK3528_ESMART3_WIN3, "Esmart3-win3" },
{ PLANE_RK3528_Unknown, "unknown" },
};
for(int i = 0; i < ARRAY_SIZE(plane_type_names_rk3528); i++){
int ret;
bool find_name = false;
std::tie(ret,find_name) = name_property_.bitmask(plane_type_names_rk3528[i].name);
if(find_name){
win_type_ = plane_type_names_rk3528[i].type;
name_ = plane_type_names_rk3528[i].name;
break;
}
}
}else if(isRK3562(soc_id_)){
struct plane_type_name_rk3562 {
DrmPlaneTypeRK3562 type;
const char *name;
};
struct plane_type_name_rk3562 plane_type_names_rk3562[] = {
{ PLANE_RK3562_ESMART0_WIN0, "Esmart0-win0" },
{ PLANE_RK3562_ESMART0_WIN1, "Esmart0-win1" },
{ PLANE_RK3562_ESMART0_WIN2, "Esmart0-win2" },
{ PLANE_RK3562_ESMART0_WIN3, "Esmart0-win3" },
{ PLANE_RK3562_ESMART1_WIN0, "Esmart1-win0" },
{ PLANE_RK3562_ESMART1_WIN1, "Esmart1-win1" },
{ PLANE_RK3562_ESMART1_WIN2, "Esmart1-win2" },
{ PLANE_RK3562_ESMART1_WIN3, "Esmart1-win3" },
{ PLANE_RK3562_ESMART2_WIN0, "Esmart2-win0" },
{ PLANE_RK3562_ESMART2_WIN1, "Esmart2-win1" },
{ PLANE_RK3562_ESMART2_WIN2, "Esmart2-win2" },
{ PLANE_RK3562_ESMART2_WIN3, "Esmart2-win3" },
{ PLANE_RK3562_ESMART3_WIN0, "Esmart3-win0" },
{ PLANE_RK3562_ESMART3_WIN1, "Esmart3-win1" },
{ PLANE_RK3562_ESMART3_WIN2, "Esmart3-win2" },
{ PLANE_RK3562_ESMART3_WIN3, "Esmart3-win3" },
{ PLANE_RK3562_Unknown, "unknown" },
};
for(int i = 0; i < ARRAY_SIZE(plane_type_names_rk3562); i++){
int ret;
bool find_name = false;
std::tie(ret,find_name) = name_property_.bitmask(plane_type_names_rk3562[i].name);
if(find_name){
win_type_ = plane_type_names_rk3562[i].type;
name_ = plane_type_names_rk3562[i].name;
break;
}
}
}else{
HWC2_ALOGE("Can't find soc_id is %x",soc_id_);
}
}
uint64_t DrmPlane::win_type() const{
return win_type_;
}
const DrmProperty &DrmPlane::crtc_property() const {
return crtc_property_;
}
const DrmProperty &DrmPlane::fb_property() const {
return fb_property_;
}
const DrmProperty &DrmPlane::crtc_x_property() const {
return crtc_x_property_;
}
const DrmProperty &DrmPlane::crtc_y_property() const {
return crtc_y_property_;
}
const DrmProperty &DrmPlane::crtc_w_property() const {
return crtc_w_property_;
}
const DrmProperty &DrmPlane::crtc_h_property() const {
return crtc_h_property_;
}
const DrmProperty &DrmPlane::src_x_property() const {
return src_x_property_;
}
const DrmProperty &DrmPlane::src_y_property() const {
return src_y_property_;
}
const DrmProperty &DrmPlane::src_w_property() const {
return src_w_property_;
}
const DrmProperty &DrmPlane::src_h_property() const {
return src_h_property_;
}
const DrmProperty &DrmPlane::zpos_property() const {
return zpos_property_;
}
const DrmProperty &DrmPlane::rotation_property() const {
return rotation_property_;
}
const DrmProperty &DrmPlane::alpha_property() const {
return alpha_property_;
}
const DrmProperty &DrmPlane::blend_property() const {
return blend_mode_property_;
}
// RK support
const DrmProperty &DrmPlane::eotf_property() const {
return eotf_property_;
}
const DrmProperty &DrmPlane::colorspace_property() const {
return colorspace_property_;
}
const DrmProperty &DrmPlane::area_id_property() const {
return area_id_property_;
}
const DrmProperty &DrmPlane::share_id_property() const {
return share_id_property_;
}
const DrmProperty &DrmPlane::feature_property() const {
return feature_property_;
}
const DrmProperty &DrmPlane::name_property() const{
return name_property_;
}
const DrmProperty &DrmPlane::input_w_property() const{
return input_w_property_;
}
const DrmProperty &DrmPlane::input_h_property() const{
return input_h_property_;
}
const DrmProperty &DrmPlane::output_w_property() const{
return output_w_property_;
}
const DrmProperty &DrmPlane::output_h_property() const{
return output_h_property_;
}
const DrmProperty &DrmPlane::scale_rate_property() const{
return scale_rate_property_;
}
bool DrmPlane::get_scale(){
return b_scale_;
}
bool DrmPlane::get_rotate(){
return (rotate_ & DRM_PLANE_ROTATION_90)
|| (rotate_ & DRM_PLANE_ROTATION_270);
}
bool DrmPlane::get_hdr2sdr(){
return b_hdr2sdr_;
}
bool DrmPlane::get_sdr2hdr(){
return b_sdr2hdr_;
}
bool DrmPlane::get_afbc(){
return b_afbdc_;
}
bool DrmPlane::get_yuv(){
return b_yuv_;
}
int DrmPlane::get_input_w_max(){
return input_w_max_;
}
int DrmPlane::get_input_h_max(){
return input_h_max_;
}
int DrmPlane::get_output_w_max(){
return output_w_max_;
}
int DrmPlane::get_output_h_max(){
return output_h_max_;
}
void DrmPlane::set_yuv(bool b_yuv)
{
b_yuv_ = b_yuv;
}
bool DrmPlane::is_use(){
return b_use_;
}
void DrmPlane::set_use(bool b_use)
{
b_use_ = b_use;
}
bool DrmPlane::is_reserved(){
return bReserved_;
}
void DrmPlane::set_reserved(bool bReserved) {
bReserved_ = bReserved;
}
bool DrmPlane::is_support_scale(float scale_rate){
if(isRK3588(soc_id_)){
if((win_type_ & PLANE_RK3588_ALL_CLUSTER_MASK) > 0)
return (scale_rate >= scale_min_) && (scale_rate <= scale_max_);
// RK3588 Esmart scale down 1080x1920 => 135x240 颜色出现错误故认为缩小倍数8倍为不支持
else if((win_type_ & PLANE_RK3588_ALL_ESMART_MASK) > 0)
return (scale_rate > scale_min_) && (scale_rate <= scale_max_);
else
return scale_rate == 1.0;
}else{
if(get_scale()){
return (scale_rate >= scale_min_) && (scale_rate <= scale_max_);
}else{
return scale_rate == 1.0;
}
}
}
bool DrmPlane::is_support_input(int input_w, int input_h){
// RK platform VOP can't display src/dst w/h < 4 layer.
return (input_w <= input_w_max_ && input_w >= 4) &&
(input_h <= input_h_max_ && input_h >= 4);
}
bool DrmPlane::is_support_output(int output_w, int output_h){
// RK platform VOP can't display src/dst w/h < 4 layer.
return (output_w <= output_w_max_ && output_w >= 4) &&
(output_h <= output_h_max_ && output_h >= 4);
}
bool DrmPlane::is_support_format(uint32_t format, bool afbcd){
if(isRK3588(soc_id_)){
if((win_type_ & PLANE_RK3588_ALL_CLUSTER_MASK) > 0){
if(afbcd){
return support_format_list.count(format);
}else if(format == DRM_FORMAT_ABGR8888 ||
format == DRM_FORMAT_BGR888 ||
format == DRM_FORMAT_BGR565 ){
return true;
}else{
return false;
}
}else if((win_type_ & PLANE_RK3588_ALL_ESMART_MASK) > 0 && !afbcd)
return support_format_list.count(format);
else
return false;
}else if(isRK3528(soc_id_)){
if((win_type_ & PLANE_RK3528_ALL_CLUSTER_MASK) > 0){
// RK3528 Cluster 支持非AFBC的 RGBA1010102格式
if(format == HAL_PIXEL_FORMAT_RGBA_1010102 && !afbcd){
return true;
}
return support_format_list.count(format);
}else if((win_type_ & PLANE_RK3528_ALL_CLUSTER_MASK) == 0 && !afbcd)
return support_format_list.count(format);
else
return false;
}else if(isRK3562(soc_id_)){
if(!afbcd){
return support_format_list.count(format);
}else{
return false;
}
}else if(isRK356x(soc_id_)){
if((win_type_ & DRM_PLANE_TYPE_ALL_CLUSTER_MASK) > 0 && afbcd)
return support_format_list.count(format);
else if((win_type_ & DRM_PLANE_TYPE_ALL_CLUSTER_MASK) == 0 && !afbcd)
return support_format_list.count(format);
else
return false;
}else if(isRK3399(soc_id_)){
if(afbcd && get_afbc())
return support_format_list.count(format);
else if(!afbcd)
return support_format_list.count(format);
else
return false;
}else{
return false;
}
}
int DrmPlane::get_transform(){
return rotate_;
}
bool DrmPlane::is_support_transform(int transform){
return (transform & rotate_) == transform;
}
// 8K
int DrmPlane::get_input_w_max_8k(){
return 8096;
}
int DrmPlane::get_input_h_max_8k(){
return 4320;
}
int DrmPlane::get_output_w_max_8k(){
return 8096;
}
int DrmPlane::get_output_h_max_8k(){
return 4320;
}
bool DrmPlane::is_support_scale_8k(float scale_rate){
if(get_scale()){
if((win_type_ & PLANE_RK3588_ALL_CLUSTER_MASK) > 0){
return (scale_rate >= 0.9) && (scale_rate <= 1.1);
}else{
return (scale_rate >= scale_min_) && (scale_rate <= scale_max_);
}
}else{
return scale_rate == 1.0;
}
}
bool DrmPlane::is_support_input_8k(int input_w, int input_h){
// RK platform VOP can't display src/dst w/h < 4 layer.
return (input_w <= 8096 && input_w >= 4) && (input_h <= 4320 && input_h >= 4);
}
bool DrmPlane::is_support_output_8k(int output_w, int output_h){
// RK platform VOP can't display src/dst w/h < 4 layer.
return (output_w <= 8096 && output_w >= 4) && (output_h <= 4320 && output_h >= 4);
}
bool DrmPlane::is_support_transform_8k(int transform){
return (transform & DRM_PLANE_ROTATION_0) == transform;
}
const DrmProperty &DrmPlane::async_commit_property() const{
return async_commit_property_;
}
const DrmProperty &DrmPlane::kernel6_1_color_encoding() const{
return kernel6_1_color_encoding_;
}
const DrmProperty &DrmPlane::kernel6_1_color_range() const{
return kernel6_1_color_range_;
}
} // namespace android