/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/window/WindowContext.h" #include "include/gpu/ganesh/GrDirectContext.h" #if defined(SK_GRAPHITE) #include "include/gpu/graphite/Context.h" #include "include/gpu/graphite/Recorder.h" #endif namespace skwindow { WindowContext::WindowContext(std::unique_ptr params) : fDisplayParams(std::move(params)) {} WindowContext::~WindowContext() {} void WindowContext::swapBuffers() { this->onSwapBuffers(); } bool WindowContext::supportsGpuTimer() const { auto flags = skgpu::GpuStatsFlags::kNone; #if defined(SK_GRAPHITE) if (fGraphiteContext) { flags = fGraphiteContext->supportedGpuStats(); } else #endif if (fContext) { flags = fContext->supportedGpuStats(); } using T = std::underlying_type_t; return static_cast(flags) & static_cast(skgpu::GpuStatsFlags::kElapsedTime); } void WindowContext::submitToGpu(GpuTimerCallback statsCallback) { #if defined(SK_GRAPHITE) if (fGraphiteContext) { SkASSERT(fGraphiteRecorder); std::unique_ptr recording = fGraphiteRecorder->snap(); if (recording) { skgpu::graphite::InsertRecordingInfo info; if (statsCallback) { auto callback = std::make_unique(std::move(statsCallback)); info.fFinishedContext = callback.release(); info.fFinishedWithStatsProc = [](skgpu::graphite::GpuFinishedContext context, skgpu::CallbackResult, const skgpu::GpuStats& stats) { std::unique_ptr callback{ static_cast(context)}; (*callback)(stats.elapsedTime); }; info.fGpuStatsFlags = skgpu::GpuStatsFlags::kElapsedTime; } info.fRecording = recording.get(); fGraphiteContext->insertRecording(info); fGraphiteContext->submit(skgpu::graphite::SyncToCpu::kNo); } return; } #endif if (auto dc = this->directContext()) { GrFlushInfo info; if (statsCallback) { auto callback = std::make_unique(std::move(statsCallback)); info.fFinishedContext = callback.release(); info.fFinishedWithStatsProc = [](GrGpuFinishedContext context, const skgpu::GpuStats& stats) { std::unique_ptr callback{static_cast(context)}; (*callback)(stats.elapsedTime); }; info.fGpuStatsFlags = skgpu::GpuStatsFlags::kElapsedTime; } dc->flush(info); dc->submit(); return; } if (statsCallback) { statsCallback(0); } } } // namespace skwindow