9992b92f创建于 2023年10月8日历史提交
/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * 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.
 */

#ifndef DRM_PLANE_H
#define DRM_PLANE_H
#include <cinttypes>
#include <string>
#include <vector>
#include <xf86drm.h>
#include <xf86drmMode.h>

namespace OHOS {
namespace HDI {
namespace DISPLAY {
enum class DrmPropertyType {
    DRM_PROPERTY_TYPE_INT,
    DRM_PROPERTY_TYPE_ENUM,
    DRM_PROPERTY_TYPE_OBJECT,
    DRM_PROPERTY_TYPE_BLOB,
    DRM_PROPERTY_TYPE_BITMASK,
    DRM_PROPERTY_TYPE_INVALID,
};

enum class DrmPlaneType {
    DRM_PLANE_TYPE_CLUSTER0_WIN0 = 1 << 0,
    DRM_PLANE_TYPE_CLUSTER0_WIN1 = 1 << 1,

    DRM_PLANE_TYPE_CLUSTER1_WIN0 = 1 << 2,
    DRM_PLANE_TYPE_CLUSTER1_WIN1 = 1 << 3,

    DRM_PLANE_TYPE_ESMART0_WIN0 = 1 << 4,
    DRM_PLANE_TYPE_ESMART0_WIN1 = 1 << 5,
    DRM_PLANE_TYPE_ESMART0_WIN2 = 1 << 6,
    DRM_PLANE_TYPE_ESMART0_WIN3 = 1 << 7,

    DRM_PLANE_TYPE_ESMART1_WIN0 = 1 << 8,
    DRM_PLANE_TYPE_ESMART1_WIN1 = 1 << 9,
    DRM_PLANE_TYPE_ESMART1_WIN2 = 1 << 10,
    DRM_PLANE_TYPE_ESMART1_WIN3 = 1 << 11,

    DRM_PLANE_TYPE_SMART0_WIN0 = 1 << 12,
    DRM_PLANE_TYPE_SMART0_WIN1 = 1 << 13,
    DRM_PLANE_TYPE_SMART0_WIN2 = 1 << 14,
    DRM_PLANE_TYPE_SMART0_WIN3 = 1 << 15,

    DRM_PLANE_TYPE_SMART1_WIN0 = 1 << 16,
    DRM_PLANE_TYPE_SMART1_WIN1 = 1 << 17,
    DRM_PLANE_TYPE_SMART1_WIN2 = 1 << 18,
    DRM_PLANE_TYPE_SMART1_WIN3 = 1 << 19,

    DRM_PLANE_TYPE_CLUSTER0_MASK = 0x3,
    DRM_PLANE_TYPE_CLUSTER1_MASK = 0xc,
    DRM_PLANE_TYPE_CLUSTER_MASK = 0xf,
    DRM_PLANE_TYPE_ESMART0_MASK = 0xf0,
    DRM_PLANE_TYPE_ESMART1_MASK = 0xf00,
    DRM_PLANE_TYPE_SMART0_MASK  = 0xf000,
    DRM_PLANE_TYPE_SMART1_MASK  = 0xf0000,
    DRM_PLANE_TYPE_Unknown      = 0xffffffff,
};

struct PlaneMaskName {
    DrmPlaneType mask;
    const char *name;
};

struct PlaneTypeName {
    DrmPlaneType type;
    const char *name;
};

const std::string PROP_FBID = "FB_ID";
const std::string PROP_IN_FENCE_FD = "IN_FENCE_FD";
const std::string PROP_CRTC_ID = "CRTC_ID";
const std::string PROP_TYPE = "type";

const std::string PROP_CRTC_X_ID = "CRTC_X";
const std::string PROP_CRTC_Y_ID = "CRTC_Y";
const std::string PROP_CRTC_W_ID = "CRTC_W";
const std::string PROP_CRTC_H_ID = "CRTC_H";

const std::string PROP_SRC_X_ID = "SRC_X";
const std::string PROP_SRC_Y_ID = "SRC_Y";
const std::string PROP_SRC_W_ID = "SRC_W";
const std::string PROP_SRC_H_ID = "SRC_H";

const std::string PROP_ZPOS_ID = "zpos";

class DrmDevice;

class DrmPlane {
public:
    explicit DrmPlane(drmModePlane &p);
    virtual ~DrmPlane();
    int32_t Init(DrmDevice &drmDevice);
    int GetCrtcProp(DrmDevice &drmDevice);
    int GetSrcProp(DrmDevice &drmDevice);
    int GetNameProp(DrmDevice &drmDevice);
    uint32_t GetId() const
    {
        return mId;
    }
    uint32_t GetPropFbId() const
    {
        return mPropFbId;
    }
    uint32_t GetPropCrtc_xId() const
    {
        return mPropCrtc_xId;
    }
    uint32_t GetPropCrtc_yId() const
    {
        return mPropCrtc_yId;
    }
    uint32_t GetPropCrtc_wId() const
    {
        return mPropCrtc_wId;
    }
    uint32_t GetPropCrtc_hId() const
    {
        return mPropCrtc_hId;
    }
    uint32_t GetPropSrc_xId() const
    {
        return mPropSrc_xId;
    }
    uint32_t GetPropSrc_yId() const
    {
        return mPropSrc_yId;
    }
    uint32_t GetPropSrc_wId() const
    {
        return mPropSrc_wId;
    }
    uint32_t GetPropSrc_hId() const
    {
        return mPropSrc_hId;
    }
    uint32_t GetPropZposId() const
    {
        return mPropZposId;
    }
    uint32_t GetPropFenceInId() const
    {
        return mPropFenceInId;
    }
    uint32_t GetPropCrtcId() const
    {
        return mPropCrtcId;
    }
    uint32_t GetPossibleCrtcs() const
    {
        return mPossibleCrtcs;
    }
    uint32_t GetType() const
    {
        return mType;
    }
    void BindToPipe(uint32_t pipe)
    {
        mPipe = pipe;
    }
    void UnBindPipe()
    {
        mPipe = 0;
    }
    bool IsIdle() const
    {
        return (mPipe == 0);
    }
    uint32_t GetCrtcId()
    {
        return mCrtcId;
    }
    uint32_t GetPipe()
    {
        return mPipe;
    }
    DrmPlaneType GetWinType()
    {
        return mWinType;
    }
    std::string GetName()
    {
        return mName;
    }
private:
    uint32_t mId = 0;
    uint32_t mPossibleCrtcs = 0;
    uint32_t mCrtcId = 0;
    uint32_t mPropFbId = 0;
    uint32_t mPropFenceInId = 0;
    uint32_t mPropCrtcId = 0;
    DrmPlaneType mWinType = DrmPlaneType::DRM_PLANE_TYPE_Unknown;
    std::string mName;

    uint32_t mPropCrtc_xId = 0;
    uint32_t mPropCrtc_yId = 0;
    uint32_t mPropCrtc_wId = 0;
    uint32_t mPropCrtc_hId = 0;

    uint32_t mPropSrc_xId = 0;
    uint32_t mPropSrc_yId = 0;
    uint32_t mPropSrc_wId = 0;
    uint32_t mPropSrc_hId = 0;

    uint32_t mPropZposId = 0;

    uint32_t mPipe = 0;
    uint32_t mType = 0;
    std::vector<uint32_t> mFormats;
};
} // namespace OHOS
} // namespace HDI
} // namespace DISPLAY

#endif // DRM_PLANE_H