blob: c2edae41ff74caf96e2ac0fcc3fbdbf5556ae5d0 [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 Daniel207282e2017-04-26 13:29:21 -040036 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Greg Daniel7ef28f32017-04-20 16:41:55 +000037 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 Daniel207282e2017-04-26 13:29:21 -040047 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000048 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 Daniela18d2db2017-05-02 11:39:10 -040064 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000065 tex = gpu->wrapBackendTexture(backendTex,
66 kTopLeft_GrSurfaceOrigin,
67 kNone_GrBackendTextureFlag,
68 0,
69 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070070 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +000071 tex = gpu->wrapBackendTexture(backendTex,
72 kTopLeft_GrSurfaceOrigin,
73 kNone_GrBackendTextureFlag,
74 0,
75 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070076 REPORTER_ASSERT(reporter, !tex);
Stan Iliev7fa5c312017-04-19 00:23:39 +000077 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +000078 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -040079 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +000080 tex = gpu->wrapBackendTexture(backendTex,
81 kTopLeft_GrSurfaceOrigin,
82 kNone_GrBackendTextureFlag,
83 0,
84 kAdopt_GrWrapOwnership);
85
jvanverthfd359ca2016-03-18 11:57:24 -070086 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070087
88 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
89}
90
91void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
92 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
93
egdaniel0a3a7f72016-06-24 09:22:31 -070094 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
95 true);
egdanielb2df0c22016-05-13 11:30:37 -070096 const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070097
Greg Danielbcf612b2017-05-01 13:50:58 +000098 GrBackendRenderTarget backendRT(kW, kH, 0, 0, *backendTex);
99
100 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(backendRT, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700101 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700102
103 // image is null
egdanielb2df0c22016-05-13 11:30:37 -0700104 GrVkImageInfo backendCopy = *backendTex;
jvanverthfd359ca2016-03-18 11:57:24 -0700105 backendCopy.fImage = VK_NULL_HANDLE;
Greg Danielbcf612b2017-05-01 13:50:58 +0000106 GrBackendRenderTarget backendRT2(kW, kH, 0, 0, backendCopy);
107 rt = gpu->wrapBackendRenderTarget(backendRT2, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700108 REPORTER_ASSERT(reporter, !rt);
109
110 // alloc is null
111 backendCopy.fImage = backendTex->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700112 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Brian Osman0b791f52017-03-10 08:30:22 -0500113 // can wrap null alloc
Greg Danielbcf612b2017-05-01 13:50:58 +0000114 GrBackendRenderTarget backendRT3(kW, kH, 0, 0, backendCopy);
115 rt = gpu->wrapBackendRenderTarget(backendRT3, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700116 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700117
Greg Danielaf401272017-03-27 16:18:03 -0400118 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
119 // resource when we're done.
120 gpu->deleteTestingOnlyBackendTexture(backendObj, false);
jvanverthfd359ca2016-03-18 11:57:24 -0700121}
122
123void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
124 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
125
egdaniel0a3a7f72016-06-24 09:22:31 -0700126 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
127 true);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000128 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -0700129
Greg Daniel207282e2017-04-26 13:29:21 -0400130 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000131 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
132 kTopLeft_GrSurfaceOrigin,
133 kRenderTarget_GrBackendTextureFlag,
134 0,
135 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700136 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700137
138 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000139 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -0700140 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -0400141 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000142 tex = gpu->wrapBackendTexture(backendTex,
143 kTopLeft_GrSurfaceOrigin,
144 kRenderTarget_GrBackendTextureFlag,
145 0,
146 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700147 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000148 tex = gpu->wrapBackendTexture(backendTex,
149 kTopLeft_GrSurfaceOrigin,
150 kRenderTarget_GrBackendTextureFlag,
151 0,
152 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700153 REPORTER_ASSERT(reporter, !tex);
154
155 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000156 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700157 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -0400158 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000159 tex = gpu->wrapBackendTexture(backendTex,
160 kTopLeft_GrSurfaceOrigin,
161 kRenderTarget_GrBackendTextureFlag,
162 0,
163 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700164 REPORTER_ASSERT(reporter, !tex);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000165 tex = gpu->wrapBackendTexture(backendTex,
166 kTopLeft_GrSurfaceOrigin,
167 kRenderTarget_GrBackendTextureFlag,
168 0,
169 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700170 REPORTER_ASSERT(reporter, !tex);
171
172 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +0000173 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -0400174 backendTex = GrBackendTexture(kW, kH, backendCopy);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000175 tex = gpu->wrapBackendTexture(backendTex,
176 kTopLeft_GrSurfaceOrigin,
177 kRenderTarget_GrBackendTextureFlag,
178 0,
179 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700180 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700181
182 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
183}
184
bsalomondc0fcd42016-04-11 14:21:33 -0700185DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -0700186 wrap_tex_test(reporter, ctxInfo.grContext());
187 wrap_rt_test(reporter, ctxInfo.grContext());
188 wrap_trt_test(reporter, ctxInfo.grContext());
jvanverthfd359ca2016-03-18 11:57:24 -0700189}
190
191#endif