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