blob: 57ab18aa4bc98c5bda406a0a2fc16fb35ec2ee6e [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:
egdanielb2df0c22016-05-13 11:30:37 -070026 enum Wrapped {
27 kNot_Wrapped,
28 kAdopted_Wrapped,
29 kBorrowed_Wrapped,
Greg Daniel164a9f02016-02-22 09:56:40 -050030 };
31
egdanielb2df0c22016-05-13 11:30:37 -070032 GrVkImage(const GrVkImageInfo& info, Wrapped wrapped)
33 : fInfo(info)
34 , fIsBorrowed(kBorrowed_Wrapped == wrapped) {
35 if (kBorrowed_Wrapped == wrapped) {
jvanverth6b6ffc42016-06-13 14:28:07 -070036 fResource = new BorrowedResource(info.fImage, info.fAlloc, info.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050037 } else {
jvanverth6b6ffc42016-06-13 14:28:07 -070038 fResource = new Resource(info.fImage, info.fAlloc, info.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050039 }
Greg Daniel164a9f02016-02-22 09:56:40 -050040 }
Greg Daniel164a9f02016-02-22 09:56:40 -050041 virtual ~GrVkImage();
42
egdanielb2df0c22016-05-13 11:30:37 -070043 VkImage image() const { return fInfo.fImage; }
jvanverth1e305ba2016-06-01 09:39:15 -070044 const GrVkAlloc& alloc() const { return fInfo.fAlloc; }
egdanielb2df0c22016-05-13 11:30:37 -070045 VkFormat imageFormat() const { return fInfo.fFormat; }
egdaniel7ac5da82016-07-15 13:41:42 -070046 uint32_t mipLevels() const { return fInfo.fLevelCount; }
Greg Daniel164a9f02016-02-22 09:56:40 -050047 const Resource* resource() const { return fResource; }
48 bool isLinearTiled() const {
egdanielb2df0c22016-05-13 11:30:37 -070049 return SkToBool(VK_IMAGE_TILING_LINEAR == fInfo.fImageTiling);
Greg Daniel164a9f02016-02-22 09:56:40 -050050 }
Brian Osman13dddce2017-05-09 13:19:50 -040051 bool isBorrowed() const { return fIsBorrowed; }
Greg Daniel164a9f02016-02-22 09:56:40 -050052
egdanielb2df0c22016-05-13 11:30:37 -070053 VkImageLayout currentLayout() const { return fInfo.fImageLayout; }
Greg Daniel164a9f02016-02-22 09:56:40 -050054
egdaniel58a8d922016-04-21 08:03:10 -070055 void setImageLayout(const GrVkGpu* gpu,
56 VkImageLayout newLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050057 VkAccessFlags dstAccessMask,
Greg Daniel164a9f02016-02-22 09:56:40 -050058 VkPipelineStageFlags dstStageMask,
59 bool byRegion);
60
61 struct ImageDesc {
62 VkImageType fImageType;
63 VkFormat fFormat;
64 uint32_t fWidth;
65 uint32_t fHeight;
66 uint32_t fLevels;
67 uint32_t fSamples;
68 VkImageTiling fImageTiling;
69 VkImageUsageFlags fUsageFlags;
70 VkFlags fMemProps;
71
72 ImageDesc()
73 : fImageType(VK_IMAGE_TYPE_2D)
74 , fFormat(VK_FORMAT_UNDEFINED)
75 , fWidth(0)
76 , fHeight(0)
77 , fLevels(1)
78 , fSamples(1)
79 , fImageTiling(VK_IMAGE_TILING_OPTIMAL)
80 , fUsageFlags(0)
81 , fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {}
82 };
83
egdanielb2df0c22016-05-13 11:30:37 -070084 static bool InitImageInfo(const GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImageInfo*);
85 // Destroys the internal VkImage and VkDeviceMemory in the GrVkImageInfo
86 static void DestroyImageInfo(const GrVkGpu* gpu, GrVkImageInfo*);
Greg Daniel164a9f02016-02-22 09:56:40 -050087
Greg Danielcef213c2017-04-21 11:52:27 -040088 // These match the definitions in SkImage, for whence they came
89 typedef void* ReleaseCtx;
90 typedef void (*ReleaseProc)(ReleaseCtx);
91
92 void setResourceRelease(ReleaseProc proc, ReleaseCtx ctx);
93
Greg Daniel164a9f02016-02-22 09:56:40 -050094protected:
Greg Daniel164a9f02016-02-22 09:56:40 -050095 void releaseImage(const GrVkGpu* gpu);
96 void abandonImage();
97
jvanverth6b6ffc42016-06-13 14:28:07 -070098 void setNewResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling);
egdanielb2df0c22016-05-13 11:30:37 -070099
100 GrVkImageInfo fInfo;
101 bool fIsBorrowed;
102
103private:
egdanielb2df0c22016-05-13 11:30:37 -0700104 class Resource : public GrVkResource {
105 public:
106 Resource()
107 : INHERITED()
Greg Danielcef213c2017-04-21 11:52:27 -0400108 , fReleaseProc(nullptr)
109 , fReleaseCtx(nullptr)
jvanverth1e305ba2016-06-01 09:39:15 -0700110 , fImage(VK_NULL_HANDLE) {
111 fAlloc.fMemory = VK_NULL_HANDLE;
112 fAlloc.fOffset = 0;
egdanielb2df0c22016-05-13 11:30:37 -0700113 }
114
jvanverth6b6ffc42016-06-13 14:28:07 -0700115 Resource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling)
Greg Danielcef213c2017-04-21 11:52:27 -0400116 : fReleaseProc(nullptr)
117 , fReleaseCtx(nullptr)
118 , fImage(image)
119 , fAlloc(alloc)
120 , fImageTiling(tiling) {}
egdanielb2df0c22016-05-13 11:30:37 -0700121
Greg Danielcef213c2017-04-21 11:52:27 -0400122 ~Resource() override {
123 SkASSERT(!fReleaseProc);
124 }
egdanielb2df0c22016-05-13 11:30:37 -0700125
jvanverth7ec92412016-07-06 09:24:57 -0700126#ifdef SK_TRACE_VK_RESOURCES
127 void dumpInfo() const override {
egdaniela95220d2016-07-21 11:50:37 -0700128 SkDebugf("GrVkImage: %d (%d refs)\n", fImage, this->getRefCnt());
jvanverth7ec92412016-07-06 09:24:57 -0700129 }
130#endif
Greg Danielcef213c2017-04-21 11:52:27 -0400131 void setRelease(ReleaseProc proc, ReleaseCtx ctx) const {
132 fReleaseProc = proc;
133 fReleaseCtx = ctx;
134 }
135 protected:
136 mutable ReleaseProc fReleaseProc;
137 mutable ReleaseCtx fReleaseCtx;
138
egdanielb2df0c22016-05-13 11:30:37 -0700139 private:
140 void freeGPUData(const GrVkGpu* gpu) const override;
Greg Danielcef213c2017-04-21 11:52:27 -0400141 void abandonGPUData() const override {
142 SkASSERT(!fReleaseProc);
143 }
egdanielb2df0c22016-05-13 11:30:37 -0700144
jvanverth1e305ba2016-06-01 09:39:15 -0700145 VkImage fImage;
146 GrVkAlloc fAlloc;
jvanverth6b6ffc42016-06-13 14:28:07 -0700147 VkImageTiling fImageTiling;
egdanielb2df0c22016-05-13 11:30:37 -0700148
149 typedef GrVkResource INHERITED;
150 };
151
152 // for wrapped textures
153 class BorrowedResource : public Resource {
154 public:
jvanverth6b6ffc42016-06-13 14:28:07 -0700155 BorrowedResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling)
156 : Resource(image, alloc, tiling) {
egdanielb2df0c22016-05-13 11:30:37 -0700157 }
158 private:
Greg Danielcef213c2017-04-21 11:52:27 -0400159 void invokeReleaseProc() const {
160 if (fReleaseProc) {
161 fReleaseProc(fReleaseCtx);
162 fReleaseProc = nullptr;
163 }
164 }
165
egdanielb2df0c22016-05-13 11:30:37 -0700166 void freeGPUData(const GrVkGpu* gpu) const override;
Greg Danielcef213c2017-04-21 11:52:27 -0400167 void abandonGPUData() const override;
egdanielb2df0c22016-05-13 11:30:37 -0700168 };
169
Greg Daniel164a9f02016-02-22 09:56:40 -0500170 const Resource* fResource;
171
egdanielb2df0c22016-05-13 11:30:37 -0700172 friend class GrVkRenderTarget;
Greg Daniel164a9f02016-02-22 09:56:40 -0500173};
174
175#endif