blob: cb2a2962efe34fc8efe994c267df5d5d765460c5 [file] [log] [blame]
Greg Daniel94403452017-04-18 15:52:36 -04001/*
2 * Copyright 2017 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 GrBackendSurface_DEFINED
9#define GrBackendSurface_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/gpu/GrTypes.h"
12#include "include/gpu/gl/GrGLTypes.h"
13#include "include/gpu/mock/GrMockTypes.h"
14#include "include/gpu/vk/GrVkTypes.h"
Brian Salomone2826ab2019-06-04 15:58:31 -040015#include "include/private/GrGLTypesPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "include/private/GrVkTypesPriv.h"
Greg Daniel52e16d92018-04-10 09:34:07 -040017
Stephen White985741a2019-07-18 11:43:45 -040018#ifdef SK_DAWN
19#include "include/gpu/dawn/GrDawnTypes.h"
20#endif
21
Greg Daniel52e16d92018-04-10 09:34:07 -040022class GrVkImageLayout;
Brian Salomone2826ab2019-06-04 15:58:31 -040023class GrGLTextureParameters;
Greg Daniel94403452017-04-18 15:52:36 -040024
Stephen White985741a2019-07-18 11:43:45 -040025#ifdef SK_DAWN
26#include "dawn/dawncpp.h"
27#endif
28
Timothy Liang4e85e802018-06-28 16:37:18 -040029#ifdef SK_METAL
Mike Kleinc0bd9f92019-04-23 12:05:21 -050030#include "include/gpu/mtl/GrMtlTypes.h"
Timothy Liang4e85e802018-06-28 16:37:18 -040031#endif
32
Robert Phillips8caf85f2018-04-05 09:30:38 -040033#if !SK_SUPPORT_GPU
34
35// SkSurface and SkImage rely on a minimal version of these always being available
36class SK_API GrBackendTexture {
37public:
38 GrBackendTexture() {}
39
40 bool isValid() const { return false; }
41};
42
43class SK_API GrBackendRenderTarget {
44public:
45 GrBackendRenderTarget() {}
46
47 bool isValid() const { return false; }
48};
49#else
50
Robert Phillipsfc711a22018-02-13 17:03:00 -050051class SK_API GrBackendFormat {
52public:
53 // Creates an invalid backend format.
Robert Phillipsb2adbef2019-07-02 16:33:05 -040054 GrBackendFormat() {}
55
56 GrBackendFormat(const GrBackendFormat& src);
Robert Phillipsfc711a22018-02-13 17:03:00 -050057
58 static GrBackendFormat MakeGL(GrGLenum format, GrGLenum target) {
59 return GrBackendFormat(format, target);
60 }
61
Greg Daniela8d92112018-03-09 12:05:04 -050062 static GrBackendFormat MakeVk(VkFormat format) {
Greg Daniel7e000222018-12-03 10:08:21 -050063 return GrBackendFormat(format, GrVkYcbcrConversionInfo());
Robert Phillipsfc711a22018-02-13 17:03:00 -050064 }
Robert Phillipsfc711a22018-02-13 17:03:00 -050065
Greg Daniel7e000222018-12-03 10:08:21 -050066 // This is used for external textures and the VkFormat is assumed to be VK_FORMAT_UNDEFINED.
67 // This call is only supported on Android since the GrVkYcbcrConvesionInfo contains an android
68 // external format.
69 static GrBackendFormat MakeVk(const GrVkYcbcrConversionInfo& ycbcrInfo);
70
Stephen White985741a2019-07-18 11:43:45 -040071#ifdef SK_DAWN
72 static GrBackendFormat MakeDawn(dawn::TextureFormat format) {
73 return GrBackendFormat(format);
74 }
75#endif
76
Timothy Liang4e85e802018-06-28 16:37:18 -040077#ifdef SK_METAL
78 static GrBackendFormat MakeMtl(GrMTLPixelFormat format) {
79 return GrBackendFormat(format);
80 }
81#endif
82
Greg Daniele877dce2019-07-11 10:52:43 -040083 static GrBackendFormat MakeMock(GrColorType colorType) {
84 return GrBackendFormat(colorType);
Robert Phillipsfc711a22018-02-13 17:03:00 -050085 }
86
Greg Daniel45723ac2018-11-30 10:12:43 -050087 bool operator==(const GrBackendFormat& that) const;
88 bool operator!=(const GrBackendFormat& that) const { return !(*this == that); }
89
Greg Daniel4065d452018-11-16 15:43:41 -050090 GrBackendApi backend() const { return fBackend; }
91 GrTextureType textureType() const { return fTextureType; }
Robert Phillipsfc711a22018-02-13 17:03:00 -050092
93 // If the backend API is GL, these return a pointer to the format and target. Otherwise
Robert Phillipsa5e78be2019-07-09 12:34:38 -040094 // they return nullptr.
Robert Phillipsfc711a22018-02-13 17:03:00 -050095 const GrGLenum* getGLFormat() const;
96 const GrGLenum* getGLTarget() const;
97
Robert Phillipsfc711a22018-02-13 17:03:00 -050098 // If the backend API is Vulkan, this returns a pointer to a VkFormat. Otherwise
99 // it returns nullptr
100 const VkFormat* getVkFormat() const;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500101
Greg Daniel7e000222018-12-03 10:08:21 -0500102 const GrVkYcbcrConversionInfo* getVkYcbcrConversionInfo() const;
103
Stephen White985741a2019-07-18 11:43:45 -0400104#ifdef SK_DAWN
105 const dawn::TextureFormat* getDawnFormat() const;
106#endif
107
Timothy Liang4e85e802018-06-28 16:37:18 -0400108#ifdef SK_METAL
109 // If the backend API is Metal, this returns a pointer to a GrMTLPixelFormat. Otherwise
110 // it returns nullptr
111 const GrMTLPixelFormat* getMtlFormat() const;
112#endif
113
Greg Daniele877dce2019-07-11 10:52:43 -0400114 // If the backend API is Mock, this returns a pointer to the colorType.
115 // Otherwise it returns nullptr.
Robert Phillipsa5e78be2019-07-09 12:34:38 -0400116 const GrColorType* getMockColorType() const;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500117
Greg Daniel387ec9a2019-03-07 16:44:54 -0500118 // If possible, copies the GrBackendFormat and forces the texture type to be Texture2D. If the
119 // GrBackendFormat was for Vulkan and it originally had a GrVkYcbcrConversionInfo, we will
120 // remove the conversion and set the format to be VK_FORMAT_R8G8B8A8_UNORM.
Greg Daniel4065d452018-11-16 15:43:41 -0500121 GrBackendFormat makeTexture2D() const;
122
Robert Phillipsfc711a22018-02-13 17:03:00 -0500123 // Returns true if the backend format has been initialized.
124 bool isValid() const { return fValid; }
125
126private:
127 GrBackendFormat(GrGLenum format, GrGLenum target);
128
Greg Daniel7e000222018-12-03 10:08:21 -0500129 GrBackendFormat(const VkFormat vkFormat, const GrVkYcbcrConversionInfo&);
Robert Phillipsfc711a22018-02-13 17:03:00 -0500130
Stephen White985741a2019-07-18 11:43:45 -0400131#ifdef SK_DAWN
132 GrBackendFormat(dawn::TextureFormat format);
133#endif
134
Timothy Liang4e85e802018-06-28 16:37:18 -0400135#ifdef SK_METAL
136 GrBackendFormat(const GrMTLPixelFormat mtlFormat);
137#endif
138
Greg Daniele877dce2019-07-11 10:52:43 -0400139 GrBackendFormat(GrColorType colorType);
Robert Phillipsfc711a22018-02-13 17:03:00 -0500140
Robert Phillipsb2adbef2019-07-02 16:33:05 -0400141 GrBackendApi fBackend = GrBackendApi::kMock;
142 bool fValid = false;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500143
144 union {
Greg Daniel4065d452018-11-16 15:43:41 -0500145 GrGLenum fGLFormat; // the sized, internal format of the GL resource
Greg Daniel7e000222018-12-03 10:08:21 -0500146 struct {
147 VkFormat fFormat;
148 GrVkYcbcrConversionInfo fYcbcrConversionInfo;
Robert Phillips9dbcdcc2019-05-13 10:40:06 -0400149 } fVk;
Stephen White985741a2019-07-18 11:43:45 -0400150#ifdef SK_DAWN
151 dawn::TextureFormat fDawnFormat;
152#endif
153
Timothy Liang4e85e802018-06-28 16:37:18 -0400154#ifdef SK_METAL
155 GrMTLPixelFormat fMtlFormat;
156#endif
Greg Daniele877dce2019-07-11 10:52:43 -0400157 GrColorType fMockColorType;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500158 };
Robert Phillipsb2adbef2019-07-02 16:33:05 -0400159 GrTextureType fTextureType = GrTextureType::kNone;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500160};
161
Brian Salomonec045b42017-07-07 10:34:40 -0400162class SK_API GrBackendTexture {
Greg Daniel94403452017-04-18 15:52:36 -0400163public:
Brian Salomon8fe24272017-07-07 12:56:11 -0400164 // Creates an invalid backend texture.
Greg Daniel9ca30652018-04-06 09:27:20 -0400165 GrBackendTexture() : fIsValid(false) {}
Brian Salomon8fe24272017-07-07 12:56:11 -0400166
Greg Daniele7d8da42017-12-04 11:23:19 -0500167 // The GrGLTextureInfo must have a valid fFormat.
168 GrBackendTexture(int width,
169 int height,
170 GrMipMapped,
171 const GrGLTextureInfo& glInfo);
172
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000173 GrBackendTexture(int width,
174 int height,
175 const GrVkImageInfo& vkInfo);
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000176
Timothy Liang4e85e802018-06-28 16:37:18 -0400177#ifdef SK_METAL
178 GrBackendTexture(int width,
179 int height,
180 GrMipMapped,
181 const GrMtlTextureInfo& mtlInfo);
182#endif
183
Stephen White985741a2019-07-18 11:43:45 -0400184#ifdef SK_DAWN
185 GrBackendTexture(int width,
186 int height,
187 const GrDawnImageInfo& dawnInfo);
188#endif
189
Brian Salomon8fe24272017-07-07 12:56:11 -0400190 GrBackendTexture(int width,
191 int height,
Greg Daniel177e6952017-10-12 12:27:11 -0400192 GrMipMapped,
193 const GrMockTextureInfo& mockInfo);
194
Greg Daniel52e16d92018-04-10 09:34:07 -0400195 GrBackendTexture(const GrBackendTexture& that);
196
197 ~GrBackendTexture();
198
199 GrBackendTexture& operator=(const GrBackendTexture& that);
200
Greg Daniel94403452017-04-18 15:52:36 -0400201 int width() const { return fWidth; }
202 int height() const { return fHeight; }
Greg Daniel177e6952017-10-12 12:27:11 -0400203 bool hasMipMaps() const { return GrMipMapped::kYes == fMipMapped; }
Greg Danielbdf12ad2018-10-12 09:31:11 -0400204 GrBackendApi backend() const {return fBackend; }
Greg Daniel94403452017-04-18 15:52:36 -0400205
Greg Daniel52e16d92018-04-10 09:34:07 -0400206 // If the backend API is GL, copies a snapshot of the GrGLTextureInfo struct into the passed in
207 // pointer and returns true. Otherwise returns false if the backend API is not GL.
208 bool getGLTextureInfo(GrGLTextureInfo*) const;
Greg Danielc0f8e422017-06-13 13:47:53 -0400209
Brian Salomone2826ab2019-06-04 15:58:31 -0400210 // Call this to indicate that the texture parameters have been modified in the GL context
211 // externally to GrContext.
212 void glTextureParametersModified();
213
Stephen White985741a2019-07-18 11:43:45 -0400214#ifdef SK_DAWN
215 // If the backend API is Dawn, copies a snapshot of the GrDawnImageInfo struct into the passed
216 // in pointer and returns true. Otherwise returns false if the backend API is not Dawn.
217 bool getDawnImageInfo(GrDawnImageInfo*) const;
218#endif
219
Greg Daniel323fbcf2018-04-10 13:46:30 -0400220 // If the backend API is Vulkan, copies a snapshot of the GrVkImageInfo struct into the passed
Greg Daniel52e16d92018-04-10 09:34:07 -0400221 // in pointer and returns true. This snapshot will set the fImageLayout to the current layout
222 // state. Otherwise returns false if the backend API is not Vulkan.
223 bool getVkImageInfo(GrVkImageInfo*) const;
224
Greg Daniel323fbcf2018-04-10 13:46:30 -0400225 // Anytime the client changes the VkImageLayout of the VkImage captured by this
226 // GrBackendTexture, they must call this function to notify Skia of the changed layout.
Greg Daniel52e16d92018-04-10 09:34:07 -0400227 void setVkImageLayout(VkImageLayout);
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000228
Timothy Liang4e85e802018-06-28 16:37:18 -0400229#ifdef SK_METAL
230 // If the backend API is Metal, copies a snapshot of the GrMtlTextureInfo struct into the passed
231 // in pointer and returns true. Otherwise returns false if the backend API is not Metal.
232 bool getMtlTextureInfo(GrMtlTextureInfo*) const;
233#endif
234
Brian Salomonf391d0f2018-12-14 09:18:50 -0500235 // Get the GrBackendFormat for this texture (or an invalid format if this is not valid).
236 GrBackendFormat getBackendFormat() const;
237
Greg Daniel52e16d92018-04-10 09:34:07 -0400238 // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
239 // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
240 bool getMockTextureInfo(GrMockTextureInfo*) const;
Brian Salomon8fe24272017-07-07 12:56:11 -0400241
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400242 // Returns true if we are working with protected content.
Brian Salomon4456a0d2019-07-18 15:05:11 -0400243 bool isProtected() const;
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400244
Eric Karl914a36b2017-10-12 12:44:50 -0700245 // Returns true if the backend texture has been initialized.
Greg Daniel9ca30652018-04-06 09:27:20 -0400246 bool isValid() const { return fIsValid; }
Brian Salomon8fe24272017-07-07 12:56:11 -0400247
Brian Salomonaad83152019-05-24 10:16:35 -0400248 // Returns true if both textures are valid and refer to the same API texture.
249 bool isSameTexture(const GrBackendTexture&);
250
Robert Phillipsc5509952018-04-04 15:54:55 -0400251#if GR_TEST_UTILS
Robert Phillipsc80b0e92019-07-23 10:27:09 -0400252 // We can remove the pixelConfig setter once we remove the GrPixelConfig from the
253 // GrBackendTexture and plumb the GrPixelConfig manually throughout our code (or remove all use
Greg Daniel108bb232018-07-03 16:18:29 -0400254 // of GrPixelConfig in general).
Greg Daniel108bb232018-07-03 16:18:29 -0400255 void setPixelConfig(GrPixelConfig config) { fConfig = config; }
256
Robert Phillipsc5509952018-04-04 15:54:55 -0400257 static bool TestingOnly_Equals(const GrBackendTexture& , const GrBackendTexture&);
258#endif
Greg Daniel2a303902018-02-20 10:25:54 -0500259
Eric Karl914a36b2017-10-12 12:44:50 -0700260private:
Greg Daniel5254ccc2017-11-13 11:05:52 -0500261 // Friending for access to the GrPixelConfig
Greg Danielfaa095e2017-12-19 13:15:02 -0500262 friend class SkImage;
Brian Salomon6a426c12018-03-15 12:16:02 -0400263 friend class SkImage_Gpu;
Jim Van Verth8bbce0e2018-10-08 14:34:52 -0400264 friend class SkImage_GpuBase;
Jim Van Verthf49262d2018-10-02 12:07:20 -0400265 friend class SkImage_GpuYUVA;
Jim Van Verth8bbce0e2018-10-08 14:34:52 -0400266 friend class SkPromiseImageHelper;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500267 friend class SkSurface;
Brian Salomonaad83152019-05-24 10:16:35 -0400268 friend class SkSurface_Gpu;
Greg Daniel108bb232018-07-03 16:18:29 -0400269 friend class GrAHardwareBufferImageGenerator;
Greg Daniele728f672018-01-17 10:52:04 -0500270 friend class GrBackendTextureImageGenerator;
Greg Danielf2336e42018-01-23 16:38:14 -0500271 friend class GrProxyProvider;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500272 friend class GrGpu;
273 friend class GrGLGpu;
Stephen White985741a2019-07-18 11:43:45 -0400274 friend class GrDawnGpu;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500275 friend class GrVkGpu;
Timothy Liang4e85e802018-06-28 16:37:18 -0400276 friend class GrMtlGpu;
Greg Daniel057627f2018-03-14 15:51:58 -0400277 friend class PromiseImageHelper;
Robert Phillipsc5509952018-04-04 15:54:55 -0400278
Greg Daniel5254ccc2017-11-13 11:05:52 -0500279 GrPixelConfig config() const { return fConfig; }
280
Brian Salomone2826ab2019-06-04 15:58:31 -0400281#ifdef SK_GL
282 friend class GrGLTexture;
283 GrBackendTexture(int width,
284 int height,
285 GrMipMapped,
286 const GrGLTextureInfo,
287 sk_sp<GrGLTextureParameters>);
288 sk_sp<GrGLTextureParameters> getGLTextureParams() const;
289#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400290
Greg Danielb4d89562018-10-03 18:44:49 +0000291#ifdef SK_VULKAN
Brian Salomone2826ab2019-06-04 15:58:31 -0400292 friend class GrVkTexture;
293 GrBackendTexture(int width,
294 int height,
295 const GrVkImageInfo& vkInfo,
296 sk_sp<GrVkImageLayout> layout);
297 sk_sp<GrVkImageLayout> getGrVkImageLayout() const;
Greg Daniel52e16d92018-04-10 09:34:07 -0400298#endif
299
300 // Free and release and resources being held by the GrBackendTexture.
301 void cleanup();
302
Greg Daniel9ca30652018-04-06 09:27:20 -0400303 bool fIsValid;
Greg Daniel94403452017-04-18 15:52:36 -0400304 int fWidth; //<! width in pixels
305 int fHeight; //<! height in pixels
306 GrPixelConfig fConfig;
Greg Daniel177e6952017-10-12 12:27:11 -0400307 GrMipMapped fMipMapped;
Greg Danielbdf12ad2018-10-12 09:31:11 -0400308 GrBackendApi fBackend;
Greg Daniel94403452017-04-18 15:52:36 -0400309
310 union {
Brian Salomone2826ab2019-06-04 15:58:31 -0400311#ifdef SK_GL
312 GrGLBackendTextureInfo fGLInfo;
313#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400314 GrVkBackendSurfaceInfo fVkInfo;
Brian Salomon8fe24272017-07-07 12:56:11 -0400315 GrMockTextureInfo fMockInfo;
Greg Daniel94403452017-04-18 15:52:36 -0400316 };
Jim Van Verthdac1e552019-05-31 09:10:55 -0400317#ifdef SK_METAL
318 GrMtlTextureInfo fMtlInfo;
319#endif
Stephen White985741a2019-07-18 11:43:45 -0400320#ifdef SK_DAWN
321 GrDawnImageInfo fDawnInfo;
322#endif
Greg Daniel94403452017-04-18 15:52:36 -0400323};
324
Brian Salomonec045b42017-07-07 10:34:40 -0400325class SK_API GrBackendRenderTarget {
Greg Daniel94403452017-04-18 15:52:36 -0400326public:
Robert Phillips57e08282017-11-16 14:59:48 -0500327 // Creates an invalid backend texture.
Greg Daniel9ca30652018-04-06 09:27:20 -0400328 GrBackendRenderTarget() : fIsValid(false) {}
Robert Phillips57e08282017-11-16 14:59:48 -0500329
Greg Danielfaa095e2017-12-19 13:15:02 -0500330 // The GrGLTextureInfo must have a valid fFormat.
331 GrBackendRenderTarget(int width,
332 int height,
333 int sampleCnt,
334 int stencilBits,
335 const GrGLFramebufferInfo& glInfo);
336
Stephen White985741a2019-07-18 11:43:45 -0400337#ifdef SK_DAWN
338 GrBackendRenderTarget(int width,
339 int height,
340 int sampleCnt,
341 int stencilBits,
342 const GrDawnImageInfo& dawnInfo);
343#endif
344
Brian Salomonafdc6b12018-03-09 12:02:32 -0500345 /** Deprecated, use version that does not take stencil bits. */
Greg Daniel94403452017-04-18 15:52:36 -0400346 GrBackendRenderTarget(int width,
347 int height,
348 int sampleCnt,
349 int stencilBits,
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000350 const GrVkImageInfo& vkInfo);
Brian Salomonafdc6b12018-03-09 12:02:32 -0500351 GrBackendRenderTarget(int width, int height, int sampleCnt, const GrVkImageInfo& vkInfo);
Greg Daniel94403452017-04-18 15:52:36 -0400352
Timothy Liang4e85e802018-06-28 16:37:18 -0400353#ifdef SK_METAL
354 GrBackendRenderTarget(int width,
355 int height,
356 int sampleCnt,
357 const GrMtlTextureInfo& mtlInfo);
358#endif
359
Brian Salomon0c51eea2018-03-09 17:02:09 -0500360 GrBackendRenderTarget(int width,
361 int height,
362 int sampleCnt,
363 int stencilBits,
364 const GrMockRenderTargetInfo& mockInfo);
365
Greg Daniel323fbcf2018-04-10 13:46:30 -0400366 ~GrBackendRenderTarget();
367
368 GrBackendRenderTarget(const GrBackendRenderTarget& that);
369 GrBackendRenderTarget& operator=(const GrBackendRenderTarget&);
370
Greg Daniel94403452017-04-18 15:52:36 -0400371 int width() const { return fWidth; }
372 int height() const { return fHeight; }
373 int sampleCnt() const { return fSampleCnt; }
374 int stencilBits() const { return fStencilBits; }
Greg Danielbdf12ad2018-10-12 09:31:11 -0400375 GrBackendApi backend() const {return fBackend; }
Greg Daniel94403452017-04-18 15:52:36 -0400376
Greg Daniel323fbcf2018-04-10 13:46:30 -0400377 // If the backend API is GL, copies a snapshot of the GrGLFramebufferInfo struct into the passed
378 // in pointer and returns true. Otherwise returns false if the backend API is not GL.
379 bool getGLFramebufferInfo(GrGLFramebufferInfo*) const;
Greg Danielc0f8e422017-06-13 13:47:53 -0400380
Stephen White985741a2019-07-18 11:43:45 -0400381#ifdef SK_DAWN
382 // If the backend API is Dawn, copies a snapshot of the GrDawnImageInfo struct into the passed
383 // in pointer and returns true. Otherwise returns false if the backend API is not Dawn.
384 bool getDawnImageInfo(GrDawnImageInfo*) const;
385#endif
386
Greg Daniel323fbcf2018-04-10 13:46:30 -0400387 // If the backend API is Vulkan, copies a snapshot of the GrVkImageInfo struct into the passed
388 // in pointer and returns true. This snapshot will set the fImageLayout to the current layout
389 // state. Otherwise returns false if the backend API is not Vulkan.
390 bool getVkImageInfo(GrVkImageInfo*) const;
391
392 // Anytime the client changes the VkImageLayout of the VkImage captured by this
393 // GrBackendRenderTarget, they must call this function to notify Skia of the changed layout.
394 void setVkImageLayout(VkImageLayout);
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000395
Timothy Liang4e85e802018-06-28 16:37:18 -0400396#ifdef SK_METAL
397 // If the backend API is Metal, copies a snapshot of the GrMtlTextureInfo struct into the passed
398 // in pointer and returns true. Otherwise returns false if the backend API is not Metal.
399 bool getMtlTextureInfo(GrMtlTextureInfo*) const;
400#endif
401
Robert Phillipsf209e882019-06-25 15:59:50 -0400402 // Get the GrBackendFormat for this render target (or an invalid format if this is not valid).
403 GrBackendFormat getBackendFormat() const;
404
Greg Daniel323fbcf2018-04-10 13:46:30 -0400405 // If the backend API is Mock, copies a snapshot of the GrMockTextureInfo struct into the passed
406 // in pointer and returns true. Otherwise returns false if the backend API is not Mock.
407 bool getMockRenderTargetInfo(GrMockRenderTargetInfo*) const;
Brian Salomon0c51eea2018-03-09 17:02:09 -0500408
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400409 // Returns true if we are working with protected content.
Brian Salomon4456a0d2019-07-18 15:05:11 -0400410 bool isProtected() const;
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400411
Robert Phillips57e08282017-11-16 14:59:48 -0500412 // Returns true if the backend texture has been initialized.
Greg Daniel9ca30652018-04-06 09:27:20 -0400413 bool isValid() const { return fIsValid; }
Robert Phillips57e08282017-11-16 14:59:48 -0500414
Robert Phillips8caf85f2018-04-05 09:30:38 -0400415
416#if GR_TEST_UTILS
Robert Phillipsc80b0e92019-07-23 10:27:09 -0400417 // We can remove the pixelConfig setter once we remove the pixel config from the
Greg Daniel108bb232018-07-03 16:18:29 -0400418 // GrBackendRenderTarget and plumb the pixel config manually throughout our code (or remove all
419 // use of GrPixelConfig in general).
Greg Daniel108bb232018-07-03 16:18:29 -0400420 void setPixelConfig(GrPixelConfig config) { fConfig = config; }
421
Robert Phillips8caf85f2018-04-05 09:30:38 -0400422 static bool TestingOnly_Equals(const GrBackendRenderTarget&, const GrBackendRenderTarget&);
423#endif
Greg Daniel2a303902018-02-20 10:25:54 -0500424
Greg Daniel94403452017-04-18 15:52:36 -0400425private:
Greg Daniel5254ccc2017-11-13 11:05:52 -0500426 // Friending for access to the GrPixelConfig
427 friend class SkSurface;
Greg Danielfaa095e2017-12-19 13:15:02 -0500428 friend class SkSurface_Gpu;
429 friend class SkImage_Gpu;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500430 friend class GrGpu;
431 friend class GrGLGpu;
Stephen White985741a2019-07-18 11:43:45 -0400432 friend class GrDawnGpu;
Greg Daniel2a303902018-02-20 10:25:54 -0500433 friend class GrProxyProvider;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500434 friend class GrVkGpu;
Timothy Liang4e85e802018-06-28 16:37:18 -0400435 friend class GrMtlGpu;
Greg Daniel5254ccc2017-11-13 11:05:52 -0500436 GrPixelConfig config() const { return fConfig; }
437
Brian Salomon4456a0d2019-07-18 15:05:11 -0400438 // Requires friending of GrVkGpu (done above already)
439 sk_sp<GrVkImageLayout> getGrVkImageLayout() const;
Greg Daniel323fbcf2018-04-10 13:46:30 -0400440
Brian Salomon4456a0d2019-07-18 15:05:11 -0400441 friend class GrVkRenderTarget;
442 GrBackendRenderTarget(int width, int height, int sampleCnt, const GrVkImageInfo& vkInfo,
443 sk_sp<GrVkImageLayout> layout);
Greg Daniel323fbcf2018-04-10 13:46:30 -0400444
445 // Free and release and resources being held by the GrBackendTexture.
446 void cleanup();
447
Greg Daniel9ca30652018-04-06 09:27:20 -0400448 bool fIsValid;
Greg Daniel94403452017-04-18 15:52:36 -0400449 int fWidth; //<! width in pixels
450 int fHeight; //<! height in pixels
451
452 int fSampleCnt;
453 int fStencilBits;
454 GrPixelConfig fConfig;
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000455
Greg Danielbdf12ad2018-10-12 09:31:11 -0400456 GrBackendApi fBackend;
Greg Daniel94403452017-04-18 15:52:36 -0400457
458 union {
Robert Phillipsf209e882019-06-25 15:59:50 -0400459#ifdef SK_GL
Robert Phillipsfad9e3f2017-06-13 22:16:08 +0000460 GrGLFramebufferInfo fGLInfo;
Robert Phillipsf209e882019-06-25 15:59:50 -0400461#endif
Greg Daniel323fbcf2018-04-10 13:46:30 -0400462 GrVkBackendSurfaceInfo fVkInfo;
Brian Salomon0c51eea2018-03-09 17:02:09 -0500463 GrMockRenderTargetInfo fMockInfo;
Greg Daniel94403452017-04-18 15:52:36 -0400464 };
Jim Van Verthdac1e552019-05-31 09:10:55 -0400465#ifdef SK_METAL
466 GrMtlTextureInfo fMtlInfo;
467#endif
Stephen White985741a2019-07-18 11:43:45 -0400468#ifdef SK_DAWN
469 GrDawnImageInfo fDawnInfo;
470#endif
Greg Daniel94403452017-04-18 15:52:36 -0400471};
472
473#endif
474
Robert Phillips8caf85f2018-04-05 09:30:38 -0400475#endif
476