blob: fa95520811d5afc7d1f7c1a3e0c825379c938856 [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
Greg Daniel54bfb182018-11-20 17:12:36 -05008
Mike Kleinc0bd9f92019-04-23 12:05:21 -05009#include "include/gpu/GrBackendSurface.h"
Greg Daniel94403452017-04-18 15:52:36 -040010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/gl/GrGLUtil.h"
Greg Daniele7d8da42017-12-04 11:23:19 -050012
Stephen White985741a2019-07-18 11:43:45 -040013#ifdef SK_DAWN
14#include "include/gpu/dawn/GrDawnTypes.h"
15#include "src/gpu/dawn/GrDawnUtil.h"
16#endif
17
Greg Daniel94403452017-04-18 15:52:36 -040018#ifdef SK_VULKAN
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/gpu/vk/GrVkTypes.h"
20#include "src/gpu/vk/GrVkImageLayout.h"
21#include "src/gpu/vk/GrVkUtil.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000022#endif
Timothy Liang4e85e802018-06-28 16:37:18 -040023#ifdef SK_METAL
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "include/gpu/mtl/GrMtlTypes.h"
25#include "src/gpu/mtl/GrMtlCppUtil.h"
Timothy Liang4e85e802018-06-28 16:37:18 -040026#endif
Greg Daniel7ef28f32017-04-20 16:41:55 +000027
Robert Phillipsb2adbef2019-07-02 16:33:05 -040028GrBackendFormat::GrBackendFormat(const GrBackendFormat& that)
29 : fBackend(that.fBackend)
30 , fValid(that.fValid)
31 , fTextureType(that.fTextureType) {
32 if (!fValid) {
33 return;
34 }
35
36 switch (fBackend) {
37#ifdef SK_GL
38 case GrBackendApi::kOpenGL:
39 fGLFormat = that.fGLFormat;
40 break;
41#endif
42#ifdef SK_VULKAN
43 case GrBackendApi::kVulkan:
44 fVk = that.fVk;
45 break;
46#endif
47#ifdef SK_METAL
48 case GrBackendApi::kMetal:
49 fMtlFormat = that.fMtlFormat;
50 break;
51#endif
Stephen White985741a2019-07-18 11:43:45 -040052#ifdef SK_DAWN
53 case GrBackendApi::kDawn:
54 fDawnFormat = that.fDawnFormat;
55 break;
56#endif
Robert Phillipsb2adbef2019-07-02 16:33:05 -040057 case GrBackendApi::kMock:
Greg Daniele877dce2019-07-11 10:52:43 -040058 fMockColorType = that.fMockColorType;
Robert Phillipsb2adbef2019-07-02 16:33:05 -040059 break;
60 default:
61 SK_ABORT("Unknown GrBackend");
62 }
63}
64
Robert Phillipsfc711a22018-02-13 17:03:00 -050065GrBackendFormat::GrBackendFormat(GrGLenum format, GrGLenum target)
Greg Danielbdf12ad2018-10-12 09:31:11 -040066 : fBackend(GrBackendApi::kOpenGL)
Greg Daniel4065d452018-11-16 15:43:41 -050067 , fValid(true)
68 , fGLFormat(format) {
69 switch (target) {
Robert Phillipsf209e882019-06-25 15:59:50 -040070 case GR_GL_TEXTURE_NONE:
71 fTextureType = GrTextureType::kNone;
72 break;
Greg Daniel4065d452018-11-16 15:43:41 -050073 case GR_GL_TEXTURE_2D:
74 fTextureType = GrTextureType::k2D;
75 break;
76 case GR_GL_TEXTURE_RECTANGLE:
77 fTextureType = GrTextureType::kRectangle;
78 break;
79 case GR_GL_TEXTURE_EXTERNAL:
80 fTextureType = GrTextureType::kExternal;
81 break;
82 default:
83 SK_ABORT("Unexpected texture target");
84 }
Robert Phillipsfc711a22018-02-13 17:03:00 -050085}
86
Brian Salomond4764a12019-08-08 12:08:24 -040087GrGLFormat GrBackendFormat::asGLFormat() const {
Greg Danielbdf12ad2018-10-12 09:31:11 -040088 if (this->isValid() && GrBackendApi::kOpenGL == fBackend) {
Brian Salomond4764a12019-08-08 12:08:24 -040089 return GrGLFormatFromGLEnum(fGLFormat);
Robert Phillipsfc711a22018-02-13 17:03:00 -050090 }
Brian Salomond4764a12019-08-08 12:08:24 -040091 return GrGLFormat::kUnknown;
Robert Phillipsfc711a22018-02-13 17:03:00 -050092}
93
Greg Daniel7e000222018-12-03 10:08:21 -050094GrBackendFormat GrBackendFormat::MakeVk(const GrVkYcbcrConversionInfo& ycbcrInfo) {
Sergey Ulanov2739fd22019-08-11 22:46:33 -070095 SkASSERT(ycbcrInfo.isValid());
96 return GrBackendFormat(ycbcrInfo.fFormat, ycbcrInfo);
Greg Daniel7e000222018-12-03 10:08:21 -050097}
98
99GrBackendFormat::GrBackendFormat(VkFormat vkFormat, const GrVkYcbcrConversionInfo& ycbcrInfo)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400100 : fBackend(GrBackendApi::kVulkan)
Greg Danielb4d89562018-10-03 18:44:49 +0000101#ifdef SK_VULKAN
Robert Phillipsfc711a22018-02-13 17:03:00 -0500102 , fValid(true)
Greg Danielb4d89562018-10-03 18:44:49 +0000103#else
Greg Daniel4065d452018-11-16 15:43:41 -0500104 , fValid(false)
Greg Danielb4d89562018-10-03 18:44:49 +0000105#endif
Greg Daniel4065d452018-11-16 15:43:41 -0500106 , fTextureType(GrTextureType::k2D) {
Greg Daniel7e000222018-12-03 10:08:21 -0500107 fVk.fFormat = vkFormat;
108 fVk.fYcbcrConversionInfo = ycbcrInfo;
Sergey Ulanov2739fd22019-08-11 22:46:33 -0700109 if (fVk.fYcbcrConversionInfo.isValid() && fVk.fYcbcrConversionInfo.fExternalFormat) {
Greg Daniel387ec9a2019-03-07 16:44:54 -0500110 fTextureType = GrTextureType::kExternal;
111 }
Robert Phillipsfc711a22018-02-13 17:03:00 -0500112}
113
Brian Salomond4764a12019-08-08 12:08:24 -0400114bool GrBackendFormat::asVkFormat(VkFormat* format) const {
115 SkASSERT(format);
Greg Danielbdf12ad2018-10-12 09:31:11 -0400116 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Brian Salomond4764a12019-08-08 12:08:24 -0400117 *format = fVk.fFormat;
118 return true;
Greg Daniel7e000222018-12-03 10:08:21 -0500119 }
Brian Salomond4764a12019-08-08 12:08:24 -0400120 return false;
Greg Daniel7e000222018-12-03 10:08:21 -0500121}
122
123const GrVkYcbcrConversionInfo* GrBackendFormat::getVkYcbcrConversionInfo() const {
124 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
125 return &fVk.fYcbcrConversionInfo;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500126 }
127 return nullptr;
128}
Robert Phillipsfc711a22018-02-13 17:03:00 -0500129
Stephen White985741a2019-07-18 11:43:45 -0400130#ifdef SK_DAWN
131GrBackendFormat::GrBackendFormat(dawn::TextureFormat format)
132 : fBackend(GrBackendApi::kDawn)
133 , fValid(true)
134 , fDawnFormat(format)
135 , fTextureType(GrTextureType::k2D) {
136}
137
Brian Salomond4764a12019-08-08 12:08:24 -0400138bool GrBackendFormat::asDawnFormat(dawn::TextureFormat* format) const {
139 SkASSERT(format);
Stephen White985741a2019-07-18 11:43:45 -0400140 if (this->isValid() && GrBackendApi::kDawn == fBackend) {
Brian Salomond4764a12019-08-08 12:08:24 -0400141 *format = fDawnFormat;
142 return true;
Stephen White985741a2019-07-18 11:43:45 -0400143 }
Brian Salomond4764a12019-08-08 12:08:24 -0400144 return false;
Stephen White985741a2019-07-18 11:43:45 -0400145}
146#endif
147
Timothy Liang4e85e802018-06-28 16:37:18 -0400148#ifdef SK_METAL
149GrBackendFormat::GrBackendFormat(GrMTLPixelFormat mtlFormat)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400150 : fBackend(GrBackendApi::kMetal)
Timothy Liang4e85e802018-06-28 16:37:18 -0400151 , fValid(true)
Greg Daniel4065d452018-11-16 15:43:41 -0500152 , fMtlFormat(mtlFormat)
153 , fTextureType(GrTextureType::k2D) {
Timothy Liang4e85e802018-06-28 16:37:18 -0400154}
155
Brian Salomond4764a12019-08-08 12:08:24 -0400156GrMTLPixelFormat GrBackendFormat::asMtlFormat() const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400157 if (this->isValid() && GrBackendApi::kMetal == fBackend) {
Brian Salomond4764a12019-08-08 12:08:24 -0400158 return fMtlFormat;
Timothy Liang4e85e802018-06-28 16:37:18 -0400159 }
Brian Salomond4764a12019-08-08 12:08:24 -0400160 // MTLPixelFormatInvalid == 0
161 return GrMTLPixelFormat(0);
Timothy Liang4e85e802018-06-28 16:37:18 -0400162}
163#endif
164
Greg Daniele877dce2019-07-11 10:52:43 -0400165GrBackendFormat::GrBackendFormat(GrColorType colorType)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400166 : fBackend(GrBackendApi::kMock)
Robert Phillipsfc711a22018-02-13 17:03:00 -0500167 , fValid(true)
Greg Daniel4065d452018-11-16 15:43:41 -0500168 , fTextureType(GrTextureType::k2D) {
Greg Daniele877dce2019-07-11 10:52:43 -0400169 fMockColorType = colorType;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500170}
171
Brian Salomond4764a12019-08-08 12:08:24 -0400172GrColorType GrBackendFormat::asMockColorType() const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400173 if (this->isValid() && GrBackendApi::kMock == fBackend) {
Brian Salomond4764a12019-08-08 12:08:24 -0400174 return fMockColorType;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500175 }
Brian Salomond4764a12019-08-08 12:08:24 -0400176 return GrColorType::kUnknown;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500177}
178
Greg Daniel4065d452018-11-16 15:43:41 -0500179GrBackendFormat GrBackendFormat::makeTexture2D() const {
Greg Daniel4065d452018-11-16 15:43:41 -0500180 GrBackendFormat copy = *this;
Greg Daniel387ec9a2019-03-07 16:44:54 -0500181 if (const GrVkYcbcrConversionInfo* ycbcrInfo = this->getVkYcbcrConversionInfo()) {
182 if (ycbcrInfo->isValid()) {
183 // If we have a ycbcr we remove it from the backend format and set the VkFormat to
184 // R8G8B8A8_UNORM
185 SkASSERT(copy.fBackend == GrBackendApi::kVulkan);
186 copy.fVk.fYcbcrConversionInfo = GrVkYcbcrConversionInfo();
187 copy.fVk.fFormat = VK_FORMAT_R8G8B8A8_UNORM;
188 }
189 }
Greg Daniel4065d452018-11-16 15:43:41 -0500190 copy.fTextureType = GrTextureType::k2D;
191 return copy;
192}
193
Greg Daniel45723ac2018-11-30 10:12:43 -0500194bool GrBackendFormat::operator==(const GrBackendFormat& that) const {
195 // Invalid GrBackendFormats are never equal to anything.
196 if (!fValid || !that.fValid) {
197 return false;
198 }
199
200 if (fBackend != that.fBackend) {
201 return false;
202 }
203
204 switch (fBackend) {
205 case GrBackendApi::kOpenGL:
206 return fGLFormat == that.fGLFormat;
207 case GrBackendApi::kVulkan:
208#ifdef SK_VULKAN
209 return fVk.fFormat == that.fVk.fFormat &&
210 fVk.fYcbcrConversionInfo == that.fVk.fYcbcrConversionInfo;
211#endif
212 break;
213#ifdef SK_METAL
214 case GrBackendApi::kMetal:
215 return fMtlFormat == that.fMtlFormat;
216#endif
217 break;
Stephen White985741a2019-07-18 11:43:45 -0400218 case GrBackendApi::kDawn:
219#ifdef SK_DAWN
220 return fDawnFormat == that.fDawnFormat;
221#endif
222 break;
Greg Daniel45723ac2018-11-30 10:12:43 -0500223 case GrBackendApi::kMock:
Greg Daniele877dce2019-07-11 10:52:43 -0400224 return fMockColorType == that.fMockColorType;
Greg Daniel45723ac2018-11-30 10:12:43 -0500225 default:
226 SK_ABORT("Unknown GrBackend");
227 }
228 return false;
229}
230
Robert Phillipsbac46722019-08-01 15:09:17 -0400231#if GR_TEST_UTILS
232#include "include/core/SkString.h"
233#include "src/gpu/GrTestUtils.h"
234
235#ifdef SK_GL
236#include "src/gpu/gl/GrGLUtil.h"
237#endif
238#ifdef SK_VULKAN
239#include "src/gpu/vk/GrVkUtil.h"
240#endif
241
242SkString GrBackendFormat::toStr() const {
243 SkString str;
244
245 if (!fValid) {
246 str.append("invalid");
247 return str;
248 }
249
250 str.appendf("%s-", GrBackendApiToStr(fBackend));
251
252 switch (fBackend) {
253 case GrBackendApi::kOpenGL:
254#ifdef SK_GL
255 str.append(GrGLFormatToStr(fGLFormat));
256#endif
257 break;
258 case GrBackendApi::kVulkan:
259#ifdef SK_VULKAN
260 str.append(GrVkFormatToStr(fVk.fFormat));
261#endif
262 break;
263 case GrBackendApi::kMetal:
264#ifdef SK_METAL
265 str.append(GrMtlFormatToStr(fMtlFormat));
266#endif
267 break;
268 case GrBackendApi::kDawn:
269#ifdef SK_DAWN
Stephen Whited7325182019-08-02 17:22:59 -0400270 str.append(GrDawnFormatToStr(fDawnFormat));
Robert Phillipsbac46722019-08-01 15:09:17 -0400271#endif
272 break;
273 case GrBackendApi::kMock:
274 str.append(GrColorTypeToStr(fMockColorType));
275 break;
276 }
277
278 return str;
279}
280#endif
281
282///////////////////////////////////////////////////////////////////////////////////////////////////
Stephen White985741a2019-07-18 11:43:45 -0400283#ifdef SK_DAWN
284GrBackendTexture::GrBackendTexture(int width,
285 int height,
286 const GrDawnImageInfo& dawnInfo)
287 : fIsValid(true)
288 , fWidth(width)
289 , fHeight(height)
Stephen White985741a2019-07-18 11:43:45 -0400290 , fMipMapped(GrMipMapped(dawnInfo.fLevelCount > 1))
291 , fBackend(GrBackendApi::kDawn)
292 , fDawnInfo(dawnInfo) {}
293#endif
294
Brian Salomon4456a0d2019-07-18 15:05:11 -0400295GrBackendTexture::GrBackendTexture(int width, int height, const GrVkImageInfo& vkInfo)
Greg Danielb4d89562018-10-03 18:44:49 +0000296#ifdef SK_VULKAN
Brian Salomon4456a0d2019-07-18 15:05:11 -0400297 : GrBackendTexture(width, height, vkInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -0400298 sk_sp<GrVkImageLayout>(new GrVkImageLayout(vkInfo.fImageLayout))) {}
Greg Danielb4d89562018-10-03 18:44:49 +0000299#else
300 : fIsValid(false) {}
301#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400302
Brian Salomone2826ab2019-06-04 15:58:31 -0400303#ifdef SK_GL
304GrBackendTexture::GrBackendTexture(int width,
305 int height,
306 GrMipMapped mipMapped,
307 const GrGLTextureInfo glInfo,
308 sk_sp<GrGLTextureParameters> params)
309 : fIsValid(true)
310 , fWidth(width)
311 , fHeight(height)
Brian Salomone2826ab2019-06-04 15:58:31 -0400312 , fMipMapped(mipMapped)
313 , fBackend(GrBackendApi::kOpenGL)
314 , fGLInfo(glInfo, params.release()) {}
315
316sk_sp<GrGLTextureParameters> GrBackendTexture::getGLTextureParams() const {
317 if (fBackend != GrBackendApi::kOpenGL) {
318 return nullptr;
319 }
320 return fGLInfo.refParameters();
321}
322#endif
323
Greg Danielb4d89562018-10-03 18:44:49 +0000324#ifdef SK_VULKAN
Greg Daniel52e16d92018-04-10 09:34:07 -0400325GrBackendTexture::GrBackendTexture(int width,
326 int height,
327 const GrVkImageInfo& vkInfo,
328 sk_sp<GrVkImageLayout> layout)
Greg Daniel9ca30652018-04-06 09:27:20 -0400329 : fIsValid(true)
330 , fWidth(width)
Greg Daniel94403452017-04-18 15:52:36 -0400331 , fHeight(height)
Chris Dalton3b51df12017-11-27 14:33:06 -0700332 , fMipMapped(GrMipMapped(vkInfo.fLevelCount > 1))
Greg Danielbdf12ad2018-10-12 09:31:11 -0400333 , fBackend(GrBackendApi::kVulkan)
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400334 , fVkInfo(vkInfo, layout.release()) {}
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000335#endif
Greg Daniel94403452017-04-18 15:52:36 -0400336
Timothy Liang4e85e802018-06-28 16:37:18 -0400337#ifdef SK_METAL
338GrBackendTexture::GrBackendTexture(int width,
339 int height,
340 GrMipMapped mipMapped,
341 const GrMtlTextureInfo& mtlInfo)
342 : fIsValid(true)
343 , fWidth(width)
344 , fHeight(height)
Timothy Liang4e85e802018-06-28 16:37:18 -0400345 , fMipMapped(mipMapped)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400346 , fBackend(GrBackendApi::kMetal)
Timothy Liang4e85e802018-06-28 16:37:18 -0400347 , fMtlInfo(mtlInfo) {}
348#endif
349
Brian Salomon8fe24272017-07-07 12:56:11 -0400350GrBackendTexture::GrBackendTexture(int width,
351 int height,
Greg Daniele7d8da42017-12-04 11:23:19 -0500352 GrMipMapped mipMapped,
353 const GrGLTextureInfo& glInfo)
Brian Salomone2826ab2019-06-04 15:58:31 -0400354 : GrBackendTexture(width, height, mipMapped, glInfo, sk_make_sp<GrGLTextureParameters>()) {
355 // Make no assumptions about client's texture's parameters.
356 this->glTextureParametersModified();
357}
Greg Daniele7d8da42017-12-04 11:23:19 -0500358
359GrBackendTexture::GrBackendTexture(int width,
360 int height,
Greg Daniel177e6952017-10-12 12:27:11 -0400361 GrMipMapped mipMapped,
362 const GrMockTextureInfo& mockInfo)
Greg Daniel9ca30652018-04-06 09:27:20 -0400363 : fIsValid(true)
364 , fWidth(width)
Brian Salomon8fe24272017-07-07 12:56:11 -0400365 , fHeight(height)
Greg Daniel177e6952017-10-12 12:27:11 -0400366 , fMipMapped(mipMapped)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400367 , fBackend(GrBackendApi::kMock)
Brian Salomon8fe24272017-07-07 12:56:11 -0400368 , fMockInfo(mockInfo) {}
369
Greg Daniel52e16d92018-04-10 09:34:07 -0400370GrBackendTexture::~GrBackendTexture() {
371 this->cleanup();
372}
373
374void GrBackendTexture::cleanup() {
Brian Salomone2826ab2019-06-04 15:58:31 -0400375#ifdef SK_GL
376 if (this->isValid() && GrBackendApi::kOpenGL == fBackend) {
377 fGLInfo.cleanup();
378 }
379#endif
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000380#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400381 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400382 fVkInfo.cleanup();
383 }
384#endif
385}
386
387GrBackendTexture::GrBackendTexture(const GrBackendTexture& that) : fIsValid(false) {
388 *this = that;
389}
390
391GrBackendTexture& GrBackendTexture::operator=(const GrBackendTexture& that) {
392 if (!that.isValid()) {
393 this->cleanup();
394 fIsValid = false;
395 return *this;
Ben Wagnera797cc92019-06-05 23:59:46 -0400396 } else if (fIsValid && this->fBackend != that.fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400397 this->cleanup();
398 fIsValid = false;
Greg Daniel52e16d92018-04-10 09:34:07 -0400399 }
400 fWidth = that.fWidth;
401 fHeight = that.fHeight;
Greg Daniel52e16d92018-04-10 09:34:07 -0400402 fMipMapped = that.fMipMapped;
403 fBackend = that.fBackend;
404
405 switch (that.fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400406#ifdef SK_GL
Greg Danielbdf12ad2018-10-12 09:31:11 -0400407 case GrBackendApi::kOpenGL:
Brian Salomone2826ab2019-06-04 15:58:31 -0400408 fGLInfo.assign(that.fGLInfo, this->isValid());
Greg Daniel52e16d92018-04-10 09:34:07 -0400409 break;
Mike Kleina55e2142018-10-03 16:34:11 +0000410#endif
Brian Salomone2826ab2019-06-04 15:58:31 -0400411#ifdef SK_VULKAN
412 case GrBackendApi::kVulkan:
413 fVkInfo.assign(that.fVkInfo, this->isValid());
Greg Danielb4d89562018-10-03 18:44:49 +0000414 break;
Brian Salomone2826ab2019-06-04 15:58:31 -0400415#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400416#ifdef SK_METAL
Greg Danielbdf12ad2018-10-12 09:31:11 -0400417 case GrBackendApi::kMetal:
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000418 fMtlInfo = that.fMtlInfo;
Greg Daniel52e16d92018-04-10 09:34:07 -0400419 break;
420#endif
Stephen White985741a2019-07-18 11:43:45 -0400421#ifdef SK_DAWN
422 case GrBackendApi::kDawn:
423 fDawnInfo = that.fDawnInfo;
424 break;
425#endif
Greg Danielbdf12ad2018-10-12 09:31:11 -0400426 case GrBackendApi::kMock:
Greg Daniel52e16d92018-04-10 09:34:07 -0400427 fMockInfo = that.fMockInfo;
428 break;
429 default:
430 SK_ABORT("Unknown GrBackend");
431 }
Brian Salomone2826ab2019-06-04 15:58:31 -0400432 fIsValid = true;
Greg Daniel52e16d92018-04-10 09:34:07 -0400433 return *this;
434}
435
Stephen White985741a2019-07-18 11:43:45 -0400436#ifdef SK_DAWN
437bool GrBackendTexture::getDawnImageInfo(GrDawnImageInfo* outInfo) const {
438 if (this->isValid() && GrBackendApi::kDawn == fBackend) {
439 *outInfo = fDawnInfo;
440 return true;
441 }
442 return false;
443}
444#endif
445
Mike Kleina55e2142018-10-03 16:34:11 +0000446bool GrBackendTexture::getVkImageInfo(GrVkImageInfo* outInfo) const {
Greg Danielb4d89562018-10-03 18:44:49 +0000447#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400448 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400449 *outInfo = fVkInfo.snapImageInfo();
450 return true;
451 }
Greg Danielb4d89562018-10-03 18:44:49 +0000452#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400453 return false;
454}
455
456void GrBackendTexture::setVkImageLayout(VkImageLayout layout) {
Greg Danielb4d89562018-10-03 18:44:49 +0000457#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400458 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400459 fVkInfo.setImageLayout(layout);
460 }
Greg Danielb4d89562018-10-03 18:44:49 +0000461#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400462}
463
Greg Danielb4d89562018-10-03 18:44:49 +0000464#ifdef SK_VULKAN
Brian Salomone2826ab2019-06-04 15:58:31 -0400465sk_sp<GrVkImageLayout> GrBackendTexture::getGrVkImageLayout() const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400466 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400467 return fVkInfo.getGrVkImageLayout();
Greg Daniel94403452017-04-18 15:52:36 -0400468 }
469 return nullptr;
470}
Brian Salomone2826ab2019-06-04 15:58:31 -0400471#endif
Greg Daniel94403452017-04-18 15:52:36 -0400472
Timothy Liang4e85e802018-06-28 16:37:18 -0400473#ifdef SK_METAL
474bool GrBackendTexture::getMtlTextureInfo(GrMtlTextureInfo* outInfo) const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400475 if (this->isValid() && GrBackendApi::kMetal == fBackend) {
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000476 *outInfo = fMtlInfo;
Timothy Liang4e85e802018-06-28 16:37:18 -0400477 return true;
478 }
479 return false;
480}
481#endif
482
Greg Daniel52e16d92018-04-10 09:34:07 -0400483bool GrBackendTexture::getGLTextureInfo(GrGLTextureInfo* outInfo) const {
Brian Salomone2826ab2019-06-04 15:58:31 -0400484#ifdef SK_GL
Greg Danielbdf12ad2018-10-12 09:31:11 -0400485 if (this->isValid() && GrBackendApi::kOpenGL == fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400486 *outInfo = fGLInfo.info();
Greg Daniel52e16d92018-04-10 09:34:07 -0400487 return true;
Brian Osmana7ef3a02019-03-27 15:54:14 -0400488 } else if (this->isValid() && GrBackendApi::kMock == fBackend) {
489 // Hack! This allows some blink unit tests to work when using the Mock GrContext.
490 // Specifically, tests that rely on CanvasResourceProviderTextureGpuMemoryBuffer.
491 // If that code ever goes away (or ideally becomes backend-agnostic), this can go away.
492 *outInfo = GrGLTextureInfo{ GR_GL_TEXTURE_2D,
493 static_cast<GrGLuint>(fMockInfo.fID),
494 GR_GL_RGBA8 };
495 return true;
Greg Daniel94403452017-04-18 15:52:36 -0400496 }
Brian Salomone2826ab2019-06-04 15:58:31 -0400497#endif
Greg Daniel52e16d92018-04-10 09:34:07 -0400498 return false;
Greg Daniel94403452017-04-18 15:52:36 -0400499}
500
Brian Salomone2826ab2019-06-04 15:58:31 -0400501void GrBackendTexture::glTextureParametersModified() {
502#ifdef SK_GL
503 if (this->isValid() && fBackend == GrBackendApi::kOpenGL) {
504 fGLInfo.parameters()->invalidate();
505 }
506#endif
507}
508
Greg Daniel52e16d92018-04-10 09:34:07 -0400509bool GrBackendTexture::getMockTextureInfo(GrMockTextureInfo* outInfo) const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400510 if (this->isValid() && GrBackendApi::kMock == fBackend) {
Greg Daniel52e16d92018-04-10 09:34:07 -0400511 *outInfo = fMockInfo;
512 return true;
Brian Salomon8fe24272017-07-07 12:56:11 -0400513 }
Greg Daniel52e16d92018-04-10 09:34:07 -0400514 return false;
Brian Salomon8fe24272017-07-07 12:56:11 -0400515}
516
Brian Salomon4456a0d2019-07-18 15:05:11 -0400517bool GrBackendTexture::isProtected() const {
518 if (!this->isValid() || this->backend() != GrBackendApi::kVulkan) {
519 return false;
520 }
521 return fVkInfo.isProtected();
522}
523
Brian Salomonaad83152019-05-24 10:16:35 -0400524bool GrBackendTexture::isSameTexture(const GrBackendTexture& that) {
525 if (!this->isValid() || !that.isValid()) {
526 return false;
527 }
528 if (fBackend != that.fBackend) {
529 return false;
530 }
531 switch (fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400532#ifdef SK_GL
Brian Salomonaad83152019-05-24 10:16:35 -0400533 case GrBackendApi::kOpenGL:
Brian Salomone2826ab2019-06-04 15:58:31 -0400534 return fGLInfo.info().fID == that.fGLInfo.info().fID;
535#endif
Brian Salomonaad83152019-05-24 10:16:35 -0400536#ifdef SK_VULKAN
537 case GrBackendApi::kVulkan:
538 return fVkInfo.snapImageInfo().fImage == that.fVkInfo.snapImageInfo().fImage;
539#endif
540#ifdef SK_METAL
541 case GrBackendApi::kMetal:
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000542 return this->fMtlInfo.fTexture == that.fMtlInfo.fTexture;
Brian Salomonaad83152019-05-24 10:16:35 -0400543#endif
544 case GrBackendApi::kMock:
545 return fMockInfo.fID == that.fMockInfo.fID;
546 default:
547 return false;
548 }
549}
550
Brian Salomonf391d0f2018-12-14 09:18:50 -0500551GrBackendFormat GrBackendTexture::getBackendFormat() const {
552 if (!this->isValid()) {
553 return GrBackendFormat();
554 }
555 switch (fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400556#ifdef SK_GL
Brian Salomonf391d0f2018-12-14 09:18:50 -0500557 case GrBackendApi::kOpenGL:
Brian Salomone2826ab2019-06-04 15:58:31 -0400558 return GrBackendFormat::MakeGL(fGLInfo.info().fFormat, fGLInfo.info().fTarget);
559#endif
Brian Salomonf391d0f2018-12-14 09:18:50 -0500560#ifdef SK_VULKAN
561 case GrBackendApi::kVulkan: {
562 auto info = fVkInfo.snapImageInfo();
563 if (info.fYcbcrConversionInfo.isValid()) {
Sergey Ulanov2739fd22019-08-11 22:46:33 -0700564 SkASSERT(info.fFormat == info.fYcbcrConversionInfo.fFormat);
Brian Salomonf391d0f2018-12-14 09:18:50 -0500565 return GrBackendFormat::MakeVk(info.fYcbcrConversionInfo);
566 }
567 return GrBackendFormat::MakeVk(info.fFormat);
568 }
569#endif
Stephen White985741a2019-07-18 11:43:45 -0400570#ifdef SK_DAWN
571 case GrBackendApi::kDawn: {
572 return GrBackendFormat::MakeDawn(fDawnInfo.fFormat);
573 }
574#endif
Brian Salomonf391d0f2018-12-14 09:18:50 -0500575#ifdef SK_METAL
576 case GrBackendApi::kMetal: {
577 GrMtlTextureInfo mtlInfo;
578 SkAssertResult(this->getMtlTextureInfo(&mtlInfo));
579 return GrBackendFormat::MakeMtl(GrGetMTLPixelFormatFromMtlTextureInfo(mtlInfo));
580 }
581#endif
582 case GrBackendApi::kMock:
Robert Phillipsa5e78be2019-07-09 12:34:38 -0400583 return fMockInfo.getBackendFormat();
Brian Salomonf391d0f2018-12-14 09:18:50 -0500584 default:
585 return GrBackendFormat();
586 }
587}
588
Robert Phillipsc5509952018-04-04 15:54:55 -0400589#if GR_TEST_UTILS
590bool GrBackendTexture::TestingOnly_Equals(const GrBackendTexture& t0, const GrBackendTexture& t1) {
591 if (!t0.isValid() || !t1.isValid()) {
592 return false; // two invalid backend textures are not considered equal
593 }
594
595 if (t0.fWidth != t1.fWidth ||
596 t0.fHeight != t1.fHeight ||
Robert Phillipsc5509952018-04-04 15:54:55 -0400597 t0.fMipMapped != t1.fMipMapped ||
598 t0.fBackend != t1.fBackend) {
599 return false;
600 }
601
602 switch (t0.fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400603#ifdef SK_GL
604 case GrBackendApi::kOpenGL:
605 return t0.fGLInfo.info() == t1.fGLInfo.info();
606#endif
607 case GrBackendApi::kMock:
608 return t0.fMockInfo == t1.fMockInfo;
Robert Phillipsc5509952018-04-04 15:54:55 -0400609#ifdef SK_VULKAN
Brian Salomone2826ab2019-06-04 15:58:31 -0400610 case GrBackendApi::kVulkan:
611 return t0.fVkInfo == t1.fVkInfo;
Robert Phillipsc5509952018-04-04 15:54:55 -0400612#endif
Timothy Liang4e85e802018-06-28 16:37:18 -0400613#ifdef SK_METAL
Brian Salomone2826ab2019-06-04 15:58:31 -0400614 case GrBackendApi::kMetal:
615 return t0.fMtlInfo == t1.fMtlInfo;
Timothy Liang4e85e802018-06-28 16:37:18 -0400616#endif
Stephen White985741a2019-07-18 11:43:45 -0400617#ifdef SK_DAWN
618 case GrBackendApi::kDawn:
619 return t0.fDawnInfo == t1.fDawnInfo;
620#endif
Brian Salomone2826ab2019-06-04 15:58:31 -0400621 default:
622 return false;
Robert Phillipsc5509952018-04-04 15:54:55 -0400623 }
Robert Phillipsc5509952018-04-04 15:54:55 -0400624}
625#endif
626
Greg Daniel94403452017-04-18 15:52:36 -0400627////////////////////////////////////////////////////////////////////////////////////////////////////
628
Stephen White985741a2019-07-18 11:43:45 -0400629#ifdef SK_DAWN
630GrBackendRenderTarget::GrBackendRenderTarget(int width,
631 int height,
632 int sampleCnt,
633 int stencilBits,
634 const GrDawnImageInfo& dawnInfo)
635 : fIsValid(true)
636 , fWidth(width)
637 , fHeight(height)
638 , fSampleCnt(sampleCnt)
639 , fStencilBits(stencilBits)
Stephen White985741a2019-07-18 11:43:45 -0400640 , fBackend(GrBackendApi::kDawn)
641 , fDawnInfo(dawnInfo) {}
642#endif
643
Greg Daniel94403452017-04-18 15:52:36 -0400644GrBackendRenderTarget::GrBackendRenderTarget(int width,
645 int height,
646 int sampleCnt,
647 int stencilBits,
Greg Danielbcf612b2017-05-01 13:50:58 +0000648 const GrVkImageInfo& vkInfo)
Brian Salomon4456a0d2019-07-18 15:05:11 -0400649 : GrBackendRenderTarget(width, height, sampleCnt, vkInfo) {
Brian Salomonafdc6b12018-03-09 12:02:32 -0500650 // This is a deprecated constructor that takes a bogus stencil bits.
651 SkASSERT(0 == stencilBits);
652}
653
654GrBackendRenderTarget::GrBackendRenderTarget(int width,
655 int height,
656 int sampleCnt,
657 const GrVkImageInfo& vkInfo)
Greg Danielb4d89562018-10-03 18:44:49 +0000658#ifdef SK_VULKAN
Brian Salomon4456a0d2019-07-18 15:05:11 -0400659 : GrBackendRenderTarget(width, height, sampleCnt, vkInfo,
Greg Daniel323fbcf2018-04-10 13:46:30 -0400660 sk_sp<GrVkImageLayout>(new GrVkImageLayout(vkInfo.fImageLayout))) {}
Greg Danielb4d89562018-10-03 18:44:49 +0000661#else
662 : fIsValid(false) {}
663#endif
Greg Daniel323fbcf2018-04-10 13:46:30 -0400664
Greg Danielb4d89562018-10-03 18:44:49 +0000665#ifdef SK_VULKAN
Greg Daniel323fbcf2018-04-10 13:46:30 -0400666GrBackendRenderTarget::GrBackendRenderTarget(int width,
667 int height,
668 int sampleCnt,
669 const GrVkImageInfo& vkInfo,
670 sk_sp<GrVkImageLayout> layout)
Greg Daniel9ca30652018-04-06 09:27:20 -0400671 : fIsValid(true)
672 , fWidth(width)
Greg Daniel94403452017-04-18 15:52:36 -0400673 , fHeight(height)
Brian Salomonbdecacf2018-02-02 20:32:49 -0500674 , fSampleCnt(SkTMax(1, sampleCnt))
Brian Salomonafdc6b12018-03-09 12:02:32 -0500675 , fStencilBits(0) // We always create stencil buffers internally for vulkan
Greg Danielbdf12ad2018-10-12 09:31:11 -0400676 , fBackend(GrBackendApi::kVulkan)
Greg Daniel323fbcf2018-04-10 13:46:30 -0400677 , fVkInfo(vkInfo, layout.release()) {}
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000678#endif
Greg Daniel94403452017-04-18 15:52:36 -0400679
Timothy Liang4e85e802018-06-28 16:37:18 -0400680#ifdef SK_METAL
681GrBackendRenderTarget::GrBackendRenderTarget(int width,
682 int height,
683 int sampleCnt,
684 const GrMtlTextureInfo& mtlInfo)
685 : fIsValid(true)
686 , fWidth(width)
687 , fHeight(height)
688 , fSampleCnt(SkTMax(1, sampleCnt))
689 , fStencilBits(0)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400690 , fBackend(GrBackendApi::kMetal)
Timothy Liang4e85e802018-06-28 16:37:18 -0400691 , fMtlInfo(mtlInfo) {}
692#endif
693
Greg Danielfaa095e2017-12-19 13:15:02 -0500694GrBackendRenderTarget::GrBackendRenderTarget(int width,
695 int height,
696 int sampleCnt,
697 int stencilBits,
698 const GrGLFramebufferInfo& glInfo)
Robert Phillipsb45f47d2019-02-03 17:17:54 -0500699 : fWidth(width)
Greg Danielfaa095e2017-12-19 13:15:02 -0500700 , fHeight(height)
Brian Salomonbdecacf2018-02-02 20:32:49 -0500701 , fSampleCnt(SkTMax(1, sampleCnt))
Greg Danielfaa095e2017-12-19 13:15:02 -0500702 , fStencilBits(stencilBits)
Greg Danielbdf12ad2018-10-12 09:31:11 -0400703 , fBackend(GrBackendApi::kOpenGL)
Robert Phillipsb45f47d2019-02-03 17:17:54 -0500704 , fGLInfo(glInfo) {
705 fIsValid = SkToBool(glInfo.fFormat); // the glInfo must have a valid format
706}
Greg Danielfaa095e2017-12-19 13:15:02 -0500707
Brian Salomon0c51eea2018-03-09 17:02:09 -0500708GrBackendRenderTarget::GrBackendRenderTarget(int width,
709 int height,
710 int sampleCnt,
711 int stencilBits,
712 const GrMockRenderTargetInfo& mockInfo)
Greg Daniel9ca30652018-04-06 09:27:20 -0400713 : fIsValid(true)
714 , fWidth(width)
Brian Salomon0c51eea2018-03-09 17:02:09 -0500715 , fHeight(height)
716 , fSampleCnt(SkTMax(1, sampleCnt))
717 , fStencilBits(stencilBits)
Brian Salomon0c51eea2018-03-09 17:02:09 -0500718 , fMockInfo(mockInfo) {}
719
Greg Daniel323fbcf2018-04-10 13:46:30 -0400720GrBackendRenderTarget::~GrBackendRenderTarget() {
721 this->cleanup();
722}
723
724void GrBackendRenderTarget::cleanup() {
Robert Phillipsfcd5fdd2017-06-14 01:43:29 +0000725#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400726 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400727 fVkInfo.cleanup();
728 }
729#endif
730}
731
732GrBackendRenderTarget::GrBackendRenderTarget(const GrBackendRenderTarget& that) : fIsValid(false) {
733 *this = that;
734}
735
736GrBackendRenderTarget& GrBackendRenderTarget::operator=(const GrBackendRenderTarget& that) {
737 if (!that.isValid()) {
738 this->cleanup();
739 fIsValid = false;
740 return *this;
Ben Wagnera797cc92019-06-05 23:59:46 -0400741 } else if (fIsValid && this->fBackend != that.fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400742 this->cleanup();
743 fIsValid = false;
Greg Daniel323fbcf2018-04-10 13:46:30 -0400744 }
745 fWidth = that.fWidth;
746 fHeight = that.fHeight;
747 fSampleCnt = that.fSampleCnt;
748 fStencilBits = that.fStencilBits;
Greg Daniel323fbcf2018-04-10 13:46:30 -0400749 fBackend = that.fBackend;
750
751 switch (that.fBackend) {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400752 case GrBackendApi::kOpenGL:
Greg Daniel323fbcf2018-04-10 13:46:30 -0400753 fGLInfo = that.fGLInfo;
754 break;
Greg Danielbdf12ad2018-10-12 09:31:11 -0400755 case GrBackendApi::kVulkan:
Greg Danielb4d89562018-10-03 18:44:49 +0000756#ifdef SK_VULKAN
Greg Daniel323fbcf2018-04-10 13:46:30 -0400757 fVkInfo.assign(that.fVkInfo, this->isValid());
Mike Kleina55e2142018-10-03 16:34:11 +0000758#endif
Greg Danielb4d89562018-10-03 18:44:49 +0000759 break;
Stephen White985741a2019-07-18 11:43:45 -0400760#ifdef SK_DAWN
761 case GrBackendApi::kDawn:
762 fDawnInfo = that.fDawnInfo;
763 break;
764#endif
Greg Daniel323fbcf2018-04-10 13:46:30 -0400765#ifdef SK_METAL
Greg Danielbdf12ad2018-10-12 09:31:11 -0400766 case GrBackendApi::kMetal:
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000767 fMtlInfo = that.fMtlInfo;
Greg Daniel323fbcf2018-04-10 13:46:30 -0400768 break;
769#endif
Greg Danielbdf12ad2018-10-12 09:31:11 -0400770 case GrBackendApi::kMock:
Greg Daniel323fbcf2018-04-10 13:46:30 -0400771 fMockInfo = that.fMockInfo;
772 break;
773 default:
774 SK_ABORT("Unknown GrBackend");
775 }
776 fIsValid = that.fIsValid;
777 return *this;
778}
779
Stephen White985741a2019-07-18 11:43:45 -0400780#ifdef SK_DAWN
781bool GrBackendRenderTarget::getDawnImageInfo(GrDawnImageInfo* outInfo) const {
782 if (this->isValid() && GrBackendApi::kDawn == fBackend) {
783 *outInfo = fDawnInfo;
784 return true;
785 }
786 return false;
787}
788#endif
789
Mike Kleina55e2142018-10-03 16:34:11 +0000790bool GrBackendRenderTarget::getVkImageInfo(GrVkImageInfo* outInfo) const {
Greg Danielb4d89562018-10-03 18:44:49 +0000791#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400792 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400793 *outInfo = fVkInfo.snapImageInfo();
794 return true;
795 }
Greg Danielb4d89562018-10-03 18:44:49 +0000796#endif
Greg Daniel323fbcf2018-04-10 13:46:30 -0400797 return false;
798}
799
800void GrBackendRenderTarget::setVkImageLayout(VkImageLayout layout) {
Greg Danielb4d89562018-10-03 18:44:49 +0000801#ifdef SK_VULKAN
Greg Danielbdf12ad2018-10-12 09:31:11 -0400802 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400803 fVkInfo.setImageLayout(layout);
804 }
Greg Danielb4d89562018-10-03 18:44:49 +0000805#endif
Greg Daniel323fbcf2018-04-10 13:46:30 -0400806}
807
Greg Danielb4d89562018-10-03 18:44:49 +0000808#ifdef SK_VULKAN
Brian Salomone2826ab2019-06-04 15:58:31 -0400809sk_sp<GrVkImageLayout> GrBackendRenderTarget::getGrVkImageLayout() const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400810 if (this->isValid() && GrBackendApi::kVulkan == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400811 return fVkInfo.getGrVkImageLayout();
Greg Daniel94403452017-04-18 15:52:36 -0400812 }
813 return nullptr;
814}
Brian Salomone2826ab2019-06-04 15:58:31 -0400815#endif
Greg Daniel94403452017-04-18 15:52:36 -0400816
Timothy Liang4e85e802018-06-28 16:37:18 -0400817#ifdef SK_METAL
818bool GrBackendRenderTarget::getMtlTextureInfo(GrMtlTextureInfo* outInfo) const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400819 if (this->isValid() && GrBackendApi::kMetal == fBackend) {
Jim Van Verth7730d7c2019-05-28 03:03:45 +0000820 *outInfo = fMtlInfo;
Timothy Liang4e85e802018-06-28 16:37:18 -0400821 return true;
822 }
823 return false;
824}
825#endif
826
Greg Daniel323fbcf2018-04-10 13:46:30 -0400827bool GrBackendRenderTarget::getGLFramebufferInfo(GrGLFramebufferInfo* outInfo) const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400828 if (this->isValid() && GrBackendApi::kOpenGL == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400829 *outInfo = fGLInfo;
830 return true;
Greg Daniel94403452017-04-18 15:52:36 -0400831 }
Greg Daniel323fbcf2018-04-10 13:46:30 -0400832 return false;
Greg Daniel94403452017-04-18 15:52:36 -0400833}
834
Robert Phillipsf209e882019-06-25 15:59:50 -0400835GrBackendFormat GrBackendRenderTarget::getBackendFormat() const {
836 if (!this->isValid()) {
837 return GrBackendFormat();
838 }
839 switch (fBackend) {
840#ifdef SK_GL
841 case GrBackendApi::kOpenGL:
842 return GrBackendFormat::MakeGL(fGLInfo.fFormat, GR_GL_TEXTURE_NONE);
843#endif
844#ifdef SK_VULKAN
845 case GrBackendApi::kVulkan: {
846 auto info = fVkInfo.snapImageInfo();
847 if (info.fYcbcrConversionInfo.isValid()) {
Sergey Ulanov2739fd22019-08-11 22:46:33 -0700848 SkASSERT(info.fFormat == info.fYcbcrConversionInfo.fFormat);
Robert Phillipsf209e882019-06-25 15:59:50 -0400849 return GrBackendFormat::MakeVk(info.fYcbcrConversionInfo);
850 }
851 return GrBackendFormat::MakeVk(info.fFormat);
852 }
853#endif
854#ifdef SK_METAL
855 case GrBackendApi::kMetal: {
856 GrMtlTextureInfo mtlInfo;
857 SkAssertResult(this->getMtlTextureInfo(&mtlInfo));
858 return GrBackendFormat::MakeMtl(GrGetMTLPixelFormatFromMtlTextureInfo(mtlInfo));
859 }
860#endif
861 case GrBackendApi::kMock:
Robert Phillipsa5e78be2019-07-09 12:34:38 -0400862 return fMockInfo.getBackendFormat();
Robert Phillipsf209e882019-06-25 15:59:50 -0400863 default:
864 return GrBackendFormat();
865 }
866}
867
Greg Daniel323fbcf2018-04-10 13:46:30 -0400868bool GrBackendRenderTarget::getMockRenderTargetInfo(GrMockRenderTargetInfo* outInfo) const {
Greg Danielbdf12ad2018-10-12 09:31:11 -0400869 if (this->isValid() && GrBackendApi::kMock == fBackend) {
Greg Daniel323fbcf2018-04-10 13:46:30 -0400870 *outInfo = fMockInfo;
871 return true;
Brian Salomon0c51eea2018-03-09 17:02:09 -0500872 }
Greg Daniel323fbcf2018-04-10 13:46:30 -0400873 return false;
Brian Salomon0c51eea2018-03-09 17:02:09 -0500874}
Robert Phillips8caf85f2018-04-05 09:30:38 -0400875
Brian Salomon4456a0d2019-07-18 15:05:11 -0400876bool GrBackendRenderTarget::isProtected() const {
877 if (!this->isValid() || this->backend() != GrBackendApi::kVulkan) {
878 return false;
879 }
880 return fVkInfo.isProtected();
881}
882
Robert Phillips8caf85f2018-04-05 09:30:38 -0400883#if GR_TEST_UTILS
884bool GrBackendRenderTarget::TestingOnly_Equals(const GrBackendRenderTarget& r0,
885 const GrBackendRenderTarget& r1) {
886 if (!r0.isValid() || !r1.isValid()) {
887 return false; // two invalid backend rendertargets are not considered equal
888 }
889
890 if (r0.fWidth != r1.fWidth ||
891 r0.fHeight != r1.fHeight ||
892 r0.fSampleCnt != r1.fSampleCnt ||
893 r0.fStencilBits != r1.fStencilBits ||
Robert Phillips8caf85f2018-04-05 09:30:38 -0400894 r0.fBackend != r1.fBackend) {
895 return false;
896 }
897
898 switch (r0.fBackend) {
Brian Salomone2826ab2019-06-04 15:58:31 -0400899#ifdef SK_GL
900 case GrBackendApi::kOpenGL:
901 return r0.fGLInfo == r1.fGLInfo;
902#endif
903 case GrBackendApi::kMock:
904 return r0.fMockInfo == r1.fMockInfo;
Robert Phillips8caf85f2018-04-05 09:30:38 -0400905#ifdef SK_VULKAN
Brian Salomone2826ab2019-06-04 15:58:31 -0400906 case GrBackendApi::kVulkan:
907 return r0.fVkInfo == r1.fVkInfo;
Robert Phillips8caf85f2018-04-05 09:30:38 -0400908#endif
Timothy Liang4e85e802018-06-28 16:37:18 -0400909#ifdef SK_METAL
Brian Salomone2826ab2019-06-04 15:58:31 -0400910 case GrBackendApi::kMetal:
911 return r0.fMtlInfo == r1.fMtlInfo;
Timothy Liang4e85e802018-06-28 16:37:18 -0400912#endif
Stephen White985741a2019-07-18 11:43:45 -0400913#ifdef SK_DAWN
914 case GrBackendApi::kDawn:
915 return r0.fDawnInfo == r1.fDawnInfo;
916#endif
Brian Salomone2826ab2019-06-04 15:58:31 -0400917 default:
918 return false;
Robert Phillips8caf85f2018-04-05 09:30:38 -0400919 }
920
921 SkASSERT(0);
922 return false;
923}
924#endif