BuilderData.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <native/ui/BuilderData.h>
  9. #include <utilities/AssetUtilEBusHelper.h>
  10. #include <native/ui/BuilderDataItem.h>
  11. #include <AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h>
  12. #include <AzCore/StringFunc/StringFunc.h>
  13. #include <AzCore/std/smart_ptr/weak_ptr.h>
  14. #include <AzCore/std/smart_ptr/make_shared.h>
  15. namespace AssetProcessor
  16. {
  17. [[maybe_unused]] static constexpr char builderNotFoundWarningMessage[] =
  18. "Found a %s metric entry with builder %s \"%s\", but Asset Processor does not recognize this "
  19. "builder. Ensure this builder is in the asset folders and its name is shown "
  20. "in the Builders tab. If this builder was removed intentionally in the past, you can safely ignore this "
  21. "warning.\n";
  22. BuilderData::BuilderData(AZStd::shared_ptr<AzToolsFramework::AssetDatabase::AssetDatabaseConnection> dbConnection, QObject* parent)
  23. : m_dbConnection(dbConnection)
  24. , QObject(parent)
  25. {
  26. }
  27. void BuilderData::Reset()
  28. {
  29. BuilderInfoList builders;
  30. AssetBuilderInfoBus::Broadcast(&AssetBuilderInfoBus::Events::GetAllBuildersInfo, builders);
  31. m_root.reset(new BuilderDataItem(BuilderDataItem::ItemType::InvisibleRoot, "", 0, 0, AZStd::weak_ptr<BuilderDataItem>()));
  32. m_builderGuidToIndex.clear();
  33. m_builderNameToIndex.clear();
  34. {
  35. auto invisibleRoot = m_root->InsertChild(
  36. AZStd::make_shared<BuilderDataItem>(BuilderDataItem::ItemType::InvisibleRoot, "All builders", 0, 0, m_root));
  37. auto builder = invisibleRoot->InsertChild(
  38. AZStd::make_shared<BuilderDataItem>(BuilderDataItem::ItemType::Builder, "All builders", 0, 0, invisibleRoot));
  39. builder->InsertTaskTypesAsChildren(builder);
  40. }
  41. for (int i = 0; i < builders.size(); ++i)
  42. {
  43. auto invisibleRoot = m_root->InsertChild(
  44. AZStd::make_shared<BuilderDataItem>(BuilderDataItem::ItemType::InvisibleRoot, builders[i].m_name, 0, 0, m_root));
  45. auto builder = invisibleRoot->InsertChild(
  46. AZStd::make_shared<BuilderDataItem>(BuilderDataItem::ItemType::Builder, builders[i].m_name, 0, 0, invisibleRoot));
  47. builder->InsertTaskTypesAsChildren(builder);
  48. int builderIndex = invisibleRoot->GetRow();
  49. if (builderIndex >= 0)
  50. {
  51. m_builderGuidToIndex[builders[i].m_busId] = builderIndex;
  52. m_builderNameToIndex[builders[i].m_name] = builderIndex;
  53. }
  54. }
  55. // CreateJobs stat
  56. m_dbConnection->QueryStatLikeStatName(
  57. "CreateJobs,%",
  58. [this](AzToolsFramework::AssetDatabase::StatDatabaseEntry entry)
  59. {
  60. AZStd::vector<AZStd::string> tokens;
  61. AZ::StringFunc::Tokenize(entry.m_statName, tokens, ',');
  62. if (tokens.size() == 3) // CreateJobs,filePath,builderName
  63. {
  64. const auto& sourceName = tokens[1];
  65. const auto& builderName = tokens[2];
  66. if (m_builderNameToIndex.contains(builderName))
  67. {
  68. // Insert into specific builder stat
  69. m_root->GetChild(m_builderNameToIndex[builderName])->GetChild(0)
  70. ->UpdateOrInsertEntry(BuilderDataItem::TaskType::CreateJobs, sourceName, 1, entry.m_statValue);
  71. // Insert into all-builders stat
  72. m_root->GetChild(0)->GetChild(0)->UpdateOrInsertEntry(
  73. BuilderDataItem::TaskType::CreateJobs, sourceName, 1, entry.m_statValue);
  74. }
  75. else
  76. {
  77. AZ_Warning("AssetProcessor", false, builderNotFoundWarningMessage, "CreateJobs", "name", builderName.c_str());
  78. }
  79. }
  80. return true;
  81. });
  82. // ProcessJob stat
  83. m_dbConnection->QueryStatLikeStatName(
  84. "ProcessJob,%",
  85. [this](AzToolsFramework::AssetDatabase::StatDatabaseEntry stat)
  86. {
  87. AZStd::vector<AZStd::string> tokens;
  88. AZ::StringFunc::Tokenize(stat.m_statName, tokens, ',');
  89. if (tokens.size() == 5) // ProcessJob,sourceName,jobKey,platform,builderGuid
  90. {
  91. const auto& builderGuid = AZ::Uuid::CreateString(tokens[4].c_str());
  92. if (m_builderGuidToIndex.contains(builderGuid))
  93. {
  94. AZStd::string entryName;
  95. AZ::StringFunc::Join(entryName, tokens.begin() + 1, tokens.begin() + 4, ',');
  96. // Insert into specific builder stat
  97. m_root->GetChild(m_builderGuidToIndex[builderGuid])->GetChild(0)
  98. ->UpdateOrInsertEntry(BuilderDataItem::TaskType::ProcessJob, entryName, 1, stat.m_statValue);
  99. // Insert into all-builders stat
  100. m_root->GetChild(0)->GetChild(0)->UpdateOrInsertEntry(
  101. BuilderDataItem::TaskType::ProcessJob, entryName, 1, stat.m_statValue);
  102. }
  103. else
  104. {
  105. AZ_Warning("AssetProcessor", false, builderNotFoundWarningMessage, "ProcessJob", "bus ID", tokens[4].c_str());
  106. }
  107. }
  108. return true;
  109. });
  110. }
  111. void BuilderData::OnCreateJobsDurationChanged(QString sourceName, [[maybe_unused]] AZ::s64 scanFolderID)
  112. {
  113. QString statKey = QString("CreateJobs,").append(sourceName).append("%");
  114. m_dbConnection->QueryStatLikeStatName(
  115. statKey.toUtf8().constData(),
  116. [this](AzToolsFramework::AssetDatabase::StatDatabaseEntry entry)
  117. {
  118. AZStd::vector<AZStd::string> tokens;
  119. AZ::StringFunc::Tokenize(entry.m_statName, tokens, ',');
  120. if (tokens.size() == 3) // CreateJobs,filePath,builderName
  121. {
  122. const auto& sourceName = tokens[1];
  123. const auto& builderName = tokens[2];
  124. if (m_builderNameToIndex.contains(builderName))
  125. {
  126. AZStd::shared_ptr<BuilderDataItem> item = nullptr;
  127. // Insert into specific builder stat
  128. item = m_root->GetChild(m_builderNameToIndex[builderName])
  129. ->GetChild(0)
  130. ->UpdateOrInsertEntry(
  131. BuilderDataItem::TaskType::CreateJobs, sourceName, 1, entry.m_statValue);
  132. Q_EMIT DurationChanged(item.get());
  133. // Insert into all-builders stat
  134. item = m_root->GetChild(0)->GetChild(0)->UpdateOrInsertEntry(
  135. BuilderDataItem::TaskType::CreateJobs, builderName + "," + sourceName, 1, entry.m_statValue);
  136. Q_EMIT DurationChanged(item.get());
  137. }
  138. else
  139. {
  140. AZ_Warning("AssetProcessor", false, builderNotFoundWarningMessage, "CreateJobs", "name", builderName.c_str());
  141. }
  142. }
  143. return true;
  144. });
  145. }
  146. void BuilderData::OnProcessJobDurationChanged(JobEntry jobEntry, int value)
  147. {
  148. if (m_builderGuidToIndex.contains(jobEntry.m_builderGuid))
  149. {
  150. int builderIndex = m_builderGuidToIndex[jobEntry.m_builderGuid];
  151. AZStd::string entryName = AZStd::string::format(
  152. "%s,%s,%s",
  153. jobEntry.m_sourceAssetReference.RelativePath().c_str(),
  154. jobEntry.m_jobKey.toUtf8().constData(),
  155. jobEntry.m_platformInfo.m_identifier.c_str());
  156. AZStd::shared_ptr<BuilderDataItem> item = nullptr;
  157. // Insert into specific builder stat
  158. item = m_root->GetChild(builderIndex)
  159. ->GetChild(0)
  160. ->UpdateOrInsertEntry(BuilderDataItem::TaskType::ProcessJob, entryName, 1, value);
  161. Q_EMIT DurationChanged(item.get());
  162. // Insert into all-builders stat
  163. item = m_root->GetChild(0)->GetChild(0)->UpdateOrInsertEntry(BuilderDataItem::TaskType::ProcessJob, entryName, 1, value);
  164. Q_EMIT DurationChanged(item.get());
  165. }
  166. }
  167. }