Coverage Report

Created: 2024-05-20 07:14

/src/skia/tools/gpu/GpuTimer.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2016 Google Inc.
3
 *
4
 * Use of this source code is governed by a BSD-style license that can be
5
 * found in the LICENSE file.
6
 */
7
8
#ifndef GpuTimer_DEFINED
9
#define GpuTimer_DEFINED
10
11
#include "include/core/SkTypes.h"
12
13
#include <chrono>
14
15
namespace sk_gpu_test {
16
17
using PlatformTimerQuery = uint64_t;
18
static constexpr PlatformTimerQuery kInvalidTimerQuery = 0;
19
20
/**
21
 * Platform-independent interface for timing operations on the GPU.
22
 */
23
class GpuTimer {
24
public:
25
    GpuTimer(bool disjointSupport)
26
        : fDisjointSupport(disjointSupport)
27
0
        , fActiveTimer(kInvalidTimerQuery) {
28
0
    }
29
0
    virtual ~GpuTimer() { SkASSERT(!fActiveTimer); }
30
31
    /**
32
     * Returns whether this timer can detect disjoint GPU operations while timing. If false, a query
33
     * has less confidence when it completes with QueryStatus::kAccurate.
34
     */
35
0
    bool disjointSupport() const { return fDisjointSupport; }
36
37
    /**
38
     * Inserts a "start timing" command in the GPU command stream.
39
     */
40
0
    void queueStart() {
41
0
        SkASSERT(!fActiveTimer);
42
0
        fActiveTimer = this->onQueueTimerStart();
43
0
    }
44
45
    /**
46
     * Inserts a "stop timing" command in the GPU command stream.
47
     *
48
     * @return a query object that can retrieve the time elapsed once the timer has completed.
49
     */
50
0
    [[nodiscard]] PlatformTimerQuery queueStop() {
51
0
        SkASSERT(fActiveTimer);
52
0
        this->onQueueTimerStop(fActiveTimer);
53
0
        return std::exchange(fActiveTimer, kInvalidTimerQuery);
54
0
    }
55
56
    enum class QueryStatus {
57
        kInvalid,  //<! the timer query is invalid.
58
        kPending,  //<! the timer is still running on the GPU.
59
        kDisjoint, //<! the query is complete, but dubious due to disjoint GPU operations.
60
        kAccurate  //<! the query is complete and reliable.
61
    };
62
63
    virtual QueryStatus checkQueryStatus(PlatformTimerQuery) = 0;
64
    virtual std::chrono::nanoseconds getTimeElapsed(PlatformTimerQuery) = 0;
65
    virtual void deleteQuery(PlatformTimerQuery) = 0;
66
67
private:
68
    virtual PlatformTimerQuery onQueueTimerStart() const = 0;
69
    virtual void onQueueTimerStop(PlatformTimerQuery) const = 0;
70
71
    bool const           fDisjointSupport;
72
    PlatformTimerQuery   fActiveTimer;
73
};
74
75
}  // namespace sk_gpu_test
76
77
#endif