xref: /aosp_15_r20/external/skia/tools/window/WindowContext.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2023 Google LLC
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 #include "tools/window/WindowContext.h"
9 
10 #include "include/gpu/ganesh/GrDirectContext.h"
11 #if defined(SK_GRAPHITE)
12 #include "include/gpu/graphite/Context.h"
13 #include "include/gpu/graphite/Recorder.h"
14 #endif
15 
16 namespace skwindow {
17 
WindowContext(std::unique_ptr<const DisplayParams> params)18 WindowContext::WindowContext(std::unique_ptr<const DisplayParams> params)
19         : fDisplayParams(std::move(params)) {}
20 
~WindowContext()21 WindowContext::~WindowContext() {}
22 
swapBuffers()23 void WindowContext::swapBuffers() {
24     this->onSwapBuffers();
25 }
26 
supportsGpuTimer() const27 bool WindowContext::supportsGpuTimer() const {
28     auto flags = skgpu::GpuStatsFlags::kNone;
29 #if defined(SK_GRAPHITE)
30     if (fGraphiteContext) {
31         flags = fGraphiteContext->supportedGpuStats();
32     } else
33 #endif
34     if (fContext) {
35         flags = fContext->supportedGpuStats();
36     }
37     using T = std::underlying_type_t<skgpu::GpuStatsFlags>;
38     return static_cast<T>(flags) & static_cast<T>(skgpu::GpuStatsFlags::kElapsedTime);
39 }
40 
submitToGpu(GpuTimerCallback statsCallback)41 void WindowContext::submitToGpu(GpuTimerCallback statsCallback) {
42 #if defined(SK_GRAPHITE)
43     if (fGraphiteContext) {
44         SkASSERT(fGraphiteRecorder);
45         std::unique_ptr<skgpu::graphite::Recording> recording = fGraphiteRecorder->snap();
46         if (recording) {
47             skgpu::graphite::InsertRecordingInfo info;
48             if (statsCallback) {
49                 auto callback = std::make_unique<GpuTimerCallback>(std::move(statsCallback));
50                 info.fFinishedContext = callback.release();
51                 info.fFinishedWithStatsProc = [](skgpu::graphite::GpuFinishedContext context,
52                                                  skgpu::CallbackResult,
53                                                  const skgpu::GpuStats& stats) {
54                     std::unique_ptr<GpuTimerCallback> callback{
55                         static_cast<GpuTimerCallback*>(context)};
56                     (*callback)(stats.elapsedTime);
57                 };
58                 info.fGpuStatsFlags = skgpu::GpuStatsFlags::kElapsedTime;
59             }
60             info.fRecording = recording.get();
61             fGraphiteContext->insertRecording(info);
62             fGraphiteContext->submit(skgpu::graphite::SyncToCpu::kNo);
63         }
64         return;
65     }
66 #endif
67     if (auto dc = this->directContext()) {
68         GrFlushInfo info;
69         if (statsCallback) {
70             auto callback = std::make_unique<GpuTimerCallback>(std::move(statsCallback));
71             info.fFinishedContext = callback.release();
72             info.fFinishedWithStatsProc = [](GrGpuFinishedContext context,
73                                              const skgpu::GpuStats& stats) {
74                 std::unique_ptr<GpuTimerCallback> callback{static_cast<GpuTimerCallback*>(context)};
75                 (*callback)(stats.elapsedTime);
76             };
77             info.fGpuStatsFlags = skgpu::GpuStatsFlags::kElapsedTime;
78         }
79         dc->flush(info);
80         dc->submit();
81         return;
82     }
83     if (statsCallback) {
84         statsCallback(0);
85     }
86 }
87 
88 }  // namespace skwindow
89