blob: 4f4c83362f2f47fa5ea65eba0ab54a650bed1126 [file] [log] [blame]
jvanverthfd359ca2016-03-18 11:57:24 -07001/*
2 * Copyright 2016 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// This is a GPU-backend specific test. It relies on static intializers to work
9
10#include "SkTypes.h"
11
Jim Van Verth91589312017-06-22 12:52:46 -040012#if SK_SUPPORT_GPU && defined(SK_VULKAN)
jvanverthfd359ca2016-03-18 11:57:24 -070013
14#include "GrContextFactory.h"
Robert Phillips2890fbf2017-07-26 15:48:41 -040015#include "GrRenderTarget.h"
jvanverthfd359ca2016-03-18 11:57:24 -070016#include "GrTest.h"
Robert Phillips646e4292017-06-13 12:44:56 -040017#include "GrTexture.h"
18
jvanverthfd359ca2016-03-18 11:57:24 -070019#include "Test.h"
20#include "vk/GrVkCaps.h"
21#include "vk/GrVkGpu.h"
22#include "vk/GrVkMemory.h"
23#include "vk/GrVkTypes.h"
24
kkinnunen2ae4b2e2016-03-31 08:08:20 -070025using sk_gpu_test::GrContextFactory;
26
jvanverthfd359ca2016-03-18 11:57:24 -070027const int kW = 1024;
28const int kH = 1024;
29const GrPixelConfig kPixelConfig = kRGBA_8888_GrPixelConfig;
30
31void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) {
32
33 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
34
egdaniel0a3a7f72016-06-24 09:22:31 -070035 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
36 false);
Greg Daniel7ef28f32017-04-20 16:41:55 +000037 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070038
Greg Daniel207282e2017-04-26 13:29:21 -040039 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040040 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070041 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070042
43 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000044 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070045 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -040046 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040047 tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070048 REPORTER_ASSERT(reporter, !tex);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040049 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070050 REPORTER_ASSERT(reporter, !tex);
51
52 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000053 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -070054 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -040055 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040056 tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070057 REPORTER_ASSERT(reporter, !tex);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040058 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070059 REPORTER_ASSERT(reporter, !tex);
Stan Iliev7fa5c312017-04-19 00:23:39 +000060 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +000061 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -040062 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040063 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
Greg Daniel7ef28f32017-04-20 16:41:55 +000064
jvanverthfd359ca2016-03-18 11:57:24 -070065 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070066
67 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
68}
69
70void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
71 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
72
egdaniel0a3a7f72016-06-24 09:22:31 -070073 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
74 true);
egdanielb2df0c22016-05-13 11:30:37 -070075 const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070076
Greg Danielbcf612b2017-05-01 13:50:58 +000077 GrBackendRenderTarget backendRT(kW, kH, 0, 0, *backendTex);
78
Robert Phillipsb0e93a22017-08-29 08:26:54 -040079 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(backendRT);
jvanverthfd359ca2016-03-18 11:57:24 -070080 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -070081
82 // image is null
egdanielb2df0c22016-05-13 11:30:37 -070083 GrVkImageInfo backendCopy = *backendTex;
jvanverthfd359ca2016-03-18 11:57:24 -070084 backendCopy.fImage = VK_NULL_HANDLE;
Greg Danielbcf612b2017-05-01 13:50:58 +000085 GrBackendRenderTarget backendRT2(kW, kH, 0, 0, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040086 rt = gpu->wrapBackendRenderTarget(backendRT2);
jvanverthfd359ca2016-03-18 11:57:24 -070087 REPORTER_ASSERT(reporter, !rt);
88
89 // alloc is null
90 backendCopy.fImage = backendTex->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -070091 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Brian Osman0b791f52017-03-10 08:30:22 -050092 // can wrap null alloc
Greg Danielbcf612b2017-05-01 13:50:58 +000093 GrBackendRenderTarget backendRT3(kW, kH, 0, 0, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -040094 rt = gpu->wrapBackendRenderTarget(backendRT3);
jvanverthfd359ca2016-03-18 11:57:24 -070095 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -070096
Greg Danielaf401272017-03-27 16:18:03 -040097 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
98 // resource when we're done.
99 gpu->deleteTestingOnlyBackendTexture(backendObj, false);
jvanverthfd359ca2016-03-18 11:57:24 -0700100}
101
102void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
103 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
104
egdaniel0a3a7f72016-06-24 09:22:31 -0700105 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
106 true);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000107 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -0700108
Greg Daniel207282e2017-04-26 13:29:21 -0400109 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400110 sk_sp<GrTexture> tex = gpu->wrapRenderableBackendTexture(backendTex, 0,
Brian Salomond17f6582017-07-19 18:28:58 -0400111 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700112 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700113
114 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000115 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -0700116 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -0400117 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400118 tex = gpu->wrapRenderableBackendTexture(backendTex, 0, kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700119 REPORTER_ASSERT(reporter, !tex);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400120 tex = gpu->wrapRenderableBackendTexture(backendTex, 0, kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700121 REPORTER_ASSERT(reporter, !tex);
122
123 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000124 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700125 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -0400126 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400127 tex = gpu->wrapRenderableBackendTexture(backendTex, 0, kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700128 REPORTER_ASSERT(reporter, !tex);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400129 tex = gpu->wrapRenderableBackendTexture(backendTex, 0, kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700130 REPORTER_ASSERT(reporter, !tex);
131
132 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +0000133 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -0400134 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400135 tex = gpu->wrapRenderableBackendTexture(backendTex, 0, kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700136 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700137
138 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
139}
140
bsalomondc0fcd42016-04-11 14:21:33 -0700141DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -0700142 wrap_tex_test(reporter, ctxInfo.grContext());
143 wrap_rt_test(reporter, ctxInfo.grContext());
144 wrap_trt_test(reporter, ctxInfo.grContext());
jvanverthfd359ca2016-03-18 11:57:24 -0700145}
146
147#endif