blob: 4f44ad96ac67299a4ba2db6679ae280b2ad1abb1 [file] [log] [blame] [edit]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "tools/graphite/PipelineCallbackHandler.h"
#include <algorithm>
namespace skiatools::graphite {
void PipelineCallBackHandler::add(skgpu::graphite::ContextOptions::PipelineCacheOp op,
const std::string& label,
uint32_t uniqueKeyHash,
bool fromPrecompile,
sk_sp<SkData> androidStyleKey) {
SkAutoSpinlock lock{ fSpinLock };
std::unique_ptr<PipelineData>* foundData = fMap.find({ &label, uniqueKeyHash });
if (foundData) {
if (op == skgpu::graphite::ContextOptions::PipelineCacheOp::kPipelineFound) {
(*foundData)->fUses++;
}
} else {
SkASSERT(op == skgpu::graphite::ContextOptions::PipelineCacheOp::kAddingPipeline);
std::unique_ptr<PipelineData> newData = std::make_unique<PipelineData>(
label, uniqueKeyHash, fromPrecompile, std::move(androidStyleKey));
fMap.set(std::move(newData));
}
}
void PipelineCallBackHandler::report() {
// The assumption is that we're just doing this once at the end so we just lock for the
// entire method.
SkAutoSpinlock lock{ fSpinLock };
std::vector<const PipelineData*> tmp;
tmp.reserve(fMap.count());
fMap.foreach([&tmp](std::unique_ptr<PipelineData>* data) -> void {
tmp.push_back((*data).get());
});
std::sort(tmp.begin(), tmp.end(), [](const PipelineData* a, const PipelineData* b) {
if (a->fUses != b->fUses) {
return a->fUses > b->fUses;
}
return a->fLabel < b->fLabel;
});
for (const PipelineData* data : tmp) {
if (data->fFromPrecompile && !data->fUses) {
SkDebugf("!! "); // A needless precompiled Pipeline
}
SkDebugf("%u %s\n", data->fUses, data->fLabel.c_str());
}
}
} // namespace skiatools::graphite