blob: 44b5e72bc93680175d1f8010aa73f25ac1959ecb [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"
16#include "Test.h"
17#include "vk/GrVkCaps.h"
18#include "vk/GrVkGpu.h"
19#include "vk/GrVkMemory.h"
20#include "vk/GrVkTypes.h"
21
kkinnunen2ae4b2e2016-03-31 08:08:20 -070022using sk_gpu_test::GrContextFactory;
23
jvanverthfd359ca2016-03-18 11:57:24 -070024const int kW = 1024;
25const int kH = 1024;
26const GrPixelConfig kPixelConfig = kRGBA_8888_GrPixelConfig;
27
28void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) {
29
30 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
31
egdaniel0a3a7f72016-06-24 09:22:31 -070032 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
33 false);
Greg Daniel7ef28f32017-04-20 16:41:55 +000034 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070035
Greg Daniel7ef28f32017-04-20 16:41:55 +000036 GrBackendTexture backendTex = GrBackendTexture(kW, kH, imageInfo);
37 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
38 kTopLeft_GrSurfaceOrigin,
39 kNone_GrBackendTextureFlag,
40 0,
41 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070042 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070043
44 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000045 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070046 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel7ef28f32017-04-20 16:41:55 +000047 backendTex = GrBackendTexture(kW, kH, &backendCopy);
48 tex = gpu->wrapBackendTexture(backendTex,
49 kTopLeft_GrSurfaceOrigin,
50 kNone_GrBackendTextureFlag,
51 0,
52 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070053 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +000054 tex = gpu->wrapBackendTexture(backendTex,
55 kTopLeft_GrSurfaceOrigin,
56 kNone_GrBackendTextureFlag,
57 0,
58 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070059 REPORTER_ASSERT(reporter, !tex);
60
61 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000062 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -070063 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniel7ef28f32017-04-20 16:41:55 +000064 tex = gpu->wrapBackendTexture(backendTex,
65 kTopLeft_GrSurfaceOrigin,
66 kNone_GrBackendTextureFlag,
67 0,
68 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070069 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +000070 tex = gpu->wrapBackendTexture(backendTex,
71 kTopLeft_GrSurfaceOrigin,
72 kNone_GrBackendTextureFlag,
73 0,
74 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070075 REPORTER_ASSERT(reporter, !tex);
Stan Iliev7fa5c312017-04-19 00:23:39 +000076 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +000077 backendCopy.fAlloc = imageInfo->fAlloc;
78 tex = gpu->wrapBackendTexture(backendTex,
79 kTopLeft_GrSurfaceOrigin,
80 kNone_GrBackendTextureFlag,
81 0,
82 kAdopt_GrWrapOwnership);
83
jvanverthfd359ca2016-03-18 11:57:24 -070084 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070085
86 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
87}
88
89void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
90 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
91
egdaniel0a3a7f72016-06-24 09:22:31 -070092 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
93 true);
egdanielb2df0c22016-05-13 11:30:37 -070094 const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070095
96 // check basic borrowed creation
97 GrBackendRenderTargetDesc desc;
98 desc.fWidth = kW;
99 desc.fHeight = kH;
100 desc.fConfig = kPixelConfig;
101 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
102 desc.fSampleCnt = 0;
103 desc.fStencilBits = 0;
104 desc.fRenderTargetHandle = backendObj;
Brian Osman0b791f52017-03-10 08:30:22 -0500105 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(desc);
jvanverthfd359ca2016-03-18 11:57:24 -0700106 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700107
108 // image is null
egdanielb2df0c22016-05-13 11:30:37 -0700109 GrVkImageInfo backendCopy = *backendTex;
jvanverthfd359ca2016-03-18 11:57:24 -0700110 backendCopy.fImage = VK_NULL_HANDLE;
111 desc.fRenderTargetHandle = (GrBackendObject)&backendCopy;
Brian Osman0b791f52017-03-10 08:30:22 -0500112 rt = gpu->wrapBackendRenderTarget(desc);
jvanverthfd359ca2016-03-18 11:57:24 -0700113 REPORTER_ASSERT(reporter, !rt);
114
115 // alloc is null
116 backendCopy.fImage = backendTex->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700117 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Brian Osman0b791f52017-03-10 08:30:22 -0500118 // can wrap null alloc
119 rt = gpu->wrapBackendRenderTarget(desc);
jvanverthfd359ca2016-03-18 11:57:24 -0700120 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700121
Greg Danielaf401272017-03-27 16:18:03 -0400122 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
123 // resource when we're done.
124 gpu->deleteTestingOnlyBackendTexture(backendObj, false);
jvanverthfd359ca2016-03-18 11:57:24 -0700125}
126
127void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
128 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
129
egdaniel0a3a7f72016-06-24 09:22:31 -0700130 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
131 true);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000132 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -0700133
Greg Daniel7ef28f32017-04-20 16:41:55 +0000134 GrBackendTexture backendTex = GrBackendTexture(kW, kH, imageInfo);
135 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
136 kTopLeft_GrSurfaceOrigin,
137 kRenderTarget_GrBackendTextureFlag,
138 0,
139 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700140 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700141
142 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000143 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -0700144 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000145 backendTex = GrBackendTexture(kW, kH, &backendCopy);
146 tex = gpu->wrapBackendTexture(backendTex,
147 kTopLeft_GrSurfaceOrigin,
148 kRenderTarget_GrBackendTextureFlag,
149 0,
150 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700151 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000152 tex = gpu->wrapBackendTexture(backendTex,
153 kTopLeft_GrSurfaceOrigin,
154 kRenderTarget_GrBackendTextureFlag,
155 0,
156 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700157 REPORTER_ASSERT(reporter, !tex);
158
159 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000160 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700161 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniel7ef28f32017-04-20 16:41:55 +0000162 tex = gpu->wrapBackendTexture(backendTex,
163 kTopLeft_GrSurfaceOrigin,
164 kRenderTarget_GrBackendTextureFlag,
165 0,
166 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700167 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000168 tex = gpu->wrapBackendTexture(backendTex,
169 kTopLeft_GrSurfaceOrigin,
170 kRenderTarget_GrBackendTextureFlag,
171 0,
172 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700173 REPORTER_ASSERT(reporter, !tex);
174
175 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +0000176 backendCopy.fAlloc = imageInfo->fAlloc;
177 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