blob: bbc3f8d847f3ab762a30c0d750cf2d850f8808fd [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
12#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_VULKAN)
13
14#include "GrContextFactory.h"
15#include "GrTest.h"
Robert Phillips646e4292017-06-13 12:44:56 -040016#include "GrTexture.h"
17
jvanverthfd359ca2016-03-18 11:57:24 -070018#include "Test.h"
19#include "vk/GrVkCaps.h"
20#include "vk/GrVkGpu.h"
21#include "vk/GrVkMemory.h"
22#include "vk/GrVkTypes.h"
23
kkinnunen2ae4b2e2016-03-31 08:08:20 -070024using sk_gpu_test::GrContextFactory;
25
jvanverthfd359ca2016-03-18 11:57:24 -070026const int kW = 1024;
27const int kH = 1024;
28const GrPixelConfig kPixelConfig = kRGBA_8888_GrPixelConfig;
29
30void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) {
31
32 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
33
egdaniel0a3a7f72016-06-24 09:22:31 -070034 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
35 false);
Greg Daniel7ef28f32017-04-20 16:41:55 +000036 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070037
Greg Daniel207282e2017-04-26 13:29:21 -040038 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Greg Daniel7ef28f32017-04-20 16:41:55 +000039 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
40 kTopLeft_GrSurfaceOrigin,
41 kNone_GrBackendTextureFlag,
42 0,
43 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070044 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070045
46 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000047 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070048 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -040049 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000050 tex = gpu->wrapBackendTexture(backendTex,
51 kTopLeft_GrSurfaceOrigin,
52 kNone_GrBackendTextureFlag,
53 0,
54 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070055 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +000056 tex = gpu->wrapBackendTexture(backendTex,
57 kTopLeft_GrSurfaceOrigin,
58 kNone_GrBackendTextureFlag,
59 0,
60 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070061 REPORTER_ASSERT(reporter, !tex);
62
63 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000064 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -070065 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -040066 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000067 tex = gpu->wrapBackendTexture(backendTex,
68 kTopLeft_GrSurfaceOrigin,
69 kNone_GrBackendTextureFlag,
70 0,
71 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070072 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +000073 tex = gpu->wrapBackendTexture(backendTex,
74 kTopLeft_GrSurfaceOrigin,
75 kNone_GrBackendTextureFlag,
76 0,
77 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070078 REPORTER_ASSERT(reporter, !tex);
Stan Iliev7fa5c312017-04-19 00:23:39 +000079 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +000080 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -040081 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000082 tex = gpu->wrapBackendTexture(backendTex,
83 kTopLeft_GrSurfaceOrigin,
84 kNone_GrBackendTextureFlag,
85 0,
86 kAdopt_GrWrapOwnership);
87
jvanverthfd359ca2016-03-18 11:57:24 -070088 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070089
90 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
91}
92
93void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
94 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
95
egdaniel0a3a7f72016-06-24 09:22:31 -070096 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
97 true);
egdanielb2df0c22016-05-13 11:30:37 -070098 const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070099
Greg Danielbcf612b2017-05-01 13:50:58 +0000100 GrBackendRenderTarget backendRT(kW, kH, 0, 0, *backendTex);
101
102 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(backendRT, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700103 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700104
105 // image is null
egdanielb2df0c22016-05-13 11:30:37 -0700106 GrVkImageInfo backendCopy = *backendTex;
jvanverthfd359ca2016-03-18 11:57:24 -0700107 backendCopy.fImage = VK_NULL_HANDLE;
Greg Danielbcf612b2017-05-01 13:50:58 +0000108 GrBackendRenderTarget backendRT2(kW, kH, 0, 0, backendCopy);
109 rt = gpu->wrapBackendRenderTarget(backendRT2, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700110 REPORTER_ASSERT(reporter, !rt);
111
112 // alloc is null
113 backendCopy.fImage = backendTex->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700114 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Brian Osman0b791f52017-03-10 08:30:22 -0500115 // can wrap null alloc
Greg Danielbcf612b2017-05-01 13:50:58 +0000116 GrBackendRenderTarget backendRT3(kW, kH, 0, 0, backendCopy);
117 rt = gpu->wrapBackendRenderTarget(backendRT3, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700118 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700119
Greg Danielaf401272017-03-27 16:18:03 -0400120 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
121 // resource when we're done.
122 gpu->deleteTestingOnlyBackendTexture(backendObj, false);
jvanverthfd359ca2016-03-18 11:57:24 -0700123}
124
125void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
126 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
127
egdaniel0a3a7f72016-06-24 09:22:31 -0700128 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
129 true);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000130 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -0700131
Greg Daniel207282e2017-04-26 13:29:21 -0400132 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000133 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
134 kTopLeft_GrSurfaceOrigin,
135 kRenderTarget_GrBackendTextureFlag,
136 0,
137 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700138 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700139
140 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000141 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -0700142 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -0400143 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000144 tex = gpu->wrapBackendTexture(backendTex,
145 kTopLeft_GrSurfaceOrigin,
146 kRenderTarget_GrBackendTextureFlag,
147 0,
148 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700149 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000150 tex = gpu->wrapBackendTexture(backendTex,
151 kTopLeft_GrSurfaceOrigin,
152 kRenderTarget_GrBackendTextureFlag,
153 0,
154 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700155 REPORTER_ASSERT(reporter, !tex);
156
157 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000158 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700159 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -0400160 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000161 tex = gpu->wrapBackendTexture(backendTex,
162 kTopLeft_GrSurfaceOrigin,
163 kRenderTarget_GrBackendTextureFlag,
164 0,
165 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700166 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000167 tex = gpu->wrapBackendTexture(backendTex,
168 kTopLeft_GrSurfaceOrigin,
169 kRenderTarget_GrBackendTextureFlag,
170 0,
171 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700172 REPORTER_ASSERT(reporter, !tex);
173
174 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +0000175 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -0400176 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000177 tex = gpu->wrapBackendTexture(backendTex,
178 kTopLeft_GrSurfaceOrigin,
179 kRenderTarget_GrBackendTextureFlag,
180 0,
181 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700182 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700183
184 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
185}
186
bsalomondc0fcd42016-04-11 14:21:33 -0700187DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -0700188 wrap_tex_test(reporter, ctxInfo.grContext());
189 wrap_rt_test(reporter, ctxInfo.grContext());
190 wrap_trt_test(reporter, ctxInfo.grContext());
jvanverthfd359ca2016-03-18 11:57:24 -0700191}
192
193#endif