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 #ifndef GrVkImage_DEFINED
      9 #define GrVkImage_DEFINED
     10 
     11 #include "GrVkResource.h"
     12 #include "SkTypes.h"
     13 
     14 #include "vulkan/vulkan.h"
     15 
     16 class GrVkGpu;
     17 
     18 class GrVkImage : SkNoncopyable {
     19 public:
     20     // unlike GrVkBuffer, this needs to be public so GrVkStencilAttachment can use it
     21     class Resource : public GrVkResource {
     22     public:
     23         enum Flags {
     24             kNo_Flags = 0,
     25             kLinearTiling_Flag = 0x01
     26         };
     27 
     28         VkImage        fImage;
     29         VkDeviceMemory fAlloc;
     30         Flags          fFlags;
     31 
     32         Resource() : INHERITED(), fImage(nullptr), fAlloc(nullptr), fFlags(kNo_Flags) {}
     33 
     34         Resource(VkImage image, VkDeviceMemory alloc, Flags flags)
     35             : fImage(image), fAlloc(alloc), fFlags(flags) {}
     36 
     37         ~Resource() override {}
     38     private:
     39         void freeGPUData(const GrVkGpu* gpu) const override;
     40 
     41         typedef GrVkResource INHERITED;
     42     };
     43 
     44 
     45     GrVkImage(const Resource* imageResource) : fResource(imageResource) {
     46         if (imageResource->fFlags & Resource::kLinearTiling_Flag) {
     47             fCurrentLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
     48         } else {
     49             fCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED;
     50         }
     51         imageResource->ref();
     52     }
     53 
     54     virtual ~GrVkImage();
     55 
     56     VkImage textureImage() const { return fResource->fImage; }
     57     VkDeviceMemory textureMemory() const { return fResource->fAlloc; }
     58     const Resource* resource() const { return fResource; }
     59     bool isLinearTiled() const {
     60         return SkToBool(fResource->fFlags & Resource::kLinearTiling_Flag);
     61     }
     62 
     63     VkImageLayout currentLayout() const { return fCurrentLayout; }
     64 
     65     void setImageLayout(const GrVkGpu* gpu, VkImageLayout newLayout,
     66                         VkAccessFlags srcAccessMask,
     67                         VkAccessFlags dstAccessMask,
     68                         VkPipelineStageFlags srcStageMask,
     69                         VkPipelineStageFlags dstStageMask,
     70                         bool byRegion);
     71 
     72     struct ImageDesc {
     73         VkImageType         fImageType;
     74         VkFormat            fFormat;
     75         uint32_t            fWidth;
     76         uint32_t            fHeight;
     77         uint32_t            fLevels;
     78         uint32_t            fSamples;
     79         VkImageTiling       fImageTiling;
     80         VkImageUsageFlags   fUsageFlags;
     81         VkFlags             fMemProps;
     82 
     83         ImageDesc()
     84             : fImageType(VK_IMAGE_TYPE_2D)
     85             , fFormat(VK_FORMAT_UNDEFINED)
     86             , fWidth(0)
     87             , fHeight(0)
     88             , fLevels(1)
     89             , fSamples(1)
     90             , fImageTiling(VK_IMAGE_TILING_OPTIMAL)
     91             , fUsageFlags(0)
     92             , fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {}
     93     };
     94 
     95     static const Resource* CreateResource(const GrVkGpu* gpu, const ImageDesc& imageDesc);
     96 
     97 protected:
     98 
     99     void releaseImage(const GrVkGpu* gpu);
    100     void abandonImage();
    101 
    102     const Resource* fResource;
    103 
    104     VkImageLayout   fCurrentLayout;
    105 
    106 };
    107 
    108 #endif
    109