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