1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_DrawPass_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_DrawPass_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawCommands.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawTypes.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/GraphicsPipelineDesc.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ResourceTypes.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/TextureProxy.h" 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker class BoundsManager; 29*c8dee2aaSAndroid Build Coastguard Worker class CommandBuffer; 30*c8dee2aaSAndroid Build Coastguard Worker class DrawList; 31*c8dee2aaSAndroid Build Coastguard Worker class GraphicsPipeline; 32*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 33*c8dee2aaSAndroid Build Coastguard Worker struct RenderPassDesc; 34*c8dee2aaSAndroid Build Coastguard Worker class ResourceProvider; 35*c8dee2aaSAndroid Build Coastguard Worker class RuntimeEffectDictionary; 36*c8dee2aaSAndroid Build Coastguard Worker class Sampler; 37*c8dee2aaSAndroid Build Coastguard Worker class TextureDataBlock; 38*c8dee2aaSAndroid Build Coastguard Worker class Texture; 39*c8dee2aaSAndroid Build Coastguard Worker enum class UniformSlot; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker /** 42*c8dee2aaSAndroid Build Coastguard Worker * DrawPass is analogous to a subpass, storing the drawing operations in the order they are stored 43*c8dee2aaSAndroid Build Coastguard Worker * in the eventual command buffer, as well as the surface proxy the operations are intended for. 44*c8dee2aaSAndroid Build Coastguard Worker * DrawPasses are grouped into a RenderPassTask for execution within a single render pass if the 45*c8dee2aaSAndroid Build Coastguard Worker * subpasses are compatible with each other. 46*c8dee2aaSAndroid Build Coastguard Worker * 47*c8dee2aaSAndroid Build Coastguard Worker * Unlike DrawList, DrawPasses are immutable and represent as closely as possible what will be 48*c8dee2aaSAndroid Build Coastguard Worker * stored in the command buffer while being flexible as to how the pass is incorporated. Depending 49*c8dee2aaSAndroid Build Coastguard Worker * on the backend, it may even be able to write accumulated vertex and uniform data directly to 50*c8dee2aaSAndroid Build Coastguard Worker * mapped GPU memory, although that is the extent of the CPU->GPU work they perform before they are 51*c8dee2aaSAndroid Build Coastguard Worker * executed by a RenderPassTask. 52*c8dee2aaSAndroid Build Coastguard Worker */ 53*c8dee2aaSAndroid Build Coastguard Worker class DrawPass { 54*c8dee2aaSAndroid Build Coastguard Worker public: 55*c8dee2aaSAndroid Build Coastguard Worker ~DrawPass(); 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker // Create a DrawPass that renders the DrawList into `target` with the given load/store ops and 58*c8dee2aaSAndroid Build Coastguard Worker // clear color. 59*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<DrawPass> Make(Recorder*, 60*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<DrawList>, 61*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> target, 62*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& targetInfo, 63*c8dee2aaSAndroid Build Coastguard Worker std::pair<LoadOp, StoreOp>, 64*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 4> clearColor); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker // Defined relative to the top-left corner of the surface the DrawPass renders to, and is 67*c8dee2aaSAndroid Build Coastguard Worker // contained within its dimensions. bounds()68*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& bounds() const { return fBounds; } target()69*c8dee2aaSAndroid Build Coastguard Worker TextureProxy* target() const { return fTarget.get(); } ops()70*c8dee2aaSAndroid Build Coastguard Worker std::pair<LoadOp, StoreOp> ops() const { return fOps; } clearColor()71*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 4> clearColor() const { return fClearColor; } 72*c8dee2aaSAndroid Build Coastguard Worker requiresDstTexture()73*c8dee2aaSAndroid Build Coastguard Worker bool requiresDstTexture() const { return false; } requiresMSAA()74*c8dee2aaSAndroid Build Coastguard Worker bool requiresMSAA() const { return fRequiresMSAA; } 75*c8dee2aaSAndroid Build Coastguard Worker depthStencilFlags()76*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<DepthStencilFlags> depthStencilFlags() const { return fDepthStencilFlags; } 77*c8dee2aaSAndroid Build Coastguard Worker vertexBufferSize()78*c8dee2aaSAndroid Build Coastguard Worker size_t vertexBufferSize() const { return 0; } uniformBufferSize()79*c8dee2aaSAndroid Build Coastguard Worker size_t uniformBufferSize() const { return 0; } 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker // Instantiate and prepare any resources used by the DrawPass that require the Recorder's 82*c8dee2aaSAndroid Build Coastguard Worker // ResourceProvider. This includes things likes GraphicsPipelines, sampled Textures, Samplers, 83*c8dee2aaSAndroid Build Coastguard Worker // etc. 84*c8dee2aaSAndroid Build Coastguard Worker bool prepareResources(ResourceProvider*, 85*c8dee2aaSAndroid Build Coastguard Worker const RuntimeEffectDictionary*, 86*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&); 87*c8dee2aaSAndroid Build Coastguard Worker commands()88*c8dee2aaSAndroid Build Coastguard Worker DrawPassCommands::List::Iter commands() const { 89*c8dee2aaSAndroid Build Coastguard Worker return fCommandList.commands(); 90*c8dee2aaSAndroid Build Coastguard Worker } 91*c8dee2aaSAndroid Build Coastguard Worker getPipeline(size_t index)92*c8dee2aaSAndroid Build Coastguard Worker const GraphicsPipeline* getPipeline(size_t index) const { 93*c8dee2aaSAndroid Build Coastguard Worker return fFullPipelines[index].get(); 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker const Texture* getTexture(size_t index) const; 96*c8dee2aaSAndroid Build Coastguard Worker const Sampler* getSampler(size_t index) const; 97*c8dee2aaSAndroid Build Coastguard Worker sampledTextures()98*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<TextureProxy>> sampledTextures() const { return fSampledTextures; } 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker void addResourceRefs(CommandBuffer*) const; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker private: 103*c8dee2aaSAndroid Build Coastguard Worker class SortKey; 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker DrawPass(sk_sp<TextureProxy> target, 106*c8dee2aaSAndroid Build Coastguard Worker std::pair<LoadOp, StoreOp> ops, 107*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 4> clearColor); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker DrawPassCommands::List fCommandList; 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker sk_sp<TextureProxy> fTarget; 112*c8dee2aaSAndroid Build Coastguard Worker SkIRect fBounds; 113*c8dee2aaSAndroid Build Coastguard Worker 114*c8dee2aaSAndroid Build Coastguard Worker std::pair<LoadOp, StoreOp> fOps; 115*c8dee2aaSAndroid Build Coastguard Worker std::array<float, 4> fClearColor; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<DepthStencilFlags> fDepthStencilFlags = DepthStencilFlags::kNone; 118*c8dee2aaSAndroid Build Coastguard Worker bool fRequiresMSAA = false; 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker // The pipelines are referenced by index in BindGraphicsPipeline, but that will index into a 121*c8dee2aaSAndroid Build Coastguard Worker // an array of actual GraphicsPipelines. 122*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<GraphicsPipelineDesc> fPipelineDescs; 123*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<SamplerDesc> fSamplerDescs; 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker // These resources all get instantiated during prepareResources. 126*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<GraphicsPipeline>> fFullPipelines; 127*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<TextureProxy>> fSampledTextures; 128*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<sk_sp<Sampler>> fSamplers; 129*c8dee2aaSAndroid Build Coastguard Worker }; 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_DrawPass_DEFINED 134