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 "vulkan/vulkan.h"
16 
17 class GrVkGpu;
18 class GrVkRenderTarget;
19 
20 class GrVkRenderPass : public GrVkResource {
21 public:
GrVkRenderPass()22     GrVkRenderPass() : INHERITED(), fRenderPass(nullptr) {}
23     void initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& target);
24 
25     struct AttachmentsDescriptor {
26         struct AttachmentDesc {
27             VkFormat fFormat;
28             int fSamples;
AttachmentDescAttachmentsDescriptor::AttachmentDesc29             AttachmentDesc() : fFormat(VK_FORMAT_UNDEFINED), fSamples(0) {}
30             bool operator==(const AttachmentDesc& right) const {
31                 return (fFormat == right.fFormat && fSamples == right.fSamples);
32             }
33             bool operator!=(const AttachmentDesc& right) const {
34                 return !(*this == right);
35             }
36         };
37         AttachmentDesc fColor;
38         AttachmentDesc fResolve;
39         AttachmentDesc fStencil;
40         uint32_t       fAttachmentCount;
41     };
42 
43     enum AttachmentFlags {
44         kColor_AttachmentFlag = 0x1,
45         kResolve_AttachmentFlag = 0x2,
46         kStencil_AttachmentFlag = 0x4,
47     };
48     GR_DECL_BITFIELD_OPS_FRIENDS(AttachmentFlags);
49 
50     // The following return the index of the render pass attachment array for the given attachment.
51     // If the render pass does not have the given attachment it will return false and not set the
52     // index value.
53     bool colorAttachmentIndex(uint32_t* index) const;
54     bool resolveAttachmentIndex(uint32_t* index) const;
55     bool stencilAttachmentIndex(uint32_t* index) const;
56 
57     // Sets the VkRenderPassBeginInfo and VkRenderPassContents need to begin a render pass.
58     // TODO: In the future I expect this function will also take an optional render area instead of
59     // defaulting to the entire render target.
60     // TODO: Figure out if load clear values should be passed into this function or should be stored
61     // on the GrVkRenderPass at create time since we'll know at that point if we want to do a load
62     // clear.
63     void getBeginInfo(const GrVkRenderTarget& target,
64                       VkRenderPassBeginInfo* beginInfo,
65                       VkSubpassContents* contents) const;
66 
67     // Returns whether or not the structure of a RenderTarget matches that of the VkRenderPass in
68     // this object. Specifically this compares that the number of attachments, format of
69     // attachments, and sample counts are all the same. This function is used in the creation of
70     // basic RenderPasses that can be used when creating a VkFrameBuffer object.
71     bool isCompatible(const GrVkRenderTarget& target) const;
72 
vkRenderPass()73     VkRenderPass vkRenderPass() const { return fRenderPass; }
74 
75 private:
76     GrVkRenderPass(const GrVkRenderPass&);
77     GrVkRenderPass& operator=(const GrVkRenderPass&);
78 
79     void freeGPUData(const GrVkGpu* gpu) const override;
80 
81     VkRenderPass          fRenderPass;
82     AttachmentFlags       fAttachmentFlags;
83     AttachmentsDescriptor fAttachmentsDescriptor;
84 
85     typedef GrVkResource INHERITED;
86 };
87 
88 GR_MAKE_BITFIELD_OPS(GrVkRenderPass::AttachmentFlags);
89 
90 #endif