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