| /* |
| * 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 "vk/GrVkTypes.h" |
| |
| class GrProcessorKeyBuilder; |
| class GrVkGpu; |
| class GrVkRenderTarget; |
| |
| class GrVkRenderPass : public GrVkResource { |
| public: |
| GrVkRenderPass() : INHERITED(), fRenderPass(VK_NULL_HANDLE), fClearValueCount(0) {} |
| |
| // Used when importing an external render pass. In this case we have to explicitly be told the |
| // color attachment index |
| explicit GrVkRenderPass(VkRenderPass renderPass, uint32_t colorAttachmentIndex) |
| : INHERITED() |
| , fRenderPass(renderPass) |
| , fAttachmentFlags(kExternal_AttachmentFlag) |
| , fClearValueCount(0) |
| , fColorAttachmentIndex(colorAttachmentIndex) {} |
| |
| struct LoadStoreOps { |
| VkAttachmentLoadOp fLoadOp; |
| VkAttachmentStoreOp fStoreOp; |
| |
| LoadStoreOps(VkAttachmentLoadOp loadOp, VkAttachmentStoreOp storeOp) |
| : fLoadOp(loadOp) |
| , fStoreOp(storeOp) {} |
| |
| bool operator==(const LoadStoreOps& right) const { |
| return fLoadOp == right.fLoadOp && fStoreOp == right.fStoreOp; |
| } |
| |
| bool operator!=(const LoadStoreOps& right) const { |
| return !(*this == right); |
| } |
| }; |
| |
| void initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& target); |
| void init(const GrVkGpu* gpu, |
| const GrVkRenderTarget& target, |
| const LoadStoreOps& colorOp, |
| const LoadStoreOps& stencilOp); |
| |
| void init(const GrVkGpu* gpu, |
| const GrVkRenderPass& compatibleRenderPass, |
| const LoadStoreOps& colorOp, |
| const LoadStoreOps& stencilOp); |
| |
| struct AttachmentsDescriptor { |
| struct AttachmentDesc { |
| VkFormat fFormat; |
| int fSamples; |
| LoadStoreOps fLoadStoreOps; |
| |
| AttachmentDesc() |
| : fFormat(VK_FORMAT_UNDEFINED) |
| , fSamples(0) |
| , fLoadStoreOps(VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE) {} |
| bool operator==(const AttachmentDesc& right) const { |
| return (fFormat == right.fFormat && |
| fSamples == right.fSamples && |
| fLoadStoreOps == right.fLoadStoreOps); |
| } |
| bool operator!=(const AttachmentDesc& right) const { |
| return !(*this == right); |
| } |
| bool isCompatible(const AttachmentDesc& desc) const { |
| return (fFormat == desc.fFormat && fSamples == desc.fSamples); |
| } |
| }; |
| AttachmentDesc fColor; |
| AttachmentDesc fStencil; |
| uint32_t fAttachmentCount; |
| }; |
| |
| enum AttachmentFlags { |
| kColor_AttachmentFlag = 0x1, |
| kStencil_AttachmentFlag = 0x2, |
| // The external attachment flag signals that this render pass is imported from an external |
| // client. Since we don't know every attachment on the render pass we don't set any of the |
| // specific attachment flags when using external. However, the external render pass must |
| // at least have a color attachment. |
| kExternal_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 stencilAttachmentIndex(uint32_t* index) 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; |
| |
| bool isCompatible(const GrVkRenderPass& renderPass) const; |
| |
| bool isCompatibleExternalRP(VkRenderPass) const; |
| |
| bool equalLoadStoreOps(const LoadStoreOps& colorOps, |
| const LoadStoreOps& stencilOps) const; |
| |
| VkRenderPass vkRenderPass() const { return fRenderPass; } |
| |
| const VkExtent2D& granularity() const { return fGranularity; } |
| |
| // Returns the number of clear colors needed to begin this render pass. Currently this will |
| // either only be 0 or 1 since we only ever clear the color attachment. |
| uint32_t clearValueCount() const { return fClearValueCount; } |
| |
| |
| void genKey(GrProcessorKeyBuilder* b) const; |
| |
| #ifdef SK_TRACE_VK_RESOURCES |
| void dumpInfo() const override { |
| SkDebugf("GrVkRenderPass: %d (%d refs)\n", fRenderPass, this->getRefCnt()); |
| } |
| #endif |
| |
| private: |
| GrVkRenderPass(const GrVkRenderPass&); |
| |
| void init(const GrVkGpu* gpu, |
| const LoadStoreOps& colorOps, |
| const LoadStoreOps& stencilOps); |
| |
| bool isCompatible(const AttachmentsDescriptor&, const AttachmentFlags&) const; |
| |
| void freeGPUData(GrVkGpu* gpu) const override; |
| |
| VkRenderPass fRenderPass; |
| AttachmentFlags fAttachmentFlags; |
| AttachmentsDescriptor fAttachmentsDescriptor; |
| VkExtent2D fGranularity; |
| uint32_t fClearValueCount; |
| // For internally created render passes we assume the color attachment index is always 0. |
| uint32_t fColorAttachmentIndex = 0; |
| |
| typedef GrVkResource INHERITED; |
| }; |
| |
| GR_MAKE_BITFIELD_OPS(GrVkRenderPass::AttachmentFlags); |
| |
| #endif |