diff --git a/power_overwhelming/include/power_overwhelming/adl_sensor_source.h b/power_overwhelming/include/power_overwhelming/adl_sensor_source.h
index c8a64c14..03548f64 100644
--- a/power_overwhelming/include/power_overwhelming/adl_sensor_source.h
+++ b/power_overwhelming/include/power_overwhelming/adl_sensor_source.h
@@ -20,25 +20,30 @@ namespace power_overwhelming {
enum class adl_sensor_source : std::uint32_t {
///
- ///
+ /// ADL_PMLOG_SOC_POWER.
///
soc = 0x0001,
///
- ///
+ /// ADL_PMLOG_GFX_POWER.
///
graphics = 0x0002,
///
- ///
+ /// ADL_PMLOG_ASIC_POWER or ADL_PMLOG_SSPAIRED_ASICPOWER.
///
asic = 0x0004,
///
- ///
+ /// ADL_PMLOG_CPU_POWER.
///
cpu = 0x0008,
+ ///
+ /// Total board power (ADL_PMLOG_BOARD_POWER).
+ ///
+ board = 0x0010,
+
///
/// Represents all possible sensor sources.
///
diff --git a/power_overwhelming/src/adl_sensor.cpp b/power_overwhelming/src/adl_sensor.cpp
index 10c3d24e..3ca56442 100644
--- a/power_overwhelming/src/adl_sensor.cpp
+++ b/power_overwhelming/src/adl_sensor.cpp
@@ -1,5 +1,5 @@
//
-// Copyright © 2021 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten.
+// Copyright © 2021 - 2023 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten.
//
// Christoph Müller
@@ -35,6 +35,8 @@ namespace detail {
template
std::size_t for_adapter(TIterator oit, adl_scope& scope,
const AdapterInfo& adapter, const adl_sensor_source source) {
+#define _PWROWG_ENABLED(haystack, needle) ((haystack & needle) == needle)
+
int isActive = 0;
std::size_t retval = 0;
ADLPMLogSupportInfo supportInfo;
@@ -60,7 +62,7 @@ namespace detail {
}
// Now, check all of the supported sensor sources.
- if ((source & adl_sensor_source::asic) == adl_sensor_source::asic) {
+ if (_PWROWG_ENABLED(source, adl_sensor_source::asic)) {
auto source = adl_sensor_source::asic;
auto ids = detail::adl_sensor_impl::get_sensor_ids(source,
supportInfo);
@@ -73,7 +75,7 @@ namespace detail {
}
}
- if ((source & adl_sensor_source::cpu) == adl_sensor_source::cpu) {
+ if (_PWROWG_ENABLED(source, adl_sensor_source::cpu)) {
auto source = adl_sensor_source::cpu;
auto ids = detail::adl_sensor_impl::get_sensor_ids(source,
supportInfo);
@@ -86,8 +88,7 @@ namespace detail {
}
}
- if ((source & adl_sensor_source::graphics)
- == adl_sensor_source::graphics) {
+ if (_PWROWG_ENABLED(source, adl_sensor_source::graphics)) {
auto source = adl_sensor_source::graphics;
auto ids = detail::adl_sensor_impl::get_sensor_ids(source,
supportInfo);
@@ -100,7 +101,7 @@ namespace detail {
}
}
- if ((source & adl_sensor_source::soc) == adl_sensor_source::soc) {
+ if (_PWROWG_ENABLED(source, adl_sensor_source::soc)) {
auto source = adl_sensor_source::soc;
auto ids = detail::adl_sensor_impl::get_sensor_ids(source,
supportInfo);
@@ -113,7 +114,21 @@ namespace detail {
}
}
+ if (_PWROWG_ENABLED(source, adl_sensor_source::board)) {
+ auto source = adl_sensor_source::board;
+ auto ids = detail::adl_sensor_impl::get_sensor_ids(source,
+ supportInfo);
+
+ if (!ids.empty()) {
+ auto impl = new detail::adl_sensor_impl(adapter);
+ impl->configure_source(source, std::move(ids));
+ *oit++ = adl_sensor(std::move(impl));
+ ++retval;
+ }
+ }
+
return retval;
+#undef _PWROWG_ENABLED
}
///
@@ -236,7 +251,7 @@ visus::power_overwhelming::adl_sensor::from_index(_In_ const int index,
throw adl_exception(status);
}
- throw "TODO";
+ throw "TODO: Implement retrieval from index.";
return retval;
}
diff --git a/power_overwhelming/src/adl_sensor_impl.cpp b/power_overwhelming/src/adl_sensor_impl.cpp
index 99fb14f3..94479395 100644
--- a/power_overwhelming/src/adl_sensor_impl.cpp
+++ b/power_overwhelming/src/adl_sensor_impl.cpp
@@ -96,11 +96,17 @@ visus::power_overwhelming::detail::adl_sensor_impl::get_sensor_ids(
const adl_sensor_source source) {
switch (source) {
case adl_sensor_source::asic:
- return std::vector { ADL_PMLOG_ASIC_POWER };
+ // HAZARD: We assume that only one of these can be set at the
+ // same time, but we cannot prove this from the docs.
+ return std::vector { ADL_PMLOG_ASIC_POWER,
+ ADL_PMLOG_SSPAIRED_ASICPOWER };
case adl_sensor_source::cpu:
return std::vector { ADL_PMLOG_CPU_POWER };
+ case adl_sensor_source::board:
+ return std::vector { ADL_PMLOG_BOARD_POWER };
+
case adl_sensor_source::graphics:
return std::vector { ADL_PMLOG_GFX_VOLTAGE,
ADL_PMLOG_GFX_CURRENT, ADL_PMLOG_GFX_POWER };
@@ -180,9 +186,11 @@ bool visus::power_overwhelming::detail::adl_sensor_impl::is_power(
const ADL_PMLOG_SENSORS id) {
switch (id) {
case ADL_PMLOG_ASIC_POWER:
+ case ADL_PMLOG_BOARD_POWER:
case ADL_PMLOG_CPU_POWER:
case ADL_PMLOG_GFX_POWER:
case ADL_PMLOG_SOC_POWER:
+ case ADL_PMLOG_SSPAIRED_ASICPOWER:
return true;
default:
@@ -285,6 +293,11 @@ void visus::power_overwhelming::detail::adl_sensor_impl::configure_source(
+ L"/" + std::to_wstring(this->adapter_index);
break;
+ case adl_sensor_source::board:
+ this->sensor_name = L"ADL/BOARD/" + this->device_name
+ + L"/" + std::to_wstring(this->adapter_index);
+ break;
+
case adl_sensor_source::cpu:
this->sensor_name = L"ADL/CPU/" + this->device_name
+ L"/" + std::to_wstring(this->adapter_index);
diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt
index 20b9f170..496deeb6 100644
--- a/third_party/CMakeLists.txt
+++ b/third_party/CMakeLists.txt
@@ -12,7 +12,7 @@ mark_as_advanced(FORCE
# AMD Display Library (this is a bit hacky ...)
FetchContent_Declare(adl
- URL "https://github.com/GPUOpen-LibrariesAndSDKs/display-library/archive/17.0.tar.gz"
+ URL "https://github.com/GPUOpen-LibrariesAndSDKs/display-library/archive/17.1.tar.gz"
)
FetchContent_MakeAvailable(adl)
add_library(adl INTERFACE IMPORTED GLOBAL)