| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrVkRenderPass_DEFINED |
| #define GrVkRenderPass_DEFINED |
| |
| #include "GrTypes.h" |
| |
| #include "GrVkResource.h" |
| |
| #include "vulkan/vulkan.h" |
| |
| class GrVkGpu; |
| class GrVkRenderTarget; |
| |
| class GrVkRenderPass : public GrVkResource { |
| public: |
| GrVkRenderPass() : INHERITED(), fRenderPass(VK_NULL_HANDLE) {} |
| void initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& target); |
| |
| struct AttachmentsDescriptor { |
| struct AttachmentDesc { |
| VkFormat fFormat; |
| int fSamples; |
| AttachmentDesc() : fFormat(VK_FORMAT_UNDEFINED), fSamples(0) {} |
| bool operator==(const AttachmentDesc& right) const { |
| return (fFormat == right.fFormat && fSamples == right.fSamples); |
| } |
| bool operator!=(const AttachmentDesc& right) const { |
| return !(*this == right); |
| } |
| }; |
| AttachmentDesc fColor; |
| AttachmentDesc fResolve; |
| AttachmentDesc fStencil; |
| uint32_t fAttachmentCount; |
| }; |
| |
| enum AttachmentFlags { |
| kColor_AttachmentFlag = 0x1, |
| kResolve_AttachmentFlag = 0x2, |
| kStencil_AttachmentFlag = 0x4, |
| }; |
| GR_DECL_BITFIELD_OPS_FRIENDS(AttachmentFlags); |
| |
| // The following return the index of the render pass attachment array for the given attachment. |
| // If the render pass does not have the given attachment it will return false and not set the |
| // index value. |
| bool colorAttachmentIndex(uint32_t* index) const; |
| bool resolveAttachmentIndex(uint32_t* index) const; |
| bool stencilAttachmentIndex(uint32_t* index) const; |
| |
| // Sets the VkRenderPassBeginInfo and VkRenderPassContents need to begin a render pass. |
| // TODO: In the future I expect this function will also take an optional render area instead of |
| // defaulting to the entire render target. |
| // TODO: Figure out if load clear values should be passed into this function or should be stored |
| // on the GrVkRenderPass at create time since we'll know at that point if we want to do a load |
| // clear. |
| void getBeginInfo(const GrVkRenderTarget& target, |
| VkRenderPassBeginInfo* beginInfo, |
| VkSubpassContents* contents) const; |
| |
| // Returns whether or not the structure of a RenderTarget matches that of the VkRenderPass in |
| // this object. Specifically this compares that the number of attachments, format of |
| // attachments, and sample counts are all the same. This function is used in the creation of |
| // basic RenderPasses that can be used when creating a VkFrameBuffer object. |
| bool isCompatible(const GrVkRenderTarget& target) const; |
| |
| VkRenderPass vkRenderPass() const { return fRenderPass; } |
| |
| private: |
| GrVkRenderPass(const GrVkRenderPass&); |
| GrVkRenderPass& operator=(const GrVkRenderPass&); |
| |
| void freeGPUData(const GrVkGpu* gpu) const override; |
| |
| VkRenderPass fRenderPass; |
| AttachmentFlags fAttachmentFlags; |
| AttachmentsDescriptor fAttachmentsDescriptor; |
| |
| typedef GrVkResource INHERITED; |
| }; |
| |
| GR_MAKE_BITFIELD_OPS(GrVkRenderPass::AttachmentFlags); |
| |
| #endif |