blob: 6bc8711fba6e92397dad9b7754a3ddc4272306b9 [file] [log] [blame] [edit]
/*
* 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<const DisplayParams> 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<skgpu::GpuStatsFlags>;
return static_cast<T>(flags) & static_cast<T>(skgpu::GpuStatsFlags::kElapsedTime);
}
void WindowContext::submitToGpu(GpuTimerCallback statsCallback) {
#if defined(SK_GRAPHITE)
if (fGraphiteContext) {
SkASSERT(fGraphiteRecorder);
std::unique_ptr<skgpu::graphite::Recording> recording = fGraphiteRecorder->snap();
if (recording) {
skgpu::graphite::InsertRecordingInfo info;
if (statsCallback) {
auto callback = std::make_unique<GpuTimerCallback>(std::move(statsCallback));
info.fFinishedContext = callback.release();
info.fFinishedWithStatsProc = [](skgpu::graphite::GpuFinishedContext context,
skgpu::CallbackResult,
const skgpu::GpuStats& stats) {
std::unique_ptr<GpuTimerCallback> callback{
static_cast<GpuTimerCallback*>(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<GpuTimerCallback>(std::move(statsCallback));
info.fFinishedContext = callback.release();
info.fFinishedWithStatsProc = [](GrGpuFinishedContext context,
const skgpu::GpuStats& stats) {
std::unique_ptr<GpuTimerCallback> callback{static_cast<GpuTimerCallback*>(context)};
(*callback)(stats.elapsedTime);
};
info.fGpuStatsFlags = skgpu::GpuStatsFlags::kElapsedTime;
}
dc->flush(info);
dc->submit();
return;
}
if (statsCallback) {
statsCallback(0);
}
}
} // namespace skwindow