blob: 4ca77efe13a9f5effc236669dc411b6f7caa9ea3 [file] [log] [blame]
/*
* Copyright (c) 2021-2022, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file media_user_setting.h
//! \brief The interface of media user setting
//! \details This class is the implementation of media user setting interface. We need several steps to use the media
//! user setting.
//! 1) Declare the definition of media user setting item in initialize function, just like:
//! DeclareUserSettingKey("User Setting", MediaUserSetting::Device, MediaUserSetting::Value(true), true);
//! If the setting item is only can be user in relase-internal/debug mode:
//! DeclareUserSettingKeyForDebug("User Setting", MediaUserSetting::Device, MediaUserSetting::Value(true), true);
//! If the return value is MOS_STATUS_FILE_EXISTS, means "User Setting" has been used.
//! 2) Then we can use ReadUserSetting to read the value of the specific media user setting item.
//! If you want to provide the customized default value if failed call like:
//! ReadUserSetting(value, "User Setting", MediaUserSetting::Device, m_osInterface->pOsContext, true, true);
//! If you don't want to provide the customized default value:
//! ReadUserSetting(value, "User Setting", MediaUserSetting::Device, m_osInterface->pOsContext);
//! 3) If you want to write specific media user setting to configuration path, call:
//! WriteUserSetting("User Setting", MediaUserSetting::Value(false), m_osInterface->pOsContext)
//! If you just want to report the value of specific setting item, need to call like:
//! ReportUserSetting("User Setting", MediaUserSetting::Value(false), m_osInterface->pOsContext)
//!
#ifndef __MEDIA_USER_SETTING__H__
#define __MEDIA_USER_SETTING__H__
#include <memory>
#include <string>
#include <map>
#include "media_user_setting_configure.h"
namespace MediaUserSetting {
class MediaUserSetting
{
public:
//!
//! \brief Constructor
//!
MediaUserSetting();
//!
//! \brief Constructor
//!
MediaUserSetting(MOS_USER_FEATURE_KEY_PATH_INFO *keyPathInfo);
//!
//! \brief Static entrypoint, get the instance of media user setting
//! \return std::shared_ptr<MediaUserSetting>
//! Pointer of media user setting
//!
static std::shared_ptr<MediaUserSetting> Instance();
//!
//! \brief Destroy media user setting
//! \return void
//!
static void Destroy();
//!
//! \brief Register user setting item
//! \param [in] valueName
//! Name of the item
//! \param [in] group
//! Group of the item
//! \param [in] defaultValue
//! The default value of the item
//! \param [in] isReportKey
//! Whether this item can be reported
//! \param [in] debugOnly
//! Whether this item is only for debug/release-internal
//! \param [in] useCustomPath
//! Specifiy a read path
//! \param [in] customPath
//! The specified read path
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if no error, otherwise will return failed reason
//!
MOS_STATUS Register(
const std::string &valueName,
const Group &group,
const Value &defaultValue,
bool isReportKey = false,
bool debugOnly = false,
bool useCustomPath = false,
const std::string &customPath = "",
bool statePath = true);
//!
//! \brief Read value of specific item
//! \param [out] value
//! The return value of the item
//! \param [in] valueName
//! Name of the item
//! \param [in] group
//! Group of the item
//! \param [in] mosContext
//! The pointer of mos context
//! \param [in] customValue
//! The custom value when failed
//! \param [in] useCustomValue
//! Whether use costom value when failed
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if no error, otherwise will return failed reason
//!
MOS_STATUS Read(Value &value,
const std::string &valueName,
const Group &group,
const Value &customValue = Value(),
bool useCustomValue = false);
//!
//! \brief Write value to specific item
//! \param [in] valueName
//! Name of the item
//! \param [in] value
//! The value write to specific item
//! \param [in] group
//! Group of the item
//! \param [in] mosContext
//! The pointer of mos context
//! \param [in] isForReport
//! This call is for reporting a item value or modify the value of the item
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if no error, otherwise will return failed reason
//!
MOS_STATUS Write(
const std::string &valueName,
const Value &value,
const Group &group,
bool isForReport = false);
//!
//! \brief Check whether the key has been registered
//! \param [in] valueName
//! Name of the item
//! \return bool
//! true if user setting key has registered, otherwise will return false
//!
bool IsDeclaredUserSetting(const std::string &valueName);
//!
//! \brief Get media user setting definitions of specific group
//! \param [in] group
//! Group of the item
//! \return Media user setting definitions
//! Definitions of specific group, return definitions of device group if failed
//!
inline Internal::Definitions &GetDefinitions(const Group &group)
{
return m_configure.GetDefinitions(group);
}
protected:
static std::shared_ptr<MediaUserSetting> m_instance;
Internal::Configure m_configure{}; //!< The pointer of Configure
};
}
using MediaUserSettingSharedPtr = std::shared_ptr<MediaUserSetting::MediaUserSetting>;
inline MOS_STATUS DeclareUserSettingKey(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &defaultValue,
bool isReportKey,
bool useCustomPath = false,
const std::string &customPath = "",
bool statePath = true)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Register(valueName, group, defaultValue, isReportKey, false, useCustomPath, customPath, statePath);
}
inline MOS_STATUS ReadUserSetting(
MediaUserSettingSharedPtr userSetting,
MediaUserSetting::Value &value,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &customValue = MediaUserSetting::Value(),
bool useCustomValue = false)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
auto status = instance->Read(value, valueName, group, customValue, useCustomValue);
if(status != MOS_STATUS_SUCCESS)
{
MOS_OS_NORMALMESSAGE("User setting %s read error", valueName.c_str());
}
return status;
}
template <typename T>
inline MOS_STATUS ReadUserSetting(
MediaUserSettingSharedPtr userSetting,
T &value,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &customValue = MediaUserSetting::Value(),
bool useCustomValue = false)
{
MediaUserSetting::Value outValue;
MOS_STATUS status = ReadUserSetting(userSetting, outValue, valueName, group, customValue, useCustomValue);
//If user setting is not set, outValue is the default value or customValue value if useCustomValue == true.
//If the user setting is not registered, it is not allowed to read a value for it. Set it with the inital outValue.
value = outValue.Get<T>();
return status;
}
inline MOS_STATUS WriteUserSetting(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Value &value,
const MediaUserSetting::Group &group)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Write(valueName, value, group);
}
inline MOS_STATUS ReportUserSetting(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Value &value,
const MediaUserSetting::Group &group)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Write(valueName, value, group, true);
}
inline bool IsDeclaredUserSetting(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->IsDeclaredUserSetting(valueName);
}
#if (_DEBUG || _RELEASE_INTERNAL)
inline MOS_STATUS DeclareUserSettingKeyForDebug(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &defaultValue,
bool isReportKey,
bool useCustomPath = false,
const std::string &customPath = "",
bool statePath = true)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Register(valueName, group, defaultValue, isReportKey, true, useCustomPath, customPath, statePath);
}
inline MOS_STATUS ReadUserSettingForDebug(
MediaUserSettingSharedPtr userSetting,
MediaUserSetting::Value &value,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &customValue = MediaUserSetting::Value(),
bool useCustomValue = false)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
auto status = instance->Read(value, valueName, group, customValue, useCustomValue);
if(status != MOS_STATUS_SUCCESS)
{
MOS_OS_NORMALMESSAGE("User setting %s read error", valueName.c_str());
}
return status;
}
template <typename T>
inline MOS_STATUS ReadUserSettingForDebug(
MediaUserSettingSharedPtr userSetting,
T &value,
const std::string &valueName,
const MediaUserSetting::Group &group,
const MediaUserSetting::Value &customValue = MediaUserSetting::Value(),
bool useCustomValue = false)
{
MediaUserSetting::Value outValue;
MOS_STATUS status = ReadUserSettingForDebug(userSetting, outValue, valueName, group, customValue, useCustomValue);
//If user setting is not set, outValue is the default value or customValue value if useCustomValue == true.
//If the user setting is not registered, it is not allowed to read a value for it. Set it with the inital outValue.
value = outValue.Get<T>();
return status;
}
inline MOS_STATUS WriteUserSettingForDebug(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Value &value,
const MediaUserSetting::Group &group)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Write(valueName, value, group);
}
inline MOS_STATUS ReportUserSettingForDebug(
MediaUserSettingSharedPtr userSetting,
const std::string &valueName,
const MediaUserSetting::Value &value,
const MediaUserSetting::Group &group)
{
MediaUserSettingSharedPtr instance = userSetting;
if (userSetting == nullptr)
{
instance = MediaUserSetting::MediaUserSetting::Instance();
}
return instance->Write(valueName, value, group, true);
}
#else
#define DeclareUserSettingKeyForDebug(userSetting, valueName, group, defaultValue, isReportKey, ...) MOS_STATUS_SUCCESS
#define ReadUserSettingForDebug(userSetting, value, valueName, group, customValue, useCustomValue) MOS_STATUS_SUCCESS
#define WriteUserSettingForDebug(userSetting, valueName, value, group) MOS_STATUS_SUCCESS
#define ReportUserSettingForDebug(userSetting, valueName, value, group) MOS_STATUS_SUCCESS
#endif
template <typename T, typename U = int>
class UserSettingInstanceOpsT
{
public:
MediaUserSettingSharedPtr GetUserSettingInstancePtr(T *object)
{
return MediaUserSetting::MediaUserSetting::Instance();
}
};
template <typename T>
class UserSettingInstanceOpsT<T, decltype(T::m_userSettingPtr, 0)>
{
public:
MediaUserSettingSharedPtr GetUserSettingInstancePtr(T *object)
{
if (object && object->m_userSettingPtr)
{
return object->m_userSettingPtr;
}
return MediaUserSetting::MediaUserSetting::Instance();
}
};
template <typename T>
inline MediaUserSettingSharedPtr GetUserSettingInstance(T *p)
{
UserSettingInstanceOpsT<T> ops;
return ops.GetUserSettingInstancePtr(p);
}
#endif