Home | History | Annotate | Download | only in vk
      1 /*
      2 * Copyright 2015 Google Inc.
      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 #ifndef GrVkRenderPass_DEFINED
      9 #define GrVkRenderPass_DEFINED
     10 
     11 #include "GrTypes.h"
     12 
     13 #include "GrVkResource.h"
     14 
     15 #include "vk/GrVkDefines.h"
     16 
     17 class GrProcessorKeyBuilder;
     18 class GrVkGpu;
     19 class GrVkRenderTarget;
     20 
     21 class GrVkRenderPass : public GrVkResource {
     22 public:
     23     GrVkRenderPass() : INHERITED(), fRenderPass(VK_NULL_HANDLE), fClearValueCount(0) {}
     24 
     25     struct LoadStoreOps {
     26         VkAttachmentLoadOp  fLoadOp;
     27         VkAttachmentStoreOp fStoreOp;
     28 
     29         LoadStoreOps(VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp)
     30             : fLoadOp(loadOp)
     31             , fStoreOp(storeOp) {}
     32 
     33         bool operator==(const LoadStoreOps& right) const {
     34             return fLoadOp == right.fLoadOp && fStoreOp == right.fStoreOp;
     35         }
     36 
     37         bool operator!=(const LoadStoreOps& right) const {
     38             return !(*this == right);
     39         }
     40     };
     41 
     42     void initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& target);
     43     void init(const GrVkGpu* gpu,
     44               const GrVkRenderTarget& target,
     45               const LoadStoreOps& colorOp,
     46               const LoadStoreOps& stencilOp);
     47 
     48     void init(const GrVkGpu* gpu,
     49               const GrVkRenderPass& compatibleRenderPass,
     50               const LoadStoreOps& colorOp,
     51               const LoadStoreOps& stencilOp);
     52 
     53     struct AttachmentsDescriptor {
     54         struct AttachmentDesc {
     55             VkFormat fFormat;
     56             int fSamples;
     57             LoadStoreOps fLoadStoreOps;
     58 
     59             AttachmentDesc()
     60                 : fFormat(VK_FORMAT_UNDEFINED)
     61                 , fSamples(0)
     62                 , fLoadStoreOps(VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE) {}
     63             bool operator==(const AttachmentDesc& right) const {
     64                 return (fFormat == right.fFormat &&
     65                         fSamples == right.fSamples &&
     66                         fLoadStoreOps == right.fLoadStoreOps);
     67             }
     68             bool operator!=(const AttachmentDesc& right) const {
     69                 return !(*this == right);
     70             }
     71             bool isCompatible(const AttachmentDesc& desc) const {
     72                 return (fFormat == desc.fFormat && fSamples == desc.fSamples);
     73             }
     74         };
     75         AttachmentDesc fColor;
     76         AttachmentDesc fStencil;
     77         uint32_t       fAttachmentCount;
     78     };
     79 
     80     enum AttachmentFlags {
     81         kColor_AttachmentFlag = 0x1,
     82         kStencil_AttachmentFlag = 0x2,
     83     };
     84     GR_DECL_BITFIELD_OPS_FRIENDS(AttachmentFlags);
     85 
     86     // The following return the index of the render pass attachment array for the given attachment.
     87     // If the render pass does not have the given attachment it will return false and not set the
     88     // index value.
     89     bool colorAttachmentIndex(uint32_t* index) const;
     90     bool stencilAttachmentIndex(uint32_t* index) const;
     91 
     92     // Returns whether or not the structure of a RenderTarget matches that of the VkRenderPass in
     93     // this object. Specifically this compares that the number of attachments, format of
     94     // attachments, and sample counts are all the same. This function is used in the creation of
     95     // basic RenderPasses that can be used when creating a VkFrameBuffer object.
     96     bool isCompatible(const GrVkRenderTarget& target) const;
     97 
     98     bool isCompatible(const GrVkRenderPass& renderPass) const;
     99 
    100     bool equalLoadStoreOps(const LoadStoreOps& colorOps,
    101                            const LoadStoreOps& stencilOps) const;
    102 
    103     VkRenderPass vkRenderPass() const { return fRenderPass; }
    104 
    105     const VkExtent2D& granularity() const { return fGranularity; }
    106 
    107     // Returns the number of clear colors needed to begin this render pass. Currently this will
    108     // either only be 0 or 1 since we only ever clear the color attachment.
    109     uint32_t clearValueCount() const { return fClearValueCount; }
    110 
    111 
    112     void genKey(GrProcessorKeyBuilder* b) const;
    113 
    114 #ifdef SK_TRACE_VK_RESOURCES
    115     void dumpInfo() const override {
    116         SkDebugf("GrVkRenderPass: %d (%d refs)\n", fRenderPass, this->getRefCnt());
    117     }
    118 #endif
    119 
    120 private:
    121     GrVkRenderPass(const GrVkRenderPass&);
    122 
    123     void init(const GrVkGpu* gpu,
    124               const LoadStoreOps& colorOps,
    125               const LoadStoreOps& stencilOps);
    126 
    127     bool isCompatible(const AttachmentsDescriptor&, const AttachmentFlags&) const;
    128 
    129     void freeGPUData(const GrVkGpu* gpu) const override;
    130 
    131     VkRenderPass          fRenderPass;
    132     AttachmentFlags       fAttachmentFlags;
    133     AttachmentsDescriptor fAttachmentsDescriptor;
    134     VkExtent2D            fGranularity;
    135     uint32_t              fClearValueCount;
    136 
    137     typedef GrVkResource INHERITED;
    138 };
    139 
    140 GR_MAKE_BITFIELD_OPS(GrVkRenderPass::AttachmentFlags);
    141 
    142 #endif
    143