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 9 #ifndef GrVkRenderTarget_DEFINED 10 #define GrVkRenderTarget_DEFINED 11 12 #include "GrVkImage.h" 13 #include "GrRenderTarget.h" 14 15 #include "GrVkRenderPass.h" 16 #include "GrVkResourceProvider.h" 17 18 class GrVkCommandBuffer; 19 class GrVkFramebuffer; 20 class GrVkGpu; 21 class GrVkImageView; 22 class GrVkStencilAttachment; 23 24 struct GrVkImageInfo; 25 26 #ifdef SK_BUILD_FOR_WIN 27 // Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance. 28 #pragma warning(push) 29 #pragma warning(disable: 4250) 30 #endif 31 32 class GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage { 33 public: 34 static GrVkRenderTarget* CreateNewRenderTarget(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&, 35 const GrVkImage::ImageDesc&); 36 37 static sk_sp<GrVkRenderTarget> MakeWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&, 38 const GrVkImageInfo*); 39 40 ~GrVkRenderTarget() override; 41 42 const GrVkFramebuffer* framebuffer() const { return fFramebuffer; } 43 const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; } 44 const GrVkResource* msaaImageResource() const { 45 if (fMSAAImage) { 46 return fMSAAImage->fResource; 47 } 48 return nullptr; 49 } 50 GrVkImage* msaaImage() { return fMSAAImage.get(); } 51 const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; } 52 const GrVkResource* stencilImageResource() const; 53 const GrVkImageView* stencilAttachmentView() const; 54 55 const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; } 56 GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const { 57 return fCompatibleRPHandle; 58 } 59 60 // override of GrRenderTarget 61 ResolveType getResolveType() const override { 62 if (this->numColorSamples() > 1) { 63 return kCanResolve_ResolveType; 64 } 65 return kAutoResolves_ResolveType; 66 } 67 68 bool canAttemptStencilAttachment() const override { 69 return true; 70 } 71 72 GrBackendObject getRenderTargetHandle() const override; 73 GrBackendRenderTarget getBackendRenderTarget() const override; 74 75 void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc, 76 GrVkRenderPass::AttachmentFlags* flags) const; 77 78 void addResources(GrVkCommandBuffer& commandBuffer) const; 79 80 protected: 81 GrVkRenderTarget(GrVkGpu* gpu, 82 const GrSurfaceDesc& desc, 83 const GrVkImageInfo& info, 84 const GrVkImageInfo& msaaInfo, 85 const GrVkImageView* colorAttachmentView, 86 const GrVkImageView* resolveAttachmentView, 87 GrBackendObjectOwnership); 88 89 GrVkRenderTarget(GrVkGpu* gpu, 90 const GrSurfaceDesc& desc, 91 const GrVkImageInfo& info, 92 const GrVkImageView* colorAttachmentView, 93 GrBackendObjectOwnership); 94 95 GrVkGpu* getVkGpu() const; 96 97 void onAbandon() override; 98 void onRelease() override; 99 100 // This accounts for the texture's memory and any MSAA renderbuffer's memory. 101 size_t onGpuMemorySize() const override { 102 int numColorSamples = this->numColorSamples(); 103 if (numColorSamples > 1) { 104 // Add one to account for the resolved VkImage. 105 numColorSamples += 1; 106 } 107 return GrSurface::ComputeSize(this->config(), this->width(), this->height(), 108 numColorSamples, GrMipMapped::kNo); 109 } 110 111 void createFramebuffer(GrVkGpu* gpu); 112 113 const GrVkImageView* fColorAttachmentView; 114 std::unique_ptr<GrVkImage> fMSAAImage; 115 const GrVkImageView* fResolveAttachmentView; 116 117 private: 118 GrVkRenderTarget(GrVkGpu* gpu, 119 SkBudgeted, 120 const GrSurfaceDesc& desc, 121 const GrVkImageInfo& info, 122 const GrVkImageInfo& msaaInfo, 123 const GrVkImageView* colorAttachmentView, 124 const GrVkImageView* resolveAttachmentView, 125 GrBackendObjectOwnership); 126 127 GrVkRenderTarget(GrVkGpu* gpu, 128 SkBudgeted, 129 const GrSurfaceDesc& desc, 130 const GrVkImageInfo& info, 131 const GrVkImageView* colorAttachmentView, 132 GrBackendObjectOwnership); 133 134 static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&, 135 const GrVkImageInfo&, GrBackendObjectOwnership); 136 137 bool completeStencilAttachment() override; 138 139 void releaseInternalObjects(); 140 void abandonInternalObjects(); 141 142 const GrVkFramebuffer* fFramebuffer; 143 144 // This is a cached pointer to a simple render pass. The render target should unref it 145 // once it is done with it. 146 const GrVkRenderPass* fCachedSimpleRenderPass; 147 // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target 148 GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle; 149 }; 150 151 #endif 152