CVarSet.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Core/CVarSet.h>
  6. #include <AnKi/Util/Xml.h>
  7. #include <AnKi/Util/Logger.h>
  8. #include <AnKi/Util/File.h>
  9. // Because some cvars set their default values
  10. #include <AnKi/Util/System.h>
  11. #include <AnKi/Shaders/Include/ClusteredShadingTypes.h>
  12. namespace anki {
  13. static constexpr Array<CString, U32(CVarSubsystem::kCount)> g_cvarSubsystemNames = {"Core", "R", "Gr", "Rsrc", "Scene"};
  14. void CVar::getFullNameInternal(Array<Char, 256>& arr) const
  15. {
  16. snprintf(arr.getBegin(), arr.getSize(), "%s.%s", g_cvarSubsystemNames[m_subsystem].cstr(), m_name.cstr());
  17. }
  18. CoreString CVar::getFullName() const
  19. {
  20. CoreString out;
  21. out.sprintf("%s.%s", g_cvarSubsystemNames[m_subsystem].cstr(), m_name.cstr());
  22. return out;
  23. }
  24. void CVarSet::registerCVar(CVar* cvar)
  25. {
  26. for([[maybe_unused]] CVar& it : m_cvars)
  27. {
  28. ANKI_ASSERT(it.m_name != cvar->m_name || it.m_subsystem != cvar->m_subsystem);
  29. }
  30. m_cvars.pushBack(cvar);
  31. }
  32. Error CVarSet::setMultiple(ConstWeakArray<const Char*> arr)
  33. {
  34. for(U32 i = 0; i < arr.getSize(); ++i)
  35. {
  36. ANKI_ASSERT(arr[i]);
  37. const CString varName = arr[i];
  38. // Get the value string
  39. ++i;
  40. if(i >= arr.getSize())
  41. {
  42. ANKI_CORE_LOGE("Expecting a command line argument after %s", varName.cstr());
  43. return Error::kUserData;
  44. }
  45. ANKI_ASSERT(arr[i]);
  46. const CString value = arr[i];
  47. // Find the CVar
  48. CVar* foundCVar = nullptr;
  49. Array<Char, 256> fullnameArr;
  50. for(CVar& it : m_cvars)
  51. {
  52. it.getFullNameInternal(fullnameArr);
  53. CString fullname = &fullnameArr[0];
  54. if(fullname == varName || it.m_name == varName)
  55. {
  56. if(foundCVar)
  57. {
  58. ANKI_CORE_LOGE("Command line arg %s has ambiguous name. Skipping", varName.cstr());
  59. }
  60. else
  61. {
  62. foundCVar = &it;
  63. }
  64. }
  65. }
  66. if(foundCVar)
  67. {
  68. #define ANKI_CVAR_NUMERIC_SET(type) \
  69. case CVar::Type::kNumeric##type: \
  70. { \
  71. type v; \
  72. err = value.toNumber(v); \
  73. if(!err) \
  74. { \
  75. static_cast<NumericCVar<type>&>(*foundCVar).set(v); \
  76. } \
  77. break; \
  78. }
  79. Error err = Error::kNone;
  80. switch(foundCVar->m_type)
  81. {
  82. case CVar::Type::kString:
  83. static_cast<StringCVar&>(*foundCVar).set(value);
  84. break;
  85. case CVar::Type::kBool:
  86. {
  87. U32 v;
  88. err = value.toNumber(v);
  89. if(!err)
  90. {
  91. static_cast<BoolCVar&>(*foundCVar).set(v != 0);
  92. }
  93. break;
  94. }
  95. ANKI_CVAR_NUMERIC_SET(U8)
  96. ANKI_CVAR_NUMERIC_SET(U16)
  97. ANKI_CVAR_NUMERIC_SET(U32)
  98. ANKI_CVAR_NUMERIC_SET(PtrSize)
  99. ANKI_CVAR_NUMERIC_SET(F32)
  100. default:
  101. ANKI_ASSERT(0);
  102. }
  103. if(err)
  104. {
  105. foundCVar->getFullNameInternal(fullnameArr);
  106. ANKI_CORE_LOGE("Wrong value for %s. Value will not be set", &fullnameArr[0]);
  107. }
  108. }
  109. else
  110. {
  111. ANKI_CORE_LOGE("Can't recognize command line argument: %s. Skipping", varName.cstr());
  112. }
  113. }
  114. return Error::kNone;
  115. }
  116. } // end namespace anki