1 /*
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 && defined(SK_VULKAN)
13
14 #include "GrContextPriv.h"
15 #include "GrContextFactory.h"
16 #include "GrRenderTarget.h"
17 #include "GrTest.h"
18 #include "GrTexture.h"
19
20 #include "Test.h"
21 #include "vk/GrVkCaps.h"
22 #include "vk/GrVkGpu.h"
23 #include "vk/GrVkMemory.h"
24 #include "vk/GrVkTypes.h"
25
26 using sk_gpu_test::GrContextFactory;
27
28 const int kW = 1024;
29 const int kH = 1024;
30 const GrPixelConfig kPixelConfig = kRGBA_8888_GrPixelConfig;
31
wrap_tex_test(skiatest::Reporter * reporter,GrContext * context)32 void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) {
33
34 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu());
35
36 GrBackendTexture origBackendTex = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH,
37 kPixelConfig, false,
38 GrMipMapped::kNo);
39 const GrVkImageInfo* imageInfo = origBackendTex.getVkImageInfo();
40
41 sk_sp<GrTexture> tex = gpu->wrapBackendTexture(origBackendTex, kBorrow_GrWrapOwnership);
42 REPORTER_ASSERT(reporter, tex);
43
44 // image is null
45 {
46 GrVkImageInfo backendCopy = *imageInfo;
47 backendCopy.fImage = VK_NULL_HANDLE;
48 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
49 tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership);
50 REPORTER_ASSERT(reporter, !tex);
51 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
52 REPORTER_ASSERT(reporter, !tex);
53 }
54
55 // alloc is null
56 {
57 GrVkImageInfo backendCopy = *imageInfo;
58 backendCopy.fAlloc = GrVkAlloc();
59 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
60 tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership);
61 REPORTER_ASSERT(reporter, !tex);
62 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
63 REPORTER_ASSERT(reporter, !tex);
64 }
65
66 // check adopt creation
67 {
68 GrVkImageInfo backendCopy = *imageInfo;
69 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
70 tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership);
71
72 REPORTER_ASSERT(reporter, tex);
73 }
74
75 gpu->deleteTestingOnlyBackendTexture(&origBackendTex, true);
76 }
77
wrap_rt_test(skiatest::Reporter * reporter,GrContext * context)78 void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) {
79 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu());
80
81 GrBackendTexture origBackendTex = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH,
82 kPixelConfig, true,
83 GrMipMapped::kNo);
84 const GrVkImageInfo* imageInfo = origBackendTex.getVkImageInfo();
85
86 GrBackendRenderTarget origBackendRT(kW, kH, 1, 0, *imageInfo);
87
88 sk_sp<GrRenderTarget> rt = gpu->wrapBackendRenderTarget(origBackendRT);
89 REPORTER_ASSERT(reporter, rt);
90
91 // image is null
92 {
93 GrVkImageInfo backendCopy = *imageInfo;
94 backendCopy.fImage = VK_NULL_HANDLE;
95 GrBackendRenderTarget backendRT(kW, kH, 1, 0, backendCopy);
96 rt = gpu->wrapBackendRenderTarget(backendRT);
97 REPORTER_ASSERT(reporter, !rt);
98 }
99
100 // alloc is null
101 {
102 GrVkImageInfo backendCopy = *imageInfo;
103 backendCopy.fAlloc = GrVkAlloc();
104 // can wrap null alloc
105 GrBackendRenderTarget backendRT(kW, kH, 1, 0, backendCopy);
106 rt = gpu->wrapBackendRenderTarget(backendRT);
107 REPORTER_ASSERT(reporter, rt);
108 }
109
110 // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the
111 // resource when we're done.
112 gpu->deleteTestingOnlyBackendTexture(&origBackendTex);
113 }
114
wrap_trt_test(skiatest::Reporter * reporter,GrContext * context)115 void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) {
116 GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu());
117
118 GrBackendTexture origBackendTex = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH,
119 kPixelConfig, true,
120 GrMipMapped::kNo);
121 const GrVkImageInfo* imageInfo = origBackendTex.getVkImageInfo();
122
123 sk_sp<GrTexture> tex =
124 gpu->wrapRenderableBackendTexture(origBackendTex, 1, kBorrow_GrWrapOwnership);
125 REPORTER_ASSERT(reporter, tex);
126
127 // image is null
128 {
129 GrVkImageInfo backendCopy = *imageInfo;
130 backendCopy.fImage = VK_NULL_HANDLE;
131 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
132 tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership);
133 REPORTER_ASSERT(reporter, !tex);
134 tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership);
135 REPORTER_ASSERT(reporter, !tex);
136 }
137
138 // alloc is null
139 {
140 GrVkImageInfo backendCopy = *imageInfo;
141 backendCopy.fAlloc = GrVkAlloc();
142 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
143 tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership);
144 REPORTER_ASSERT(reporter, !tex);
145 tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership);
146 REPORTER_ASSERT(reporter, !tex);
147 }
148
149 // check adopt creation
150 {
151 GrVkImageInfo backendCopy = *imageInfo;
152 GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy);
153 tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership);
154 REPORTER_ASSERT(reporter, tex);
155 }
156
157 gpu->deleteTestingOnlyBackendTexture(&origBackendTex, true);
158 }
159
DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests,reporter,ctxInfo)160 DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkWrapTests, reporter, ctxInfo) {
161 wrap_tex_test(reporter, ctxInfo.grContext());
162 wrap_rt_test(reporter, ctxInfo.grContext());
163 wrap_trt_test(reporter, ctxInfo.grContext());
164 }
165
166 #endif
167