blob: 44f2c902ec64b3025cfed5d89154010f7ff7bafc [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/gpu/graphite/PublicPrecompile.h"
#include "include/core/SkColorSpace.h"
#include "include/core/SkColorType.h"
#include "src/gpu/graphite/AttachmentTypes.h"
#include "src/gpu/graphite/Caps.h"
#include "src/gpu/graphite/ContextPriv.h"
#include "src/gpu/graphite/GraphicsPipeline.h"
#include "src/gpu/graphite/GraphicsPipelineDesc.h"
#include "src/gpu/graphite/KeyContext.h"
#include "src/gpu/graphite/Log.h"
#include "src/gpu/graphite/PaintOptionsPriv.h"
#include "src/gpu/graphite/Renderer.h"
#include "src/gpu/graphite/RendererProvider.h"
#include "src/gpu/graphite/ResourceProvider.h"
#include "src/gpu/graphite/RuntimeEffectDictionary.h"
#include "src/gpu/graphite/UniquePaintParamsID.h"
namespace {
using namespace skgpu::graphite;
void compile(const RendererProvider* rendererProvider,
ResourceProvider* resourceProvider,
const KeyContext& keyContext,
UniquePaintParamsID uniqueID,
DrawTypeFlags drawTypes,
SkSpan<RenderPassDesc> renderPassDescs,
bool withPrimitiveBlender) {
for (const Renderer* r : rendererProvider->renderers()) {
if (!(r->drawTypes() & drawTypes)) {
continue;
}
if (r->emitsPrimitiveColor() != withPrimitiveBlender) {
// UniqueIDs are explicitly built either w/ or w/o primitiveBlending so must
// match what the Renderer requires
continue;
}
for (auto&& s : r->steps()) {
SkASSERT(!s->performsShading() || s->emitsPrimitiveColor() == withPrimitiveBlender);
UniquePaintParamsID paintID = s->performsShading() ? uniqueID
: UniquePaintParamsID::InvalidID();
GraphicsPipelineDesc pipelineDesc(s, paintID);
for (RenderPassDesc renderPassDesc : renderPassDescs) {
auto pipeline = resourceProvider->findOrCreateGraphicsPipeline(
keyContext.rtEffectDict(),
pipelineDesc,
renderPassDesc);
if (!pipeline) {
SKGPU_LOG_W("Failed to create GraphicsPipeline in precompile!");
return;
}
}
}
}
}
} // anonymous namespace
namespace skgpu::graphite {
void Precompile(Context* context, const PaintOptions& options, DrawTypeFlags drawTypes) {
ShaderCodeDictionary* dict = context->priv().shaderCodeDictionary();
const Caps* caps = context->priv().caps();
auto rtEffectDict = std::make_unique<RuntimeEffectDictionary>();
SkColorInfo ci(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr);
KeyContext keyContext(dict, rtEffectDict.get(), ci);
// TODO: we need iterate over a broader set of TextureInfos here. Perhaps, allow the client
// to pass in colorType, mipmapping and protection.
TextureInfo info = caps->getDefaultSampledTextureInfo(ci.colorType(),
Mipmapped::kNo,
Protected::kNo,
Renderable::kYes);
// Note: at least on Metal, the LoadOp, StoreOp and clearColor fields don't influence the
// actual RenderPassDescKey.
// TODO: if all of the Renderers associated w/ the requested drawTypes require MSAA we
// do not need to generate the combinations w/ the non-MSAA RenderPassDescs.
RenderPassDesc renderPassDescs[] = {
RenderPassDesc::Make(caps,
info,
LoadOp::kClear,
StoreOp::kStore,
DepthStencilFlags::kDepth,
/* clearColor= */ { .0f, .0f, .0f, .0f },
/* requiresMSAA= */ true),
RenderPassDesc::Make(caps,
info,
LoadOp::kClear,
StoreOp::kStore,
DepthStencilFlags::kDepthStencil,
/* clearColor= */ { .0f, .0f, .0f, .0f },
/* requiresMSAA= */ true),
RenderPassDesc::Make(caps,
info,
LoadOp::kClear,
StoreOp::kStore,
DepthStencilFlags::kDepth,
/* clearColor= */ { .0f, .0f, .0f, .0f },
/* requiresMSAA= */ false),
RenderPassDesc::Make(caps,
info,
LoadOp::kClear,
StoreOp::kStore,
DepthStencilFlags::kDepthStencil,
/* clearColor= */ { .0f, .0f, .0f, .0f },
/* requiresMSAA= */ false),
};
options.priv().buildCombinations(
keyContext,
/* addPrimitiveBlender= */ false,
[&](UniquePaintParamsID uniqueID) {
compile(context->priv().rendererProvider(),
context->priv().resourceProvider(),
keyContext, uniqueID,
static_cast<DrawTypeFlags>(drawTypes & ~DrawTypeFlags::kDrawVertices),
renderPassDescs, /* withPrimitiveBlender= */ false);
});
if (drawTypes & DrawTypeFlags::kDrawVertices) {
options.priv().buildCombinations(
keyContext,
/* addPrimitiveBlender= */ true,
[&](UniquePaintParamsID uniqueID) {
compile(context->priv().rendererProvider(),
context->priv().resourceProvider(),
keyContext, uniqueID,
DrawTypeFlags::kDrawVertices,
renderPassDescs, /* withPrimitiveBlender= */ true);
});
}
}
} // namespace skgpu::graphite