You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
6.1 KiB
256 lines
6.1 KiB
/*
|
|
* Copyright (c) 2019, The Linux Foundation. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials provided
|
|
* with the distribution.
|
|
* * Neither the name of The Linux Foundation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
|
|
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __DRM_PROPERTY_H__
|
|
#define __DRM_PROPERTY_H__
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <map>
|
|
#include <unordered_map>
|
|
#include <xf86drmMode.h>
|
|
|
|
namespace sde_drm {
|
|
|
|
enum struct DRMProperty {
|
|
INVALID,
|
|
TYPE,
|
|
FB_ID,
|
|
CRTC_ID,
|
|
CRTC_X,
|
|
CRTC_Y,
|
|
CRTC_W,
|
|
CRTC_H,
|
|
SRC_X,
|
|
SRC_Y,
|
|
SRC_W,
|
|
SRC_H,
|
|
ZPOS,
|
|
ALPHA,
|
|
EXCL_RECT,
|
|
H_DECIMATE,
|
|
V_DECIMATE,
|
|
INPUT_FENCE,
|
|
ROTATION,
|
|
BLEND_OP,
|
|
SRC_CONFIG,
|
|
SCALER_V1,
|
|
SCALER_V2,
|
|
CSC_V1,
|
|
CAPABILITIES,
|
|
MODE_PROPERTIES,
|
|
LUT_ED,
|
|
LUT_CIR,
|
|
LUT_SEP,
|
|
ROTATOR_CAPS_V1,
|
|
TRUE_INLINE_ROT_REV,
|
|
FB_TRANSLATION_MODE,
|
|
ACTIVE,
|
|
MODE_ID,
|
|
OUTPUT_FENCE_OFFSET,
|
|
OUTPUT_FENCE,
|
|
ROI_V1,
|
|
CORE_CLK,
|
|
CORE_AB,
|
|
CORE_IB,
|
|
LLCC_AB,
|
|
LLCC_IB,
|
|
DRAM_AB,
|
|
DRAM_IB,
|
|
ROT_PREFILL_BW,
|
|
ROT_CLK,
|
|
SECURITY_LEVEL,
|
|
DIM_STAGES_V1,
|
|
IDLE_TIME,
|
|
RETIRE_FENCE,
|
|
DST_X,
|
|
DST_Y,
|
|
DST_W,
|
|
DST_H,
|
|
LP,
|
|
HDR_PROPERTIES,
|
|
DEST_SCALER,
|
|
DS_LUT_ED,
|
|
DS_LUT_CIR,
|
|
DS_LUT_SEP,
|
|
SDE_DSPP_GAMUT_V3,
|
|
SDE_DSPP_GAMUT_V4,
|
|
SDE_DSPP_GAMUT_V5,
|
|
SDE_DSPP_GC_V1,
|
|
SDE_DSPP_GC_V2,
|
|
SDE_DSPP_IGC_V2,
|
|
SDE_DSPP_IGC_V3,
|
|
SDE_DSPP_IGC_V4,
|
|
SDE_DSPP_PCC_V3,
|
|
SDE_DSPP_PCC_V4,
|
|
SDE_DSPP_PCC_V5,
|
|
SDE_DSPP_PA_HSIC_V1,
|
|
SDE_DSPP_PA_HSIC_V2,
|
|
SDE_DSPP_PA_SIXZONE_V1,
|
|
SDE_DSPP_PA_SIXZONE_V2,
|
|
SDE_DSPP_PA_MEMCOL_SKIN_V1,
|
|
SDE_DSPP_PA_MEMCOL_SKIN_V2,
|
|
SDE_DSPP_PA_MEMCOL_SKY_V1,
|
|
SDE_DSPP_PA_MEMCOL_SKY_V2,
|
|
SDE_DSPP_PA_MEMCOL_FOLIAGE_V1,
|
|
SDE_DSPP_PA_MEMCOL_FOLIAGE_V2,
|
|
SDE_DSPP_PA_MEMCOL_PROT_V1,
|
|
SDE_DSPP_PA_MEMCOL_PROT_V2,
|
|
AUTOREFRESH,
|
|
EXT_HDR_PROPERTIES,
|
|
HDR_METADATA,
|
|
MULTIRECT_MODE,
|
|
ROT_FB_ID,
|
|
SDE_DSPP_PA_DITHER_V1,
|
|
SDE_DSPP_PA_DITHER_V2,
|
|
SDE_PP_DITHER_V1,
|
|
SDE_PP_DITHER_V2,
|
|
INVERSE_PMA,
|
|
CSC_DMA_V1,
|
|
SDE_DGM_1D_LUT_IGC_V5,
|
|
SDE_DGM_1D_LUT_GC_V5,
|
|
SDE_VIG_1D_LUT_IGC_V5,
|
|
SDE_VIG_1D_LUT_IGC_V6,
|
|
SDE_VIG_3D_LUT_GAMUT_V5,
|
|
SDE_VIG_3D_LUT_GAMUT_V6,
|
|
SDE_DSPP_AD4_MODE,
|
|
SDE_DSPP_AD4_INIT,
|
|
SDE_DSPP_AD4_CFG,
|
|
SDE_DSPP_AD4_INPUT,
|
|
SDE_DSPP_AD4_BACKLIGHT,
|
|
SDE_DSPP_AD4_ROI,
|
|
SDE_DSPP_AD4_ASSERTIVENESS,
|
|
SDE_DSPP_AD4_STRENGTH,
|
|
SDE_DSPP_ABA_HIST_CTRL,
|
|
SDE_DSPP_ABA_HIST_IRQ,
|
|
SDE_DSPP_ABA_LUT,
|
|
SDE_DSPP_SV_BL_SCALE,
|
|
SDE_DSPP_BL_SCALE,
|
|
CAPTURE_MODE,
|
|
QSYNC_MODE,
|
|
IDLE_PC_STATE,
|
|
TOPOLOGY_CONTROL,
|
|
EDID,
|
|
SDE_LTM_VERSION,
|
|
SDE_LTM_INIT,
|
|
SDE_LTM_CFG,
|
|
SDE_LTM_NOISE_THRESH,
|
|
SDE_LTM_HIST_CTRL,
|
|
SDE_LTM_BUFFER_CTRL,
|
|
SDE_LTM_QUEUE_BUFFER,
|
|
SDE_LTM_QUEUE_BUFFER2,
|
|
SDE_LTM_QUEUE_BUFFER3,
|
|
SDE_LTM_VLUT,
|
|
FRAME_TRIGGER,
|
|
COLORSPACE,
|
|
SUPPORTED_COLORSPACES,
|
|
SDE_SSPP_LAYOUT,
|
|
|
|
// Insert above
|
|
MAX
|
|
};
|
|
|
|
struct DRMPropertyManager {
|
|
DRMProperty GetPropertyEnum(const std::string &name) const;
|
|
|
|
void SetPropertyId(DRMProperty prop_enum, uint32_t prop_id) {
|
|
properties_[(uint32_t)prop_enum] = prop_id;
|
|
}
|
|
|
|
uint32_t GetPropertyId(DRMProperty prop_enum) const {
|
|
return properties_[(uint32_t)prop_enum];
|
|
}
|
|
|
|
bool IsPropertyAvailable(DRMProperty prop_enum) const {
|
|
return !!properties_[(uint32_t)prop_enum];
|
|
}
|
|
|
|
private:
|
|
uint32_t properties_[(uint32_t)DRMProperty::MAX] {};
|
|
};
|
|
|
|
struct DRMObject {
|
|
virtual ~DRMObject() = default;
|
|
virtual uint32_t GetObjectId() = 0;
|
|
void Dump() {};
|
|
|
|
void AddProperty(DRMProperty prop, uint64_t value, bool force_dirty = false);
|
|
void RemoveProperty(DRMProperty prop);
|
|
size_t ApplyDirtyProperties(drmModeAtomicReq *req);
|
|
void DiscardDirtyProperties() { dirty_values_.clear(); }
|
|
void ClearProperties();
|
|
void CommitProperties();
|
|
|
|
protected:
|
|
explicit DRMObject(DRMPropertyManager &pm);
|
|
|
|
private:
|
|
std::unordered_map<uint32_t, uint64_t> property_values_ {};
|
|
// store properties ordered by prop_id to avoid re-sort in libdrm
|
|
std::map<uint32_t, uint64_t, std::greater<uint32_t>> dirty_values_ {};
|
|
DRMPropertyManager& property_manager_;
|
|
};
|
|
|
|
template<class T>
|
|
struct DRMObjectManager {
|
|
virtual ~DRMObjectManager() = default;
|
|
void DumpById(uint32_t id) { object_pool_.at(id)->Dump(); }
|
|
void DumpAll() {
|
|
for (auto &obj : object_pool_)
|
|
obj.second->Dump();
|
|
}
|
|
|
|
size_t ApplyDirtyProperties(drmModeAtomicReq *req) {
|
|
size_t dirty_count = 0;
|
|
for (auto &obj : object_pool_)
|
|
dirty_count += obj.second->ApplyDirtyProperties(req);
|
|
|
|
return dirty_count;
|
|
}
|
|
|
|
void ClearProperties() {
|
|
for (auto &obj : object_pool_)
|
|
obj.second->ClearProperties();
|
|
}
|
|
|
|
T* GetObject(uint32_t obj_id) {
|
|
auto it = object_pool_.find(obj_id);
|
|
if (it == object_pool_.end())
|
|
return nullptr;
|
|
return it->second.get();
|
|
}
|
|
protected:
|
|
// store objects ordered by obj_id to avoid re-sort in libdrm
|
|
std::map<uint32_t, std::unique_ptr<T>> object_pool_{};
|
|
};
|
|
|
|
} // namespace sde_drm
|
|
|
|
#endif // __DRM_PROPERTY_H__
|