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)18WindowContext::WindowContext(std::unique_ptr<const DisplayParams> params) 19 : fDisplayParams(std::move(params)) {} 20 ~WindowContext()21WindowContext::~WindowContext() {} 22 swapBuffers()23void WindowContext::swapBuffers() { 24 this->onSwapBuffers(); 25 } 26 supportsGpuTimer() const27bool 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)41void 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