blob: f64043df6278857f0c6b15c7e7477ec73f21e37d [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 Phillips7294b852017-08-01 13:51:44 +000040 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(backendTex,
41 kTopLeft_GrSurfaceOrigin,
42 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070043 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070044
45 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000046 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070047 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -040048 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +000049 tex = gpu->wrapBackendTexture(backendTex,
50 kTopLeft_GrSurfaceOrigin,
51 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070052 REPORTER_ASSERT(reporter, !tex);
Robert Phillips7294b852017-08-01 13:51:44 +000053 tex = gpu->wrapBackendTexture(backendTex,
54 kTopLeft_GrSurfaceOrigin,
55 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070056 REPORTER_ASSERT(reporter, !tex);
57
58 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +000059 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -070060 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -040061 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +000062 tex = gpu->wrapBackendTexture(backendTex,
63 kTopLeft_GrSurfaceOrigin,
64 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070065 REPORTER_ASSERT(reporter, !tex);
Robert Phillips7294b852017-08-01 13:51:44 +000066 tex = gpu->wrapBackendTexture(backendTex,
67 kTopLeft_GrSurfaceOrigin,
68 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -070069 REPORTER_ASSERT(reporter, !tex);
Stan Iliev7fa5c312017-04-19 00:23:39 +000070 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +000071 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -040072 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +000073 tex = gpu->wrapBackendTexture(backendTex,
74 kTopLeft_GrSurfaceOrigin,
75 kAdopt_GrWrapOwnership);
Greg Daniel7ef28f32017-04-20 16:41:55 +000076
jvanverthfd359ca2016-03-18 11:57:24 -070077 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -070078
79 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
80}
81
82void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
83 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
84
egdaniel0a3a7f72016-06-24 09:22:31 -070085 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
86 true);
egdanielb2df0c22016-05-13 11:30:37 -070087 const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -070088
Greg Danielbcf612b2017-05-01 13:50:58 +000089 GrBackendRenderTarget backendRT(kW, kH, 0, 0, *backendTex);
90
Robert Phillips7294b852017-08-01 13:51:44 +000091 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(backendRT, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -070092 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -070093
94 // image is null
egdanielb2df0c22016-05-13 11:30:37 -070095 GrVkImageInfo backendCopy = *backendTex;
jvanverthfd359ca2016-03-18 11:57:24 -070096 backendCopy.fImage = VK_NULL_HANDLE;
Greg Danielbcf612b2017-05-01 13:50:58 +000097 GrBackendRenderTarget backendRT2(kW, kH, 0, 0, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +000098 rt = gpu->wrapBackendRenderTarget(backendRT2, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -070099 REPORTER_ASSERT(reporter, !rt);
100
101 // alloc is null
102 backendCopy.fImage = backendTex->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700103 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Brian Osman0b791f52017-03-10 08:30:22 -0500104 // can wrap null alloc
Greg Danielbcf612b2017-05-01 13:50:58 +0000105 GrBackendRenderTarget backendRT3(kW, kH, 0, 0, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +0000106 rt = gpu->wrapBackendRenderTarget(backendRT3, kTopLeft_GrSurfaceOrigin);
jvanverthfd359ca2016-03-18 11:57:24 -0700107 REPORTER_ASSERT(reporter, rt);
jvanverthfd359ca2016-03-18 11:57:24 -0700108
Greg Danielaf401272017-03-27 16:18:03 -0400109 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
110 // resource when we're done.
111 gpu->deleteTestingOnlyBackendTexture(backendObj, false);
jvanverthfd359ca2016-03-18 11:57:24 -0700112}
113
114void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
115 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
116
egdaniel0a3a7f72016-06-24 09:22:31 -0700117 GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig,
118 true);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000119 const GrVkImageInfo* imageInfo = reinterpret_cast<const GrVkImageInfo*>(backendObj);
jvanverthfd359ca2016-03-18 11:57:24 -0700120
Greg Daniel207282e2017-04-26 13:29:21 -0400121 GrBackendTexture backendTex = GrBackendTexture(kW, kH, *imageInfo);
Robert Phillips7294b852017-08-01 13:51:44 +0000122 sk_sp<GrTexture> tex = gpu->wrapRenderableBackendTexture(backendTex,
123 kTopLeft_GrSurfaceOrigin,
124 0,
Brian Salomond17f6582017-07-19 18:28:58 -0400125 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700126 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700127
128 // image is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000129 GrVkImageInfo backendCopy = *imageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -0700130 backendCopy.fImage = VK_NULL_HANDLE;
Greg Daniel207282e2017-04-26 13:29:21 -0400131 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +0000132 tex = gpu->wrapRenderableBackendTexture(backendTex,
133 kTopLeft_GrSurfaceOrigin,
134 0,
135 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700136 REPORTER_ASSERT(reporter, !tex);
Robert Phillips7294b852017-08-01 13:51:44 +0000137 tex = gpu->wrapRenderableBackendTexture(backendTex,
138 kTopLeft_GrSurfaceOrigin,
139 0,
140 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700141 REPORTER_ASSERT(reporter, !tex);
142
143 // alloc is null
Greg Daniel7ef28f32017-04-20 16:41:55 +0000144 backendCopy.fImage = imageInfo->fImage;
jvanverth65b8cb02016-09-20 13:18:00 -0700145 backendCopy.fAlloc = { VK_NULL_HANDLE, 0, 0, 0 };
Greg Daniela18d2db2017-05-02 11:39:10 -0400146 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +0000147 tex = gpu->wrapRenderableBackendTexture(backendTex,
148 kTopLeft_GrSurfaceOrigin,
149 0,
150 kBorrow_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700151 REPORTER_ASSERT(reporter, !tex);
Robert Phillips7294b852017-08-01 13:51:44 +0000152 tex = gpu->wrapRenderableBackendTexture(backendTex,
153 kTopLeft_GrSurfaceOrigin,
154 0,
155 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700156 REPORTER_ASSERT(reporter, !tex);
157
158 // check adopt creation
Greg Daniel7ef28f32017-04-20 16:41:55 +0000159 backendCopy.fAlloc = imageInfo->fAlloc;
Greg Daniela18d2db2017-05-02 11:39:10 -0400160 backendTex = GrBackendTexture(kW, kH, backendCopy);
Robert Phillips7294b852017-08-01 13:51:44 +0000161 tex = gpu->wrapRenderableBackendTexture(backendTex,
162 kTopLeft_GrSurfaceOrigin,
163 0,
164 kAdopt_GrWrapOwnership);
jvanverthfd359ca2016-03-18 11:57:24 -0700165 REPORTER_ASSERT(reporter, tex);
jvanverthfd359ca2016-03-18 11:57:24 -0700166
167 gpu->deleteTestingOnlyBackendTexture(backendObj, true);
168}
169
bsalomondc0fcd42016-04-11 14:21:33 -0700170DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -0700171 wrap_tex_test(reporter, ctxInfo.grContext());
172 wrap_rt_test(reporter, ctxInfo.grContext());
173 wrap_trt_test(reporter, ctxInfo.grContext());
jvanverthfd359ca2016-03-18 11:57:24 -0700174}
175
176#endif