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 
     17 class GrVkCommandBuffer;
     18 class GrVkFramebuffer;
     19 class GrVkGpu;
     20 class GrVkImageView;
     21 class GrVkStencilAttachment;
     22 
     23 #ifdef SK_BUILD_FOR_WIN
     24 // Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
     25 #pragma warning(push)
     26 #pragma warning(disable: 4250)
     27 #endif
     28 
     29 class GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage {
     30 public:
     31     static GrVkRenderTarget* CreateNewRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
     32                                                    GrGpuResource::LifeCycle,
     33                                                    const GrVkImage::ImageDesc&);
     34 
     35     static GrVkRenderTarget* CreateWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
     36                                                        GrGpuResource::LifeCycle,
     37                                                        const GrVkImage::Resource* resource);
     38 
     39     ~GrVkRenderTarget() override;
     40 
     41     const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
     42     const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
     43     const GrVkImage::Resource* msaaImageResource() const { return fMSAAImageResource; }
     44     const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
     45     const GrVkImage::Resource* stencilImageResource() const;
     46     const GrVkImageView* stencilAttachmentView() const;
     47 
     48     const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
     49 
     50     // override of GrRenderTarget
     51     ResolveType getResolveType() const override {
     52         return kCanResolve_ResolveType;
     53     }
     54 
     55     bool canAttemptStencilAttachment() const override {
     56         return true;
     57     }
     58 
     59     GrBackendObject getRenderTargetHandle() const override;
     60 
     61     // Returns the total number of attachments
     62     void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
     63                                   GrVkRenderPass::AttachmentFlags* flags) const;
     64 
     65     void addResources(GrVkCommandBuffer& commandBuffer) const;
     66 
     67 protected:
     68     enum Derived { kDerived };
     69 
     70     GrVkRenderTarget(GrVkGpu* gpu,
     71                      const GrSurfaceDesc& desc,
     72                      GrGpuResource::LifeCycle,
     73                      const GrVkImage::Resource* imageResource,
     74                      const GrVkImage::Resource* msaaImageResource,
     75                      const GrVkImageView* colorAttachmentView,
     76                      const GrVkImageView* resolveAttachmentView);
     77 
     78     GrVkRenderTarget(GrVkGpu* gpu,
     79                      const GrSurfaceDesc& desc,
     80                      GrGpuResource::LifeCycle,
     81                      const GrVkImage::Resource* imageResource,
     82                      const GrVkImage::Resource* msaaImageResource,
     83                      const GrVkImageView* colorAttachmentView,
     84                      const GrVkImageView* resolveAttachmentView,
     85                      Derived);
     86 
     87     GrVkRenderTarget(GrVkGpu* gpu,
     88                      const GrSurfaceDesc& desc,
     89                      GrGpuResource::LifeCycle,
     90                      const GrVkImage::Resource* imageResource,
     91                      const GrVkImageView* colorAttachmentView);
     92 
     93     GrVkRenderTarget(GrVkGpu* gpu,
     94                      const GrSurfaceDesc& desc,
     95                      GrGpuResource::LifeCycle,
     96                      const GrVkImage::Resource* imageResource,
     97                      const GrVkImageView* colorAttachmentView,
     98                      Derived);
     99 
    100     static GrVkRenderTarget* Create(GrVkGpu*, const GrSurfaceDesc&,
    101                                     GrGpuResource::LifeCycle,
    102                                     const GrVkImage::Resource* imageResource);
    103 
    104     GrVkGpu* getVkGpu() const;
    105 
    106     void onAbandon() override;
    107     void onRelease() override;
    108 
    109     // This accounts for the texture's memory and any MSAA renderbuffer's memory.
    110     size_t onGpuMemorySize() const override {
    111         SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig);
    112         SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig));
    113         size_t colorBytes = GrBytesPerPixel(fDesc.fConfig);
    114         SkASSERT(colorBytes > 0);
    115         return fColorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes;
    116     }
    117 
    118 private:
    119     bool completeStencilAttachment() override;
    120 
    121     void createFramebuffer(GrVkGpu* gpu);
    122 
    123     void releaseInternalObjects();
    124     void abandonInternalObjects();
    125 
    126     const GrVkFramebuffer*     fFramebuffer;
    127     const GrVkImageView*       fColorAttachmentView;
    128     const GrVkImage::Resource* fMSAAImageResource;
    129     const GrVkImageView*       fResolveAttachmentView;
    130     int                        fColorValuesPerPixel;
    131 
    132     // This is a cached pointer to a simple render pass. The render target should unref it
    133     // once it is done with it.
    134     const GrVkRenderPass*      fCachedSimpleRenderPass;
    135 };
    136 
    137 #endif
    138