| /* |
| * 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 |