Home | History | Annotate | Download | only in vk
      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; }
     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 
     74     void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
     75                                   GrVkRenderPass::AttachmentFlags* flags) const;
     76 
     77     void addResources(GrVkCommandBuffer& commandBuffer) const;
     78 
     79 protected:
     80     GrVkRenderTarget(GrVkGpu* gpu,
     81                      const GrSurfaceDesc& desc,
     82                      const GrVkImageInfo& info,
     83                      const GrVkImageInfo& msaaInfo,
     84                      const GrVkImageView* colorAttachmentView,
     85                      const GrVkImageView* resolveAttachmentView,
     86                      GrVkImage::Wrapped wrapped);
     87 
     88     GrVkRenderTarget(GrVkGpu* gpu,
     89                      const GrSurfaceDesc& desc,
     90                      const GrVkImageInfo& info,
     91                      const GrVkImageView* colorAttachmentView,
     92                      GrVkImage::Wrapped wrapped);
     93 
     94     GrVkGpu* getVkGpu() const;
     95 
     96     void onAbandon() override;
     97     void onRelease() override;
     98 
     99     // This accounts for the texture's memory and any MSAA renderbuffer's memory.
    100     size_t onGpuMemorySize() const override {
    101         // The plus 1 is to account for the resolve texture.
    102         // TODO: is this still correct?
    103         return GrSurface::ComputeSize(fDesc, fDesc.fSampleCnt+1, false);
    104     }
    105 
    106     void createFramebuffer(GrVkGpu* gpu);
    107 
    108     const GrVkImageView*       fColorAttachmentView;
    109     GrVkImage*                 fMSAAImage;
    110     const GrVkImageView*       fResolveAttachmentView;
    111 
    112 private:
    113     GrVkRenderTarget(GrVkGpu* gpu,
    114                      SkBudgeted,
    115                      const GrSurfaceDesc& desc,
    116                      const GrVkImageInfo& info,
    117                      const GrVkImageInfo& msaaInfo,
    118                      const GrVkImageView* colorAttachmentView,
    119                      const GrVkImageView* resolveAttachmentView,
    120                      GrVkImage::Wrapped wrapped);
    121 
    122     GrVkRenderTarget(GrVkGpu* gpu,
    123                      SkBudgeted,
    124                      const GrSurfaceDesc& desc,
    125                      const GrVkImageInfo& info,
    126                      const GrVkImageView* colorAttachmentView,
    127                      GrVkImage::Wrapped wrapped);
    128 
    129     static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
    130                                     const GrVkImageInfo&, GrVkImage::Wrapped wrapped);
    131 
    132     bool completeStencilAttachment() override;
    133 
    134     void releaseInternalObjects();
    135     void abandonInternalObjects();
    136 
    137     const GrVkFramebuffer*     fFramebuffer;
    138 
    139     // This is a cached pointer to a simple render pass. The render target should unref it
    140     // once it is done with it.
    141     const GrVkRenderPass*      fCachedSimpleRenderPass;
    142     // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target
    143     GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle;
    144 };
    145 
    146 #endif
    147