File: test_amdgpu.cpp

package info (click to toggle)
mangohud 0.8.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 31,488 kB
  • sloc: cpp: 170,231; xml: 14,297; ansic: 11,983; python: 3,120; sh: 616; makefile: 13
file content (103 lines) | stat: -rw-r--r-- 3,571 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdint.h>
extern "C" {
#include <cmocka.h>
}
#include "stdio.h"
#include "../src/amdgpu.h"

#define UNUSED(x) (void)(x)

static void test_amdgpu_verify_metrics(void **state) {
    UNUSED(state);
    AMDGPU amdgpu("", 0x744c, 0x1002);

    assert_false(amdgpu.verify_metrics("./missing_file"));
    // unsupported struct size, format and content revision
    assert_false(amdgpu.verify_metrics("./gpu_metrics_invalid"));
    assert_true (amdgpu.verify_metrics("./gpu_metrics"));
}

static void test_amdgpu_get_instant_metrics(void **state) {
    UNUSED(state);
    struct amdgpu_common_metrics metrics;
    AMDGPU amdgpu("", 0x744c, 0x1002);
    std::string metrics_path;
    // fail fetch gpu_metrics file
    metrics_path = "./missing_file";
    amdgpu.get_instant_metrics(&metrics);

    // DGPU
    metrics_path = "./gpu_metrics";
    metrics = {};
    amdgpu.get_instant_metrics(&metrics);
    assert_int_equal(metrics.gpu_load_percent, 64);
    assert_float_equal(metrics.average_gfx_power_w, 33, 0);
    assert_float_equal(metrics.average_cpu_power_w, 0, 0);
    assert_int_equal(metrics.current_gfxclk_mhz, 2165);
    assert_int_equal(metrics.current_uclk_mhz, 1000);
    assert_int_equal(metrics.gpu_temp_c, 36);
    assert_int_equal(metrics.soc_temp_c, 0);
    assert_int_equal(metrics.apu_cpu_temp_c, 0);
    assert_false(metrics.is_power_throttled);
    assert_false(metrics.is_current_throttled);
    assert_false(metrics.is_temp_throttled);
    assert_false(metrics.is_other_throttled);

    // DGPU
    metrics_path = "./gpu_metrics_reserved_throttle_bits";
    metrics = {};
    amdgpu.get_instant_metrics(&metrics);
    assert_false(metrics.is_power_throttled);
    assert_false(metrics.is_current_throttled);
    assert_false(metrics.is_temp_throttled);
    assert_false(metrics.is_other_throttled);

    metrics_path = "./gpu_metrics_apu";
    metrics = {};
    amdgpu.get_instant_metrics(&metrics);
    assert_int_equal(metrics.gpu_load_percent, 100);
    assert_float_equal(metrics.average_gfx_power_w, 6.161, 0);
    assert_float_equal(metrics.average_cpu_power_w, 9.235, 0);
    assert_int_equal(metrics.current_gfxclk_mhz, 1040);
    assert_int_equal(metrics.current_uclk_mhz, 687);
    assert_int_equal(metrics.gpu_temp_c, 81);
    assert_int_equal(metrics.soc_temp_c, 71);
    assert_int_equal(metrics.apu_cpu_temp_c, 80);
    assert_true(metrics.is_power_throttled);
    assert_false(metrics.is_current_throttled);
    assert_false(metrics.is_temp_throttled);
    assert_false(metrics.is_other_throttled);
    // amdgpu binary with everything throttled
}

static void test_amdgpu_get_samples_and_copy(void **state) {
    UNUSED(state);
    AMDGPU amdgpu("", 0x744c, 0x1002);

    struct amdgpu_common_metrics metrics_buffer[100];
    bool gpu_load_needs_dividing = false;  //some GPUs report load as centipercent
    amdgpu.get_samples_and_copy(metrics_buffer, gpu_load_needs_dividing);
    gpu_load_needs_dividing = true;
    amdgpu.get_samples_and_copy(metrics_buffer, gpu_load_needs_dividing);
}

static void test_amdgpu_get_metrics(void **state) {
    UNUSED(state);
    AMDGPU amdgpu("", 0x744c, 0x1002);

    amdgpu.copy_metrics();
}

const struct CMUnitTest amdgpu_tests[] = {
    cmocka_unit_test(test_amdgpu_verify_metrics),
    cmocka_unit_test(test_amdgpu_get_instant_metrics),
    cmocka_unit_test(test_amdgpu_get_samples_and_copy),
    cmocka_unit_test(test_amdgpu_get_metrics)
};

int main(void) {
    return cmocka_run_group_tests(amdgpu_tests, NULL, NULL);
}