• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "experimental/graphite/src/RenderPassTask.h"
9 
10 #include "experimental/graphite/src/CommandBuffer.h"
11 #include "experimental/graphite/src/ContextPriv.h"
12 #include "experimental/graphite/src/DrawPass.h"
13 #include "experimental/graphite/src/Log.h"
14 #include "experimental/graphite/src/ResourceProvider.h"
15 #include "experimental/graphite/src/Texture.h"
16 #include "experimental/graphite/src/TextureProxy.h"
17 
18 namespace skgpu {
19 
Make(std::vector<std::unique_ptr<DrawPass>> passes,const RenderPassDesc & desc,sk_sp<TextureProxy> target)20 sk_sp<RenderPassTask> RenderPassTask::Make(std::vector<std::unique_ptr<DrawPass>> passes,
21                                            const RenderPassDesc& desc,
22                                            sk_sp<TextureProxy> target) {
23     // For now we have one DrawPass per RenderPassTask
24     SkASSERT(passes.size() == 1);
25 
26     return sk_sp<RenderPassTask>(new RenderPassTask(std::move(passes), desc, target));
27 }
28 
RenderPassTask(std::vector<std::unique_ptr<DrawPass>> passes,const RenderPassDesc & desc,sk_sp<TextureProxy> target)29 RenderPassTask::RenderPassTask(std::vector<std::unique_ptr<DrawPass>> passes,
30                                const RenderPassDesc& desc,
31                                sk_sp<TextureProxy> target)
32         : fDrawPasses(std::move(passes))
33         , fRenderPassDesc(desc)
34         , fTarget(std::move(target)) {}
35 
36 RenderPassTask::~RenderPassTask() = default;
37 
addCommands(ResourceProvider * resourceProvider,CommandBuffer * commandBuffer)38 void RenderPassTask::addCommands(ResourceProvider* resourceProvider, CommandBuffer* commandBuffer) {
39     // TBD: Expose the surfaces that will need to be attached within the renderpass?
40 
41     // TODO: for task execution, start the render pass, then iterate passes and
42     // possibly(?) start each subpass, and call DrawPass::addCommands() on the command buffer
43     // provided to the task. Then close the render pass and we should have pixels..
44 
45     // Instantiate the target
46     if (fTarget) {
47         if (!fTarget->instantiate(resourceProvider)) {
48             SKGPU_LOG_W("Given invalid texture proxy. Will not create renderpass!");
49             SKGPU_LOG_W("Dimensions are (%d, %d).",
50                         fTarget->dimensions().width(), fTarget->dimensions().height());
51             return;
52         }
53     }
54 
55     sk_sp<Texture> depthStencilTexture;
56     if (fRenderPassDesc.fDepthStencilAttachment.fTextureInfo.isValid()) {
57         // TODO: ensure this is a scratch/recycled texture
58         depthStencilTexture = resourceProvider->findOrCreateTexture(
59                 fTarget->dimensions(), fRenderPassDesc.fDepthStencilAttachment.fTextureInfo);
60         SkASSERT(depthStencilTexture);
61     }
62 
63     if (commandBuffer->beginRenderPass(fRenderPassDesc, fTarget->refTexture(), nullptr,
64                                        std::move(depthStencilTexture))) {
65         // Assuming one draw pass per renderpasstask for now
66         SkASSERT(fDrawPasses.size() == 1);
67         for (const auto& drawPass: fDrawPasses) {
68             drawPass->addCommands(resourceProvider, commandBuffer, fRenderPassDesc);
69         }
70 
71         commandBuffer->endRenderPass();
72     }
73 }
74 
75 } // namespace skgpu
76