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 GrVkRenderTarget* CreateWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&, 38 GrWrapOwnership, 39 const GrVkImageInfo*); 40 41 ~GrVkRenderTarget() override; 42 framebuffer()43 const GrVkFramebuffer* framebuffer() const { return fFramebuffer; } colorAttachmentView()44 const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; } msaaImageResource()45 const GrVkResource* msaaImageResource() const { 46 if (fMSAAImage) { 47 return fMSAAImage->fResource; 48 } 49 return nullptr; 50 } msaaImage()51 GrVkImage* msaaImage() { return fMSAAImage; } resolveAttachmentView()52 const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; } 53 const GrVkResource* stencilImageResource() const; 54 const GrVkImageView* stencilAttachmentView() const; 55 simpleRenderPass()56 const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; } compatibleRenderPassHandle()57 GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const { 58 return fCompatibleRPHandle; 59 } 60 61 // override of GrRenderTarget getResolveType()62 ResolveType getResolveType() const override { 63 if (this->numColorSamples() > 1) { 64 return kCanResolve_ResolveType; 65 } 66 return kAutoResolves_ResolveType; 67 } 68 canAttemptStencilAttachment()69 bool canAttemptStencilAttachment() const override { 70 return true; 71 } 72 73 GrBackendObject getRenderTargetHandle() 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 GrVkImage::Wrapped wrapped); 88 89 GrVkRenderTarget(GrVkGpu* gpu, 90 const GrSurfaceDesc& desc, 91 const GrVkImageInfo& info, 92 const GrVkImageView* colorAttachmentView, 93 GrVkImage::Wrapped wrapped); 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. onGpuMemorySize()101 size_t onGpuMemorySize() const override { 102 SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig); 103 SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig)); 104 size_t colorBytes = GrBytesPerPixel(fDesc.fConfig); 105 SkASSERT(colorBytes > 0); 106 return fColorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes; 107 } 108 109 void createFramebuffer(GrVkGpu* gpu); 110 111 const GrVkImageView* fColorAttachmentView; 112 GrVkImage* fMSAAImage; 113 const GrVkImageView* fResolveAttachmentView; 114 115 private: 116 GrVkRenderTarget(GrVkGpu* gpu, 117 SkBudgeted, 118 const GrSurfaceDesc& desc, 119 const GrVkImageInfo& info, 120 const GrVkImageInfo& msaaInfo, 121 const GrVkImageView* colorAttachmentView, 122 const GrVkImageView* resolveAttachmentView, 123 GrVkImage::Wrapped wrapped); 124 125 GrVkRenderTarget(GrVkGpu* gpu, 126 SkBudgeted, 127 const GrSurfaceDesc& desc, 128 const GrVkImageInfo& info, 129 const GrVkImageView* colorAttachmentView, 130 GrVkImage::Wrapped wrapped); 131 132 static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&, 133 const GrVkImageInfo&, GrVkImage::Wrapped wrapped); 134 135 bool completeStencilAttachment() override; 136 137 void releaseInternalObjects(); 138 void abandonInternalObjects(); 139 140 const GrVkFramebuffer* fFramebuffer; 141 int fColorValuesPerPixel; 142 143 // This is a cached pointer to a simple render pass. The render target should unref it 144 // once it is done with it. 145 const GrVkRenderPass* fCachedSimpleRenderPass; 146 // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target 147 GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle; 148 }; 149 150 #endif 151