blob: 0c5f46162e257d55c1bf8aa647955cdd9ea59c20 [file] [log] [blame]
/*
* Copyright 2024 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/UniqueKeyUtils.h"
#include "src/gpu/ResourceKey.h"
#include "src/gpu/graphite/Caps.h"
#include "src/gpu/graphite/ContextPriv.h"
#include "src/gpu/graphite/GraphicsPipelineDesc.h"
#include "src/gpu/graphite/RenderPassDesc.h"
#include "src/gpu/graphite/RendererProvider.h"
using namespace skgpu::graphite;
using namespace skgpu;
namespace UniqueKeyUtils {
void FetchUniqueKeys(GlobalCache* globalCache,
std::vector<UniqueKey>* keys) {
keys->reserve(globalCache->numGraphicsPipelines());
globalCache->forEachGraphicsPipeline([keys](const UniqueKey& key,
const GraphicsPipeline* pipeline) {
keys->push_back(key);
});
}
#ifdef SK_DEBUG
void DumpDescs(const RendererProvider* rendererProvider,
const ShaderCodeDictionary* dict,
const GraphicsPipelineDesc& pipelineDesc,
const RenderPassDesc& rpd) {
const RenderStep* rs = rendererProvider->lookup(pipelineDesc.renderStepID());
SkDebugf("GraphicsPipelineDesc: %u %s\n", pipelineDesc.paintParamsID().asUInt(), rs->name());
dict->lookup(pipelineDesc.paintParamsID()).dump(dict);
SkDebugf("RenderPassDesc:\n");
SkDebugf(" colorAttach: %s\n", rpd.fColorAttachment.toString().c_str());
SkDebugf(" colorResolveAttach: %s\n", rpd.fColorResolveAttachment.toString().c_str());
SkDebugf(" depthStencilAttach: %s\n", rpd.fDepthStencilAttachment.toString().c_str());
SkDebugf(" clearColor: %.2f %.2f %.2f %.2f\n"
" clearDepth: %.2f\n"
" stencilClear: %u\n"
" writeSwizzle: %s\n"
" sampleCount: %u\n",
rpd.fClearColor[0], rpd.fClearColor[1], rpd.fClearColor[2], rpd.fClearColor[3],
rpd.fClearDepth,
rpd.fClearStencil,
rpd.fWriteSwizzle.asString().c_str(),
rpd.fSampleCount);
}
#endif // SK_DEBUG
bool ExtractKeyDescs(Context* context,
const UniqueKey& origKey,
GraphicsPipelineDesc* pipelineDesc,
RenderPassDesc* renderPassDesc) {
const Caps* caps = context->priv().caps();
const RendererProvider* rendererProvider = context->priv().rendererProvider();
bool extracted = caps->extractGraphicsDescs(origKey, pipelineDesc, renderPassDesc,
rendererProvider);
if (!extracted) {
SkASSERT(0);
return false;
}
#ifdef SK_DEBUG
const ShaderCodeDictionary* dict = context->priv().shaderCodeDictionary();
UniqueKey newKey = caps->makeGraphicsPipelineKey(*pipelineDesc, *renderPassDesc);
if (origKey != newKey) {
SkDebugf("------- The UniqueKey didn't round trip!\n");
origKey.dump("original key:");
newKey.dump("reassembled key:");
DumpDescs(rendererProvider, dict, *pipelineDesc, *renderPassDesc);
SkDebugf("------------------------\n");
}
SkASSERT(origKey == newKey);
#endif
return true;
}
} // namespace UniqueKeyUtils