blob: b71ed4940c842d7de377c3bd8fc43c2aa08baffc [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
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"
jvanverth900bd4a2016-04-29 13:53:12 -070012
13#include "GrTypesPriv.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014#include "SkTypes.h"
15
jvanverthe50f3e72016-03-28 07:03:06 -070016#include "vk/GrVkDefines.h"
egdanielb2df0c22016-05-13 11:30:37 -070017#include "vk/GrVkTypes.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018
19class GrVkGpu;
20
21class GrVkImage : SkNoncopyable {
egdanielb2df0c22016-05-13 11:30:37 -070022private:
23 class Resource;
24
Greg Daniel164a9f02016-02-22 09:56:40 -050025public:
Greg Daniel1591c382017-08-17 15:37:20 -040026 GrVkImage(const GrVkImageInfo& info, GrBackendObjectOwnership ownership)
egdanielb2df0c22016-05-13 11:30:37 -070027 : fInfo(info)
Greg Daniel1591c382017-08-17 15:37:20 -040028 , fIsBorrowed(GrBackendObjectOwnership::kBorrowed == ownership) {
29 if (fIsBorrowed) {
jvanverth6b6ffc42016-06-13 14:28:07 -070030 fResource = new BorrowedResource(info.fImage, info.fAlloc, info.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050031 } else {
jvanverth6b6ffc42016-06-13 14:28:07 -070032 fResource = new Resource(info.fImage, info.fAlloc, info.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050033 }
Greg Daniel164a9f02016-02-22 09:56:40 -050034 }
Greg Daniel164a9f02016-02-22 09:56:40 -050035 virtual ~GrVkImage();
36
egdanielb2df0c22016-05-13 11:30:37 -070037 VkImage image() const { return fInfo.fImage; }
jvanverth1e305ba2016-06-01 09:39:15 -070038 const GrVkAlloc& alloc() const { return fInfo.fAlloc; }
egdanielb2df0c22016-05-13 11:30:37 -070039 VkFormat imageFormat() const { return fInfo.fFormat; }
egdaniel7ac5da82016-07-15 13:41:42 -070040 uint32_t mipLevels() const { return fInfo.fLevelCount; }
Greg Daniel164a9f02016-02-22 09:56:40 -050041 const Resource* resource() const { return fResource; }
42 bool isLinearTiled() const {
egdanielb2df0c22016-05-13 11:30:37 -070043 return SkToBool(VK_IMAGE_TILING_LINEAR == fInfo.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050044 }
Brian Osman13dddce2017-05-09 13:19:50 -040045 bool isBorrowed() const { return fIsBorrowed; }
Greg Daniel164a9f02016-02-22 09:56:40 -050046
egdanielb2df0c22016-05-13 11:30:37 -070047 VkImageLayout currentLayout() const { return fInfo.fImageLayout; }
Greg Daniel164a9f02016-02-22 09:56:40 -050048
egdaniel58a8d922016-04-21 08:03:10 -070049 void setImageLayout(const GrVkGpu* gpu,
50 VkImageLayout newLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050051 VkAccessFlags dstAccessMask,
Greg Daniel164a9f02016-02-22 09:56:40 -050052 VkPipelineStageFlags dstStageMask,
53 bool byRegion);
54
55 struct ImageDesc {
56 VkImageType fImageType;
57 VkFormat fFormat;
58 uint32_t fWidth;
59 uint32_t fHeight;
60 uint32_t fLevels;
61 uint32_t fSamples;
62 VkImageTiling fImageTiling;
63 VkImageUsageFlags fUsageFlags;
64 VkFlags fMemProps;
65
66 ImageDesc()
67 : fImageType(VK_IMAGE_TYPE_2D)
68 , fFormat(VK_FORMAT_UNDEFINED)
69 , fWidth(0)
70 , fHeight(0)
71 , fLevels(1)
72 , fSamples(1)
73 , fImageTiling(VK_IMAGE_TILING_OPTIMAL)
74 , fUsageFlags(0)
75 , fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {}
76 };
77
egdanielb2df0c22016-05-13 11:30:37 -070078 static bool InitImageInfo(const GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImageInfo*);
79 // Destroys the internal VkImage and VkDeviceMemory in the GrVkImageInfo
80 static void DestroyImageInfo(const GrVkGpu* gpu, GrVkImageInfo*);
Greg Daniel164a9f02016-02-22 09:56:40 -050081
Greg Danielcef213c2017-04-21 11:52:27 -040082 // These match the definitions in SkImage, for whence they came
83 typedef void* ReleaseCtx;
84 typedef void (*ReleaseProc)(ReleaseCtx);
85
86 void setResourceRelease(ReleaseProc proc, ReleaseCtx ctx);
87
Greg Daniel164a9f02016-02-22 09:56:40 -050088protected:
Greg Daniel164a9f02016-02-22 09:56:40 -050089 void releaseImage(const GrVkGpu* gpu);
90 void abandonImage();
91
jvanverth6b6ffc42016-06-13 14:28:07 -070092 void setNewResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling);
egdanielb2df0c22016-05-13 11:30:37 -070093
94 GrVkImageInfo fInfo;
95 bool fIsBorrowed;
96
97private:
egdanielb2df0c22016-05-13 11:30:37 -070098 class Resource : public GrVkResource {
99 public:
100 Resource()
101 : INHERITED()
Greg Danielcef213c2017-04-21 11:52:27 -0400102 , fReleaseProc(nullptr)
103 , fReleaseCtx(nullptr)
jvanverth1e305ba2016-06-01 09:39:15 -0700104 , fImage(VK_NULL_HANDLE) {
105 fAlloc.fMemory = VK_NULL_HANDLE;
106 fAlloc.fOffset = 0;
egdanielb2df0c22016-05-13 11:30:37 -0700107 }
108
jvanverth6b6ffc42016-06-13 14:28:07 -0700109 Resource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling)
Greg Danielcef213c2017-04-21 11:52:27 -0400110 : fReleaseProc(nullptr)
111 , fReleaseCtx(nullptr)
112 , fImage(image)
113 , fAlloc(alloc)
114 , fImageTiling(tiling) {}
egdanielb2df0c22016-05-13 11:30:37 -0700115
Greg Danielcef213c2017-04-21 11:52:27 -0400116 ~Resource() override {
117 SkASSERT(!fReleaseProc);
118 }
egdanielb2df0c22016-05-13 11:30:37 -0700119
jvanverth7ec92412016-07-06 09:24:57 -0700120#ifdef SK_TRACE_VK_RESOURCES
121 void dumpInfo() const override {
egdaniela95220d2016-07-21 11:50:37 -0700122 SkDebugf("GrVkImage: %d (%d refs)\n", fImage, this->getRefCnt());
jvanverth7ec92412016-07-06 09:24:57 -0700123 }
124#endif
Greg Danielcef213c2017-04-21 11:52:27 -0400125 void setRelease(ReleaseProc proc, ReleaseCtx ctx) const {
126 fReleaseProc = proc;
127 fReleaseCtx = ctx;
128 }
129 protected:
130 mutable ReleaseProc fReleaseProc;
131 mutable ReleaseCtx fReleaseCtx;
132
egdanielb2df0c22016-05-13 11:30:37 -0700133 private:
134 void freeGPUData(const GrVkGpu* gpu) const override;
Greg Danielcef213c2017-04-21 11:52:27 -0400135 void abandonGPUData() const override {
136 SkASSERT(!fReleaseProc);
137 }
egdanielb2df0c22016-05-13 11:30:37 -0700138
jvanverth1e305ba2016-06-01 09:39:15 -0700139 VkImage fImage;
140 GrVkAlloc fAlloc;
jvanverth6b6ffc42016-06-13 14:28:07 -0700141 VkImageTiling fImageTiling;
egdanielb2df0c22016-05-13 11:30:37 -0700142
143 typedef GrVkResource INHERITED;
144 };
145
146 // for wrapped textures
147 class BorrowedResource : public Resource {
148 public:
jvanverth6b6ffc42016-06-13 14:28:07 -0700149 BorrowedResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling)
150 : Resource(image, alloc, tiling) {
egdanielb2df0c22016-05-13 11:30:37 -0700151 }
152 private:
Greg Danielcef213c2017-04-21 11:52:27 -0400153 void invokeReleaseProc() const {
154 if (fReleaseProc) {
155 fReleaseProc(fReleaseCtx);
156 fReleaseProc = nullptr;
157 }
158 }
159
egdanielb2df0c22016-05-13 11:30:37 -0700160 void freeGPUData(const GrVkGpu* gpu) const override;
Greg Danielcef213c2017-04-21 11:52:27 -0400161 void abandonGPUData() const override;
egdanielb2df0c22016-05-13 11:30:37 -0700162 };
163
Greg Daniel164a9f02016-02-22 09:56:40 -0500164 const Resource* fResource;
165
egdanielb2df0c22016-05-13 11:30:37 -0700166 friend class GrVkRenderTarget;
Greg Daniel164a9f02016-02-22 09:56:40 -0500167};
168
169#endif